Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Ottimizza le prestazioni di TensorFlow utilizzando il profiler

Utilizza gli strumenti disponibili con Profiler per monitorare le prestazioni dei tuoi modelli TensorFlow. Scopri le prestazioni del tuo modello sull'host (CPU), sul dispositivo (GPU) o su una combinazione di host e dispositivi.

La profilazione ti aiuta a comprendere il consumo di risorse hardware (tempo e memoria) delle varie operazioni (op) TensorFlow nel tuo modello, a risolvere i colli di bottiglia delle prestazioni e, in definitiva, a rendere il modello più veloce.

Questa guida illustrerà come installare Profiler, i vari strumenti disponibili, le diverse modalità di raccolta dei dati sulle prestazioni da parte di Profiler e alcune best practice consigliate per ottimizzare le prestazioni del modello.

Se desideri profilare le prestazioni del tuo modello su Cloud TPU, fai riferimento alla guida di Cloud TPU .

Installa i prerequisiti di Profiler e GPU

Installa il Profiler scaricando ed eseguendo lo script install_and_run.py dal repository GitHub .

Per profilare sulla GPU, devi:

  1. Soddisfa i driver della GPU NVIDIA® e i requisiti del toolkit CUDA® elencati nei requisiti del software di supporto della GPU TensorFlow .
  2. Assicurati che CUPTI esista sul percorso:

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

Se non hai CUPTI sul percorso, anteponi la sua directory di installazione alla variabile $LD_LIBRARY_PATH ambiente $LD_LIBRARY_PATH eseguendo:

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

Eseguire nuovamente il comando ldconfig sopra per verificare che la libreria CUPTI sia stata trovata.

Risolvi i problemi di privilegio

Quando esegui la profilazione con CUDA® Toolkit in un ambiente Docker o su Linux, potresti riscontrare problemi relativi a privilegi CUPTI insufficienti ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). Consulta i documenti per sviluppatori NVIDIA per saperne di più su come risolvere questi problemi su Linux.

Per risolvere i problemi di privilegio CUPTI in un ambiente Docker, esegui

docker run option '--privileged=true'

Strumenti del profiler

Accedi al Profiler dalla scheda Profilo in TensorBoard che appare solo dopo aver acquisito alcuni dati del modello.

Il Profiler ha una selezione di strumenti per aiutare con l'analisi delle prestazioni:

  • Pagina Panoramica
  • Analizzatore di pipeline di input
  • Statistiche TensorFlow
  • Visualizzatore di tracce
  • Statistiche del kernel della GPU
  • Strumento di profilo di memoria
  • Visualizzatore pod

Pagina Panoramica

La pagina della panoramica fornisce una visualizzazione di primo livello delle prestazioni del modello durante un'esecuzione del profilo. La pagina mostra una pagina di panoramica aggregata per l'host e tutti i dispositivi e alcuni consigli per migliorare le prestazioni di addestramento del modello. Puoi anche selezionare singoli host nel menu a discesa Host.

La pagina di panoramica visualizza i dati come segue:

Immagine

  • Riepilogo delle prestazioni: visualizza un riepilogo di alto livello delle prestazioni del modello. Il riepilogo delle prestazioni è composto da due parti:

    1. Ripartizione del tempo di passaggio: suddivide il tempo di passaggio medio in più categorie in cui viene trascorso il tempo:

      • Compilazione: tempo impiegato per compilare i kernel
      • Input: tempo impiegato per leggere i dati di input
      • Output: tempo impiegato per leggere i dati di output
      • Avvio del kernel: tempo impiegato dall'host per avviare i kernel
      • Tempo di calcolo dell'host
      • Tempo di comunicazione da dispositivo a dispositivo
      • Tempo di elaborazione sul dispositivo
      • Tutti gli altri, incluso l'overhead di Python
    2. Precisioni di calcolo del dispositivo: riporta la percentuale del tempo di calcolo del dispositivo che utilizza calcoli a 16 e 32 bit

  • Grafico del tempo di passo : visualizza un grafico del tempo di passo del dispositivo (in millisecondi) su tutti i passi campionati. Ogni passaggio è suddiviso in più categorie (con colori diversi) in cui viene trascorso il tempo. L'area rossa corrisponde alla parte del tempo di passaggio in cui i dispositivi sono rimasti inattivi in ​​attesa di dati di input dall'host. L'area verde mostra quanto tempo il dispositivo ha funzionato effettivamente

  • Prime 10 operazioni TensorFlow sul dispositivo: visualizza le operazioni sul dispositivo che sono state eseguite più a lungo.

    Ogni riga mostra il tempo personale di un'operazione (come la percentuale di tempo impiegato da tutte le operazioni), il tempo cumulativo, la categoria e il nome.

  • Ambiente di esecuzione: visualizza un riepilogo di alto livello dell'ambiente di esecuzione del modello, tra cui:

    • Numero di host utilizzati
    • Tipo di dispositivo (GPU / TPU)
    • Numero di core del dispositivo
  • Raccomandazione per i passaggi successivi: segnala quando un modello è associato all'input e consiglia gli strumenti che è possibile utilizzare per individuare e risolvere i colli di bottiglia delle prestazioni del modello

Analizzatore di pipeline di input

Quando un programma TensorFlow legge i dati da un file, inizia nella parte superiore del grafico TensorFlow in modo pipeline. Il processo di lettura è suddiviso in più fasi di elaborazione dati collegate in serie, dove l'uscita di una fase è l'ingresso a quella successiva. Questo sistema di lettura dei dati è chiamato pipeline di input .

Una tipica pipeline per la lettura dei record dai file prevede le fasi seguenti:

  1. Lettura di file
  2. Preelaborazione dei file (opzionale)
  3. Trasferimento di file dall'host al dispositivo

Una pipeline di input inefficiente può rallentare notevolmente l'applicazione. Un'applicazione è considerata vincolata all'input quando trascorre una parte significativa del tempo nella pipeline di input. Usa le informazioni ottenute dall'analizzatore della pipeline di input per capire dove la pipeline di input è inefficiente.

L'analizzatore della pipeline di input ti dice immediatamente se il tuo programma è vincolato all'input e ti guida attraverso l'analisi lato dispositivo e host per eseguire il debug dei colli di bottiglia delle prestazioni in qualsiasi fase della pipeline di input.

Consulta le indicazioni sulle prestazioni della pipeline di input per le best practice consigliate per ottimizzare le pipeline di input dei dati.

Dashboard della pipeline di input

Per aprire l'analizzatore della pipeline di input, selezionare Profilo , quindi selezionare input_pipeline_analyzer dal menu a discesa Strumenti .

Immagine

La dashboard contiene tre sezioni:

  1. Riepilogo: riepiloga la pipeline di input complessiva con informazioni sul fatto che l'applicazione sia vincolata all'input e, in tal caso, in base a quanto
  2. Analisi lato dispositivo: visualizza i risultati dettagliati dell'analisi lato dispositivo, incluso il tempo di passaggio del dispositivo e l'intervallo di tempo trascorso dal dispositivo in attesa dei dati di input tra i core in ogni fase
  3. Analisi lato host: mostra un'analisi dettagliata sul lato host, inclusa una ripartizione del tempo di elaborazione dell'input sull'host

Riepilogo della pipeline di input

Il riepilogo segnala se il programma è vincolato all'input presentando la percentuale di tempo trascorso dal dispositivo in attesa dell'input dall'host. Se si utilizza una pipeline di input standard che è stata strumentata, lo strumento segnala dove viene spesa la maggior parte del tempo di elaborazione dell'input.

Analisi lato dispositivo

L'analisi lato dispositivo fornisce informazioni dettagliate sul tempo trascorso sul dispositivo rispetto all'host e sul tempo trascorso dal dispositivo in attesa dei dati di input dall'host.

  1. Tempo di passo tracciato rispetto al numero di passo - Visualizza un grafico del tempo di passo del dispositivo (in millisecondi) su tutti i passi campionati. Ogni passaggio è suddiviso in più categorie (con colori diversi) in cui viene trascorso il tempo. L'area rossa corrisponde alla parte del tempo di passaggio in cui i dispositivi sono rimasti inattivi in ​​attesa di dati di input dall'host. L'area verde mostra quanto tempo il dispositivo ha funzionato effettivamente
  2. Statistiche del tempo di passo - Riporta la media, la deviazione standard e l'intervallo ([minimo, massimo]) del tempo di passo del dispositivo

Analisi lato host

L'analisi lato host riporta una suddivisione del tempo di elaborazione dell'input (il tempo trascorso su tf.data API tf.data ) sull'host in diverse categorie:

  • Lettura dei dati dai file su richiesta: tempo impiegato per leggere i dati dai file senza memorizzazione nella cache, prelettura e interleaving
  • Lettura anticipata dei dati dai file: tempo impiegato per leggere i file, inclusi il caching, il precaricamento e l'interleaving
  • Pre-elaborazione dei dati: tempo speso per operazioni di pre-elaborazione, come la decompressione delle immagini
  • Accodamento dei dati da trasferire al dispositivo: tempo impiegato per inserire i dati in una coda di alimentazione prima di trasferire i dati al dispositivo

Espandi le statistiche sulle operazioni di input per visualizzare le statistiche per le singole operazioni di input e le loro categorie suddivise per tempo di esecuzione.

Immagine

Viene visualizzata una tabella dei dati di origine con ciascuna voce contenente le seguenti informazioni:

  1. Input Op: mostra il nome dell'operazione TensorFlow dell'operazione di input
  2. Conteggio: mostra il numero totale di istanze di esecuzione dell'operazione durante il periodo di profilazione
  3. Tempo totale (in ms): mostra la somma cumulativa del tempo trascorso su ciascuna di queste istanze
  4. % Tempo totale: mostra il tempo totale impiegato per un'operazione come frazione del tempo totale impiegato per l'elaborazione dell'input
  5. Tempo di autonomia totale (in ms): mostra la somma cumulativa del tempo di autonomia trascorso su ciascuna di queste istanze. Il tempo personale qui misura il tempo trascorso all'interno del corpo della funzione, escluso il tempo trascorso nella funzione che chiama.
  6. % Autonomia totale . Mostra il tempo totale di autonomia come frazione del tempo totale impiegato per l'elaborazione dell'input
  7. Categoria . Mostra la categoria di elaborazione dell'operazione di input

Statistiche TensorFlow

Lo strumento TensorFlow Stats mostra le prestazioni di ogni operazione TensorFlow eseguita sull'host o sul dispositivo durante una sessione di profilazione.

Immagine

Lo strumento visualizza le informazioni sulle prestazioni in due riquadri:

  • Il riquadro superiore mostra fino a quattro grafici a torta:

    1. La distribuzione del tempo di autoesecuzione di ogni operazione sull'host
    2. La distribuzione del tempo di autoesecuzione di ciascun tipo di operazione sull'host
    3. La distribuzione del tempo di autoesecuzione di ogni operazione sul dispositivo
    4. La distribuzione del tempo di autoesecuzione di ogni tipo di operazione sul dispositivo
  • Il riquadro inferiore mostra una tabella che riporta i dati sulle operazioni TensorFlow con una riga per ogni operazione e una colonna per ogni tipo di dati (ordinare le colonne facendo clic sull'intestazione della colonna). Fare clic sul pulsante Esporta come CSV sul lato destro del riquadro superiore per esportare i dati da questa tabella come file CSV.

    Nota che:

    • Se alcune operazioni hanno operazioni secondarie:

      • Il tempo totale "accumulato" di un'operazione include il tempo trascorso all'interno delle operazioni secondarie

      • Il tempo totale "personale" di un'operazione non include il tempo trascorso all'interno delle operazioni figlio

    • Se un'operazione viene eseguita sull'host:

      • La percentuale del tempo totale di autonomia sul dispositivo sostenuta dall'operazione sarà 0
      • La percentuale cumulativa del tempo totale di autonomia sul dispositivo fino a questa operazione inclusa sarà 0
    • Se viene eseguita un'operazione sul dispositivo:

      • La percentuale di autonomia totale sull'host sostenuta da questa operazione sarà 0
      • La percentuale cumulativa del tempo totale di autonomia sull'host fino a questa operazione inclusa sarà 0

È possibile scegliere di includere o escludere il tempo di inattività nei grafici a torta e nella tabella.

Visualizzatore di tracce

Il visualizzatore di tracce mostra una sequenza temporale che mostra:

  • Durate per le operazioni eseguite dal tuo modello TensorFlow
  • Quale parte del sistema (host o dispositivo) ha eseguito un'operazione. In genere, l'host esegue operazioni di input, preelabora i dati di addestramento e li trasferisce al dispositivo, mentre il dispositivo esegue l'effettivo addestramento del modello

Il visualizzatore di tracce consente di identificare i problemi di prestazioni nel modello, quindi eseguire le operazioni per risolverli. Ad esempio, a un livello elevato, è possibile identificare se l'addestramento di input o modello richiede la maggior parte del tempo. Analizzando in dettaglio, puoi identificare le operazioni che richiedono più tempo per essere eseguite. Tieni presente che il visualizzatore di tracce è limitato a 1 milione di eventi per dispositivo.

Interfaccia del visualizzatore di tracce

Quando apri il visualizzatore di tracce, appare la tua corsa più recente:

Immagine

Questa schermata contiene i seguenti elementi principali:

  1. Riquadro sequenza temporale: mostra le operazioni che il dispositivo e l'host hanno eseguito nel tempo
  2. Riquadro Dettagli: mostra informazioni aggiuntive per le operazioni selezionate nel riquadro Timeline

Il riquadro Timeline contiene i seguenti elementi:

  1. Barra superiore - Contiene vari controlli ausiliari
  2. Asse temporale: mostra il tempo relativo all'inizio della traccia
  3. Sezione ed etichette delle tracce: ogni sezione contiene più tracce e ha un triangolo a sinistra su cui puoi fare clic per espandere e comprimere la sezione. C'è una sezione per ogni elemento di elaborazione nel sistema
  4. Selettore strumento: contiene vari strumenti per interagire con il visualizzatore di tracce come Zoom, Panoramica, Seleziona e Tempistica. Utilizzare lo strumento Tempistica per contrassegnare un intervallo di tempo.
  5. Eventi: mostrano il tempo durante il quale è stata eseguita un'operazione o la durata dei meta-eventi, come le fasi di addestramento
Sezioni e tracce

Il visualizzatore di tracce contiene le seguenti sezioni:

  • Una sezione per ogni nodo del dispositivo , etichettato con il numero del chip del dispositivo e il nodo del dispositivo all'interno del chip (ad esempio, /device:GPU:0 (pid 0) ). Ogni sezione del nodo del dispositivo contiene le seguenti tracce:
    • Passaggio: mostra la durata dei passaggi di allenamento in esecuzione sul dispositivo
    • TensorFlow Ops - . Mostra le operazioni eseguite sul dispositivo
    • XLA Ops: mostra le operazioni XLA (op) eseguite sul dispositivo se XLA è il compilatore utilizzato (ogni operazione TensorFlow è tradotta in una o più operazioni XLA. Il compilatore XLA traduce le operazioni XLA in codice che viene eseguito sul dispositivo).
  • Una sezione per i thread in esecuzione sulla CPU della macchina host, denominata "Host Threads" . La sezione contiene una traccia per ogni thread della CPU. Tieni presente che puoi ignorare le informazioni visualizzate accanto alle etichette della sezione.
Eventi

Gli eventi all'interno della sequenza temporale vengono visualizzati in diversi colori; i colori stessi non hanno un significato specifico.

Il visualizzatore di tracce può anche visualizzare tracce di chiamate di funzione Python nel programma TensorFlow. Se si utilizza l'API tf.profiler.experimental.start() , è possibile abilitare la traccia Python utilizzando ProfilerOptions namedtuple all'avvio della profilazione. In alternativa, se si utilizza la modalità di campionamento per la creazione di profili, è possibile selezionare il livello di traccia utilizzando le opzioni a discesa nella finestra di dialogo Cattura profilo .

Immagine

Statistiche del kernel della GPU

Questo strumento mostra le statistiche sulle prestazioni e l'operazione di origine per ogni kernel accelerato dalla GPU.

Immagine

Lo strumento visualizza le informazioni in due riquadri:

  • Il riquadro superiore mostra un grafico a torta che mostra i kernel CUDA che hanno il tempo totale trascorso più alto

  • Il riquadro inferiore mostra una tabella con i seguenti dati per ogni coppia kernel-op univoca:

    • Un rango in ordine decrescente della durata totale della GPU trascorsa raggruppata per coppia kernel-op
    • Il nome del kernel avviato
    • Il numero di registri GPU utilizzati dal kernel
    • La dimensione totale della memoria condivisa (statica + dinamica condivisa) utilizzata in byte
    • La dimensione del blocco espressa come blockDim.x, blockDim.y, blockDim.z
    • Le dimensioni della griglia espresse come gridDim.x, gridDim.y, gridDim.z
    • Indica se l'operazione è idonea a utilizzare TensorCores
    • Se il kernel contiene istruzioni TensorCore
    • Il nome dell'operatore che ha lanciato questo kernel
    • Il numero di occorrenze di questa coppia kernel-op
    • Il tempo totale della GPU trascorso in microsecondi
    • Il tempo medio trascorso dalla GPU in microsecondi
    • Il tempo GPU minimo trascorso in microsecondi
    • Il tempo GPU massimo trascorso in microsecondi

Strumento di profilo di memoria

Lo strumento Memory Profile monitora l'utilizzo della memoria del dispositivo durante l'intervallo di creazione del profilo. Puoi utilizzare questo strumento per:

  • Esegui il debug dei problemi di memoria esaurita (OOM) individuando il picco di utilizzo della memoria e l'allocazione di memoria corrispondente alle operazioni di TensorFlow. È inoltre possibile eseguire il debug dei problemi OOM che possono sorgere quando si esegue l'inferenza multi-tenancy
  • Eseguire il debug dei problemi di frammentazione della memoria

Lo strumento del profilo di memoria visualizza i dati in tre sezioni:

  1. Riepilogo del profilo di memoria
  2. Grafico della sequenza temporale della memoria
  3. Tabella di ripartizione della memoria

Riepilogo del profilo di memoria

Questa sezione mostra un riepilogo di alto livello del profilo di memoria del programma TensorFlow come mostrato di seguito:

Il riepilogo del profilo di memoria ha sei campi:

  1. ID memoria: elenco a discesa che elenca tutti i sistemi di memoria del dispositivo disponibili. Seleziona il sistema di memoria che desideri visualizzare dal menu a discesa
  2. #Allocation - Il numero di allocazioni di memoria effettuate durante l'intervallo di profiling
  3. #Deallocation - Il numero di deallocazioni di memoria nell'intervallo di profiling
  4. Capacità di memoria: la capacità totale (in GiB) del sistema di memoria selezionato
  5. Picco di utilizzo dell'heap: il picco di utilizzo della memoria (in GiB) dall'inizio dell'esecuzione del modello
  6. Utilizzo massimo della memoria: l'utilizzo massimo della memoria (in GiB) nell'intervallo di profiling. Questo campo contiene i seguenti sottocampi:
    1. Timestamp: il timestamp di quando si è verificato il picco di utilizzo della memoria nel grafico della sequenza temporale
    2. Prenotazione dello stack: quantità di memoria riservata nello stack (in GiB)
    3. Allocazione heap: quantità di memoria allocata sull'heap (in GiB)
    4. Memoria libera: quantità di memoria libera (in GiB). La capacità di memoria è la somma totale della prenotazione dello stack, dell'allocazione dell'heap e della memoria disponibile
    5. Frammentazione: la percentuale di frammentazione (inferiore è meglio). Viene calcolato come una percentuale di (1 - Dimensione della porzione più grande di memoria libera / Memoria libera totale)

Grafico della sequenza temporale della memoria

Questa sezione mostra un grafico dell'utilizzo della memoria (in GiB) e la percentuale di frammentazione rispetto al tempo (in ms).

Immagine

L'asse X rappresenta la linea temporale (in ms) dell'intervallo di profiling. L'asse Y a sinistra rappresenta l'utilizzo della memoria (in GiB) e l'asse Y a destra rappresenta la percentuale di frammentazione. In ogni momento sull'asse X, la memoria totale è suddivisa in tre categorie: stack (in rosso), heap (in arancione) e free (in verde). Passa il mouse su un timestamp specifico per visualizzare i dettagli sugli eventi di allocazione / deallocazione della memoria in quel punto come di seguito:

Immagine

La finestra a comparsa mostra le seguenti informazioni:

  • timestamp (ms) - La posizione dell'evento selezionato sulla timeline
  • evento: il tipo di evento (allocazione o deallocazione)
  • request_size (GiBs) - La quantità di memoria richiesta. Questo sarà un numero negativo per gli eventi di deallocazione
  • allocation_size (GiBs) - La quantità effettiva di memoria allocata. Questo sarà un numero negativo per gli eventi di deallocazione
  • tf_op - TensorFlow Op che richiede l'allocazione / deallocazione
  • step_id - La fase di addestramento in cui si è verificato questo evento
  • region_type - Il tipo di entità di dati per cui si trova questa memoria allocata. I valori possibili sono temp per i provvisori, output per attivazioni e gradienti e persist / dynamic per pesi e costanti
  • data_type - Il tipo di elemento tensore (ad esempio, uint8 per interi senza segno a 8 bit)
  • tensor_shape - La forma del tensore allocato / deallocato
  • memory_in_use (GiBs) - La memoria totale in uso in questo momento

Tabella di ripartizione della memoria

Questa tabella mostra le allocazioni di memoria attiva nel punto di massimo utilizzo della memoria nell'intervallo di profiling.

Immagine

C'è una riga per ogni TensorFlow Op e ogni riga ha le seguenti colonne:

  • Nome operazione: il nome dell'operazione TensorFlow
  • Allocation Size (GiB): la quantità totale di memoria allocata a questa operazione
  • Dimensione richiesta (GiB): la quantità totale di memoria richiesta per questa operazione
  • Occorrenze - Il numero di allocazioni per questa operazione
  • Tipo di regione: il tipo di entità di dati per cui si trova questa memoria allocata. I valori possibili sono temp per i provvisori, output per attivazioni e gradienti e persist / dynamic per pesi e costanti
  • Tipo di dati: il tipo di elemento tensore
  • Forma: la forma dei tensori allocati

Visualizzatore pod

Lo strumento Pod Viewer mostra la suddivisione di una fase di formazione tra tutti i lavoratori.

Immagine

  • Il riquadro superiore ha un cursore per la selezione del numero di passaggio.
  • Il riquadro inferiore mostra un grafico a colonne in pila. Questa è una visualizzazione di alto livello delle categorie di step-time suddivise l'una sull'altra. Ogni colonna in pila rappresenta un lavoratore unico.
  • Quando passi con il mouse su una colonna in pila, la scheda sul lato sinistro mostra ulteriori dettagli sulla suddivisione dei passaggi.

tf. analisi dei colli di bottiglia dei dati

L'analisi dei colli di bottiglia di tf.data rileva automaticamente i colli di bottiglia nelle pipeline di input di tf.data nel programma e fornisce consigli su come risolverli. Funziona con qualsiasi programma che utilizza tf.data indipendentemente dalla piattaforma (CPU / GPU / TPU) o dal framework (TensorFlow / JAX). Le sue analisi e raccomandazioni si basano su questa guida .

Rileva un collo di bottiglia seguendo questi passaggi:

  1. Trova l'host con più input.
  2. Trova l'esecuzione più lenta della pipeline di input tf.data.
  3. Ricostruire il grafico della pipeline di input dalla traccia del profiler.
  4. Trova il percorso critico nel grafico della pipeline di input.
  5. Identifica la trasformazione più lenta sul percorso critico come un collo di bottiglia.

L'interfaccia utente è divisa in tre sezioni: Riepilogo dell'analisi delle prestazioni, Riepilogo di tutte le pipeline di input e Grafico della pipeline di input.

Riepilogo dell'analisi delle prestazioni

Immagine

Questa sezione fornisce il riepilogo dell'analisi. Indica se nel profilo viene rilevata una pipeline di input tf.data lenta. In tal caso, mostra l'host associato più input e la sua pipeline di input più lenta con la latenza massima. E, cosa più importante, indica quale parte della pipeline di input è il collo di bottiglia e come risolverlo. Le informazioni sul collo di bottiglia vengono fornite con il tipo di iteratore e il suo nome lungo.

Come leggere il nome lungo dell'iteratore tf.data

Un nome lungo è formattato come Iterator::<Dataset_1>::...::<Dataset_n> . Nel nome lungo, <Dataset_n> corrisponde al tipo di iteratore e gli altri set di dati nel nome lungo rappresentano trasformazioni a valle.

Ad esempio, considera il seguente set di dati della pipeline di input:

dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)

I nomi lunghi per gli iteratori dal set di dati sopra saranno:

Tipo iteratore Nome lungo
Gamma Iteratore :: Batch :: Repeat :: Map :: Range
Carta geografica Iteratore :: Batch :: Repeat :: Map
Ripetere Iteratore :: Batch :: Ripeti
Lotto Iteratore :: Batch

Riepilogo di tutte le pipeline di input

Immagine

Questa sezione fornisce il riepilogo di tutte le pipeline di input su tutti gli host. In genere è presente una pipeline di input. Quando si utilizza la strategia di distribuzione, sono presenti una pipeline di input host che esegue il codice tf.data del programma e più pipeline di input dei dispositivi che recuperano i dati dalla pipeline di input host e li trasferiscono ai dispositivi.

Per ogni pipeline di input, mostra le statistiche del suo tempo di esecuzione. Una chiamata viene considerata lenta se impiega più di 50 μs.

Grafico della pipeline di input

Immagine

Questa sezione mostra il grafico della pipeline di input con le informazioni sul tempo di esecuzione. È possibile utilizzare "Host" e "Input Pipeline" per scegliere quale host e pipeline di input visualizzare. Le esecuzioni della pipeline di input sono ordinate in base al tempo di esecuzione in ordine decrescente che è possibile scegliere con "Rank".

Immagine

I nodi sul percorso critico hanno contorni in grassetto. Il nodo collo di bottiglia, che è il nodo con il tempo di autonomia più lungo sul percorso critico, ha un contorno rosso. Gli altri nodi non critici hanno contorni tratteggiati grigi.

In ogni nodo, "Start Time" indica l'ora di inizio dell'esecuzione. Lo stesso nodo può essere eseguito più volte, ad esempio, se è presente Batch nella pipeline di input. Se viene eseguito più volte, è l'ora di inizio della prima esecuzione.

"Durata totale" è il tempo del muro dell'esecuzione. Se viene eseguito più volte, è la somma dei wall time di tutte le esecuzioni.

"Self Time" è "Total Time" senza il tempo sovrapposto con i suoi nodi figlio immediati.

"# Calls" è il numero di volte in cui viene eseguita la pipeline di input.

Raccogli i dati sulle prestazioni

Il TensorFlow Profiler raccoglie le attività host e le tracce GPU del tuo modello TensorFlow. È possibile configurare il Profiler per raccogliere i dati sulle prestazioni tramite la modalità programmatica o la modalità di campionamento.

API di profilazione

È possibile utilizzare le seguenti API per eseguire la profilazione.

  • Modalità programmatica utilizzando TensorBoard Keras Callback ( tf.keras.callbacks.TensorBoard )

    # Profile from batches 10 to 15
    tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                                 profile_batch='10, 15')
    
    # Train the model and use the TensorBoard Keras callback to collect
    # performance profiling data
    model.fit(train_data,
              steps_per_epoch=20,
              epochs=5,
              callbacks=[tb_callback])
    
  • Modalità programmatica utilizzando l'API della funzione tf.profiler

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • Modalità programmatica utilizzando il gestore di contesto

    with tf.profiler.experimental.Profile('logdir'):
        # Train the model here
        pass
    

  • Modalità di campionamento: eseguire la profilazione su richiesta utilizzando tf.profiler.experimental.server.start() per avviare un server gRPC con il modello TensorFlow in esecuzione. Dopo aver avviato il server gRPC e eseguito il modello, è possibile acquisire un profilo tramite il pulsante Cattura profilo nel plug-in del profilo TensorBoard. Utilizza lo script nella sezione Installa profiler sopra per avviare un'istanza di TensorBoard se non è già in esecuzione.

    Come esempio,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    Un esempio per la profilazione di più lavoratori:

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

Utilizzare la finestra di dialogo Cattura profilo per specificare:

  • Un elenco delimitato da virgole di URL del servizio profilo o nome TPU.
  • Una durata della profilazione.
  • Il livello di tracciamento delle chiamate alla funzione dispositivo, host e Python.
  • Quante volte si desidera che il Profiler ripeta l'acquisizione dei profili se inizialmente non riesce.

Profilazione di cicli di formazione personalizzati

Per tf.profiler.experimental.Trace il profilo dei cicli di addestramento personalizzati nel codice TensorFlow, strumentare il ciclo di addestramento con l'API tf.profiler.experimental.Trace per contrassegnare i limiti dei passaggi per Profiler. L'argomento name viene utilizzato come prefisso per i nomi dei passaggi, l'argomento della parola chiave step_num viene aggiunto ai nomi dei passaggi e l'argomento della parola chiave _r fa in modo che questo evento di traccia venga elaborato come evento del passaggio dal Profiler.

Come esempio,

for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)

Ciò consentirà l'analisi delle prestazioni basata sui passaggi del Profiler e farà sì che gli eventi dei passaggi vengano visualizzati nel visualizzatore di tracce.

Assicurati di includere l'iteratore del set di dati nel contesto tf.profiler.experimental.Trace per un'analisi accurata della pipeline di input.

Lo snippet di codice di seguito è un anti-pattern:

for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)

Casi d'uso di profilazione

Il profiler copre una serie di casi d'uso lungo quattro assi differenti. Alcune delle combinazioni sono attualmente supportate e altre verranno aggiunte in futuro. Alcuni dei casi d'uso sono:

  • Profilatura locale e remota: questi sono due modi comuni per impostare l'ambiente di profilatura. Nella profilazione locale, l'API di profilatura viene richiamata sulla stessa macchina in esecuzione sul modello, ad esempio una workstation locale con GPU. Nella profilazione remota, l'API di profilatura viene chiamata su una macchina diversa da quella in cui è in esecuzione il modello, ad esempio su un Cloud TPU.
  • Profilazione di più lavoratori: è possibile profilare più macchine quando si utilizzano le funzionalità di formazione distribuita di TensorFlow.
  • Piattaforma hardware: profili di CPU, GPU e TPU.

La tabella seguente è una rapida panoramica di quali dei casi d'uso precedenti sono supportati dalle varie API di profilazione in TensorFlow:

API di profilazione Locale A distanza Più lavoratori Piattaforme hardware
TensorBoard Keras Callback Supportato Non supportato Non supportato CPU, GPU
tf.profiler.experimental start / stop API Supportato Non supportato Non supportato CPU, GPU
API tf.profiler.experimental client.trace Supportato Supportato Supportato CPU, GPU, TPU
API del gestore di contesto Supportato Non supportato Non supportato CPU, GPU

Best practice per prestazioni ottimali del modello

Utilizzare i seguenti consigli applicabili ai modelli TensorFlow per ottenere prestazioni ottimali.

In generale, esegui tutte le trasformazioni sul dispositivo e assicurati di utilizzare l'ultima versione compatibile di librerie come cuDNN e Intel MKL per la tua piattaforma.

Ottimizza la pipeline dei dati di input

Una pipeline di input dei dati efficiente può migliorare drasticamente la velocità di esecuzione del modello riducendo il tempo di inattività del dispositivo. Considera l'idea di incorporare le seguenti best practice come descritto in dettaglio qui per rendere più efficiente la pipeline di input dei dati:

  • Precarica i dati
  • Parallelizza l'estrazione dei dati
  • Parallelizza la trasformazione dei dati
  • Memorizza i dati nella cache
  • Vectorize funzioni definite dall'utente
  • Riduci l'utilizzo della memoria durante l'applicazione delle trasformazioni

Inoltre, prova a eseguire il modello con dati sintetici per verificare se la pipeline di input è un collo di bottiglia delle prestazioni.

Migliora le prestazioni del dispositivo

  • Aumentare la dimensione del mini-batch di addestramento (numero di campioni di addestramento utilizzati per dispositivo in un'iterazione del ciclo di addestramento)
  • Usa le statistiche TF per scoprire quanto sono efficienti le operazioni sul dispositivo
  • Usa tf.function per eseguire calcoli e, facoltativamente, abilita il flag experimental_compile
  • Riduci al minimo le operazioni Python dell'host tra i passaggi e riduci i callback. Calcola le metriche ogni pochi passaggi anziché a ogni passaggio
  • Tenere occupate le unità di calcolo del dispositivo
  • Invia dati a più dispositivi in ​​parallelo
  • Ottimizza il layout dei dati per preferire prima i canali (ad esempio NCHW su NHWC). Alcune GPU come NVIDIA® V100 offrono prestazioni migliori con un layout dati NHWC.
  • Prendi in considerazione l'utilizzo di rappresentazioni numeriche a 16 bit come fp16 , il formato a virgola mobile a mezza precisione specificato da IEEE o il formato a virgola mobile Brain bfloat16
  • Prendi in considerazione l'utilizzo dell'API a precisione mista di Keras
  • Quando ti alleni con le GPU, utilizza TensorCore. I kernel GPU utilizzano TensorCore quando la precisione è fp16 e le dimensioni di input / output sono divisibili per 8 o 16 (per int8)

Risorse addizionali

Limitazioni note

Profilatura di più GPU su TensorFlow 2.2 e TensorFlow 2.3

TensorFlow 2.2 e 2.3 supportano più profili GPU solo per sistemi host singoli; la creazione di profili con più GPU per sistemi multi-host non è supportata. Per profilare le configurazioni GPU multi-worker, ogni worker deve essere profilato in modo indipendente. Su TensorFlow 2.4, più worker possono essere profilati utilizzando l'API tf.profiler.experimental.trace .

CUDA® Toolkit 10.2 o successivo è necessario per profilare più GPU. Poiché TensorFlow 2.2 e 2.3 supportano le versioni di CUDA® Toolkit solo fino alla 10.1, creare collegamenti simbolici a libcudart.so.10.1 e libcupti.so.10.1 .

sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1