Risoluzione dei problemi di TensorFlow - TPU
Questa guida, insieme alle Domande frequenti, fornisce assistenza per la risoluzione dei problemi agli utenti che addestrano modelli TensorFlow su Cloud TPU. Se stai risolvendo i problemi di addestramento di PyTorch o JAX, puoi consultare i documenti per la risoluzione dei problemi relativi a questi framework:
Per guide più generali su come utilizzare Cloud TPU, consulta:
- Le guide rapide per Cloud TPU
- Tutorial su MNIST
- Addestramento di modelli ML su TPU (Cloud Tensor Processing Unit)
Panoramica
I problemi comuni riscontrati con Cloud TPU rientrano nelle seguenti categorie:
Problemi di connessione al server TPU
Questa sezione descrive come risolvere i problemi situazioni in cui TensorFlow smette di rispondere o visualizza un errore connessione alla TPU. Il passaggio di compilazione del grafo TPU può richiedere molto tempo per i modelli di grandi dimensioni, quindi lascia che lo script venga eseguito per almeno 5 minuti prima di concludere che ha smesso di rispondere.
Il primo passaggio consiste nel verificare se il problema riguarda il server stesso o della pipeline di addestramento TensorFlow. Per farlo, esegui il tutorial su MNIST utilizzando l'URL del server TPU e verifica che funzioni correttamente. Se ci sono ancora di connessione con il tutorial MNIST, questo conferma che si tratta di un problema con il server TPU. In questo caso:
Esegui questo comando per elencare le TPU disponibili. Sostituisci zone e project-id con la tua zona e l'ID progetto.
(vm)$ gcloud compute tpus tpu-vm list --zone zone --project project-id
Verrà stampato un output come:
NAME ZONE ACCELERATOR_TYPE NETWORK_ENDPOINT NETWORK RANGE STATUS demo-tpu us-central1-b v2-8 10.240.1.2:8470 default 10.240.1.0 READY
Verifica di passare il valore corretto a
--tpu
(demo-tpu
nell'esempio precedente) e che questa TPU sia elencata comeREADY
.Se la tua TPU non è elencata come
READY
o se i problemi persistono connessione, riavvia manualmente il server con:(vm)$ gcloud compute tpus tpu-vm stop $TPU_SERVER_NAME && gcloud compute tpus tpu-vm start $TPU_SERVER_NAME
Nell'esempio precedente,
$TPU_SERVER_NAME
èdemo-tpu
. L'operazione potrebbe richiedere diversi minuti.Esegui di nuovo il comando
... tpus list
e attendi che la TPU si trovi in StatoREADY
. L'operazione potrebbe richiedere alcuni minuti.Prova a eseguire di nuovo il tutorial su MNIST.
Se continui ad avere problemi con l'esecuzione del tutorial MNIST, chiedi aiuto usando uno dei meccanismi descritti in Assistenza.
Se l'esempio MNIST funziona correttamente, ma il modello continua a non rispondere,
è probabile che il problema riguardi la pipeline di addestramento.
Per eseguire il debug, inizia sostituendo TPUStrategy nel codice con la strategia predefinita. Quando utilizzi la strategia predefinita, ovunque ti trovi
strategy.scope()
o strategy.run()
, il modello viene eseguito
su CPU (o GPU se presente)
sulla TPU. Se il modello viene eseguito sulla CPU e non sulla TPU, deve essere presente
Problema specifico di TPU. Se il problema persiste, è buona norma eseguire il debug
del problema sulla CPU.
Perdita della connessione a ssh
durante l'addestramento
La connessione ssh
a Cloud TPU potrebbe scadere durante un addestramento di lunga durata (in particolare se utilizzi Cloud Shell).
A quel punto, non c'è alcun output nella console TPU
sembra che la TPU abbia interrotto l'addestramento. Per evitare questo problema, esegui la
sessione di formazione con un multiplexer di terminale o uno strumento di gestione delle sessioni come
tmux
o screen
. Questa operazione manterrà ssh
attiva a prescindere dalla durata dell'addestramento.
Debug di errori comuni
Questa sezione descrive come risolvere gli errori comuni che potresti riscontrare durante l'addestramento dei modelli su Cloud TPU.
Impossibile creare una TPU
Quando crei una Cloud TPU, potresti visualizzare il seguente errore:
googleapiclient.errors.HttpError: < HttpError 403 when requesting https://content-tpu.googleapis.com/v1/projects/{PROJECT}/locations/{ZONE}/nodes/{TPU_NAME}?alt=json returned "Request had insufficient authentication scopes."
Si tratta di un problema relativo alle autorizzazioni e può essere risolto eseguendo questo comando:
gcloud auth login --update-adc
Questo comando aggiorna le credenziali predefinite dell'applicazione (ADC) e dovrebbe risolvere il problema. Per ulteriori informazioni, consulta gcloud auth login.
Forme dinamiche non supportate
Messaggio di errore
ValueError: shape [Shape] must have a fixed size for dimension d that is known at graph construction time.
Framework e configurazioni interessati
Questo messaggio viene visualizzato solo durante la compilazione XLA con TensorFlow.
Dettagli
Per eseguire un modello sulla TPU, Cloud TPU lo compila utilizzando il compilatore XLA. Anche se questo passaggio di compilazione migliora notevolmente la velocità di addestramento e l'utilizzo della memoria, le forme (dimensioni) di tutti i tensori nel grafo devono essere note al momento della compilazione del grafo. Se non è possibile determinare le forme in fase di compilazione, la compilazione della TPU non va a buon fine con un errore simile a quello mostrato in precedenza.
Un'operazione comune che restituisce una forma dinamica è dataset.batch(batch_size)
, poiché il numero di campioni rimanenti in uno stream potrebbe essere inferiore alla dimensione del batch. Pertanto, quando esegui l'addestramento sulla TPU,
drop remainder=True
per dataset.batch
.
Questa operazione potrebbe eliminare gli ultimi campioni da un file per garantire
che ogni batch abbia una forma statica di batch_size. Ad esempio:
dataset = tf.data.Dataset.range(8)
dataset = dataset.batch(3, drop_remainder=True)
Operazione TensorFlow non disponibile
Messaggio di errore
NotFoundError: No registered 'OpName' OpKernel for XLA_TPU_JIT devices compatible with node
Framework e configurazioni interessati
Questo messaggio può verificarsi durante l'addestramento con TensorFlow.
Dettagli
Il modello utilizza un'operazione TensorFlow non disponibile su TPU.
Per un elenco delle operazioni disponibili sulla TPU, oltre ai piani per il supporto futuro e suggerimenti per soluzioni alternative, consulta la guida per TensorFlow Ops disponibili.
Messaggio di errore relativo alla memoria insufficiente
Messaggio di errore
ResourceExhaustedError: Ran out of memory in memory space hbm; used: YYY; limit: 7.48G.
Framework e configurazioni interessati
Questo messaggio può verificarsi durante l'addestramento con TensorFlow, PyTorch o JAX.
Dettagli
Ogni Cloud TPU è composta da otto core TPU, le TPU v2 hanno 8 GB e le TPU v3 hanno 16 GB di RAM (o HBM, memoria ad alta larghezza di banda). Questa memoria viene utilizzata per memorizzare i tensori dei pesi (variabili), nonché i tensori dei risultati intermedi necessari per il calcolo del gradiente. Se il modello è troppo grande per essere inserito nella RAM della TPU, l'inizializzazione non va a buon fine e viene stampato il messaggio di errore. Per ulteriore assistenza, consulta la sezione sulla riduzione dell'utilizzo della memoria.
Suggerimenti per ridurre l'utilizzo della memoria:
- Controlla la presenza di riempimenti eccessivi dei tensori
- Utilizza il formato bfloat16
- Se le dimensioni o il modello di input sono troppo grandi, potresti riuscire a utilizzare Parallelismo del modello sperimentale di TensorFlow per gestire le dimensioni del modello.
Problemi durante l'interruzione dell'esecuzione
Se TensorFlow rileva un errore durante l'esecuzione della TPU, a volte lo script sembra smettere di rispondere anziché uscire dalla shell. In questo caso,
premi CTRL+C
sulla tastiera per attivare un SIGQUIT
, che fa uscire
Python immediatamente.
Allo stesso modo, la pressione di CTRL+C
durante l'esecuzione della TPU non arresta TensorFlow
immediatamente, ma attende fino alla fine del loop di iterazione corrente
uscire in modo pulito.
Se si verificano nuovi errori quando ti riconnetti a dopo aver chiuso la TPU in questo modo, reimposta manualmente il server TPU con i comandi:
gcloud compute tpus tpu-vm stop tpu-name --zone=zone gcloud compute tpus tpu-vm start tpu-name --zone=zone
dove tpu-name viene ricavato dalla prima colonna visualizzata dallo
gcloud compute tpus tpu-vm list
e zone è la zona mostrata
la seconda colonna.
Riempimento eccessivo dei tensori
Possibile causa del problema di memoria
I tensori nella memoria TPU sono con spaziatura interna, ovvero la TPU arrotonda per eccesso le dimensioni dei tensori memorizzati nella memoria per eseguire i calcoli in modo più efficiente. Questo riempimento avviene in modo trasparente a livello hardware e non influisce sui risultati. Tuttavia, in alcuni casi la spaziatura interna può comportare un aumento significativo dell'utilizzo della memoria e dei tempi di esecuzione.
Come ridurre l'utilizzo della memoria
Il software TPU cerca di disporre i tensori in memoria per massimizzare l'efficienza computazionale e minimizza la spaziatura interna. Questo processo di layout della memoria è complessa, ma per ottenere i migliori risultati il modello deve la seguente regola empirica. Per ridurre al minimo l'overhead di memoria e massimizzare l'efficienza computazionale, deve essere vera una delle seguenti condizioni:
La dimensione totale del batch deve essere un multiplo di 64 (8 per core TPU) e le dimensioni delle funzionalità devono essere un multiplo di 128.
o
La dimensione totale del batch deve essere un multiplo di 1024 (128 per core TPU) e le dimensioni delle caratteristiche devono essere un multiplo di 8.
L'utilizzo di un batch di 1024 e dimensioni delle funzionalità che sono un multiplo di 128 consente di ottenere l'efficienza migliore, anche se ciò potrebbe non essere possibile per tutti i modelli. Per chiarezza, "dimensione delle funzionalità" si riferisce alle dimensioni nascoste di un livello completamente connesso o al numero di canali di output in una convezione. Non tutte possono essere conformi a questa regola, in particolare il primo e l'ultimo strato. della rete. Questo non è un problema e si prevede che la maggior parte dei modelli richieda una quantità di spaziatura interna.
Riduzione dell'utilizzo della memoria
Se si verifica un errore di esaurimento della memoria durante l'esecuzione del modello sulla TPU, devi adottare misure per ridurre l'utilizzo della memoria del modello.
I modi più efficaci per ridurre l'utilizzo della memoria sono:
- Riduci l'eccessiva spaziatura interna del tensore
- Riduci la dimensione del batch
Dimensione del batch o modello troppo grande
Possibile causa del problema di memoria
Quando addestra una rete neurale su CPU, GPU o TPU, l'utilizzo della memoria proviene in due posizioni:
- L'utilizzo della memoria è proporzionale al numero di i pesi nel modello.
- Memorizzazione delle attivazioni intermedie dal passaggio in avanti necessario per calcolare il passaggio all'indietro. L'utilizzo della memoria è direttamente proporzionale alle dimensioni del batch, alle dimensioni dei livelli e al numero di livelli.
Di conseguenza, la memoria richiesta da un modello dipende molto dal modello dimensioni.
La memoria richiesta da un modello dipende dal numero di strati in in rete.
Il runtime TPU tenta di ottimizzare gli operatori per adattare il modello in memoria (operazione chiamata rematerializzazione, simile al controllo punto di interruzione del gradiente), ma non sempre ci riesce.
Come ridurre l'utilizzo della memoria
Riduci lentamente la dimensione del batch fino a quando non rientra in memoria, assicurandoti che la dimensione totale del batch è un multiplo di 64 (la dimensione del batch per core dovrebbe multiplo di 8). Tieni presente che le dimensioni dei batch più grandi sono più efficienti sul o TPU. Una dimensione totale del batch di 1024 (128 per core) è generalmente un buon inizio punto di accesso.
Se il modello non può essere eseguito sulla TPU anche con un piccolo dimensione del batch (ad esempio 64), prova a ridurre il numero di livelli o le dimensioni dei livelli.
Migliorare la velocità di addestramento
Se il tuo modello è in grado di funzionare correttamente su TPU, ma la velocità di addestramento è inferiore alle aspettative, questa sezione illustra diversi potenziali modi per migliorare la velocità. Consulta la guida sul rendimento per altri suggerimenti su come migliorare il rendimento dell'addestramento.
Numero insufficiente di passaggi per esecuzione per ciclo di addestramento
Descrizione del problema di rendimento
Il passaggio dell'argomento steps_per_execution
a Model.compile
controlla quanti passaggi di addestramento vengono eseguiti tra i callback dell'host.
Ogni callback dell'host richiede una comunicazione significativa tra la CPU dell'host del server TPU e il dispositivo TPU, quindi se steps_per_execution
è troppo piccolo, l'addestramento può rallentare.
Come capire se il tuo modello è interessato
Se un profilo TPU rivela frequenti callback della CPU host tra i passaggi del dispositivo TPU,
il tuo addestramento potrà trarre vantaggio da un valore di steps_per_execution
più ampio.
Come mitigare il problema
Imposta un valore di steps_per_execution
maggiore. Tieni presente che
steps_per_execution
può essere impostato su un valore elevato, ma tieni presente che
la registrazione dei messaggi e il salvataggio di un checkpoint possono avvenire solo dopo che è stato eseguito il
numero specificato di passaggi.
Collo di bottiglia dell'elaborazione degli input
Descrizione del problema di rendimento
Mentre la TPU esegue l'addestramento su un determinato blocco di dati, la funzione di elaborazione input prepara il blocco successivo di dati sulla CPU. Se la funzione di input richiede più tempo della funzione del modello, la TPU rimane inattiva mentre la funzione di input recupera i dati.
Come capire se il tuo modello è interessato
Segui le istruzioni in Cloud TPU Tools: Input Pipeline (Strumenti Cloud TPU: pipeline di input) Strumento di analisi per visualizzare analisi della pipeline di input in TensorBoard:
La pagina Analisi della pipeline di input mostra un chiaro riepilogo che mostra se il modello è sottoposto a colli di bottiglia dall'elaborazione degli input. Nella stessa pagina mostra il tempo di esecuzione per operazione, che consente di individuare le operazioni problematiche.
Come mitigare il problema
Esistono diverse possibili mitigazioni per il caricamento dei dati con l'API Dataset
:
- Archivia i dati come raccolta di
tf.train.Example
strutture inTFRecord
file e caricali conTFRecordDataset
. Per esempi, consulta il tutorial sull'API Dataset o il tutorial su ResNet. - Utilizza
dataset.cache()
odataset.prefetch()
per eseguire il buffering dei dati di input. In questo modo si impedisce che i rallentamenti sporadici nell'accesso ai file creino un collo di bottiglia. - Specifica il parametro
num_parallel_calls
della funzionedataset.map()
per abilitare le operazionimap()
con multi-thread. Un'euristica per il valorenum_parallel_calls
consiste nell'utilizzare il numero di core CPU disponibili. - Eseguire costose pre-elaborazione dei dati offline come costo una tantum anziché rispetto a dover sostenere il costo in ogni epoca di ogni addestramento.
Tutte le elaborazioni di input vengono eseguite su CPU situate sul server TPU, non della macchina locale, quindi la velocità della macchina locale non è un fattore.
Tempi di passaggio lenti e basso utilizzo di MXU
Descrizione del problema di rendimento
Cloud TPU può eseguire moltiplicazioni e convolute di matrici a velocità incredibilmente elevate. La maggior parte delle altre operazioni TensorFlow ha implementazioni efficienti sulla TPU, ma non sono le istanze principali rispetto ad altro hardware. Pertanto, un modello deve essere dominato da moltiplicazioni o convezioni di matrici per sfruttare appieno la TPU.
Come capire se il tuo modello è interessato
In questo caso, noterai tempi di passaggio lenti combinati con un utilizzo ridotto delle unità MXU quando esegui il profiling delle prestazioni.
Come mitigare il problema
Prova a ridurre il numero di operazioni che non sono moltiplicazioni matriciali. Dopo aver ridotto il numero di moltiplicazioni matriciali, esegui nuovamente il benchmark per verificare se le prestazioni sono accettabili sulle TPU.
Riempimento eccessivo dei tensori
Descrizione del problema di rendimento
La TPU protegge i tensori della memoria in modo che la TPU possa utilizzare le sue unità di calcolo in modo efficiente. Il padding può aumentare l'utilizzo sia della memoria sia della larghezza di banda della memoria. Per assistenza, consulta la sezione sulla spaziatura interna del tensore la comprensione e la risoluzione dei problemi di spaziatura interna dei tensori.
Bassa velocità in uscita e basso utilizzo della memoria
Descrizione del problema di rendimento
Come regola generale, l'utilizzo di dimensioni batch più grandi si traduce in una maggiore velocità di addestramento la TPU in termini di campioni al secondo.
Come capire se il tuo modello è interessato
La dimensione del batch di qualsiasi modello deve essere sempre almeno 64 (8 per core TPU), poiché la TPU copre sempre i tensori a queste dimensioni. La dimensione ideale del batch l'addestramento sulla TPU è 1024 (128 per core TPU), poiché ciò elimina inefficienze legate al trasferimento e alla spaziatura interna della memoria.
Come attenuare
La best practice prevede di utilizzare la dimensione del batch più grande che rientra nella memoria multiplo di 64. Il modo più semplice per raggiungere questo obiettivo è iniziare con 1024 e se questo causa un errore di memoria insufficiente, quindi prova a ridurre la dimensione del batch dell'esecuzione del modello correttamente. La modifica della dimensione del batch di un modello potrebbe richiedere aggiustamenti di altri iperparametri per ottenere la stessa accuratezza del modello, ad esempio il tasso di apprendimento, ma questo deve essere valutato caso per caso.
Dimensioni dei livelli troppo piccole
Descrizione del problema di rendimento
Anche quando un modello è dominato da moltiplicazioni o convoluzioni matriciali, La TPU potrebbe non essere eseguita alla massima efficienza se i tensori di input sono piccoli. Rispetto ad altro hardware, la TPU funziona in modo più efficiente quando sia le dimensioni del batch sia quelle del livello sono grandi (ad esempio, dimensione >= 512).
Come sapere se il tuo modello è interessato
Come regola generale, le dimensioni degli strati inferiori a 128 ottengono una scarsa efficienza. sulla TPU, poiché 128 è la dimensione integrata della moltiplicazione della matrice TPU unità. Per i livelli completamente connessi, è consigliata una dimensione nascosta minima di 512 per ottenere un'elevata efficienza. Tieni presente che i livelli con convoluzione in genere non devono essere grandi quanto i livelli completamente connessi per raggiungere lo stesso livello di efficienza.
Come attenuare
Se la motivazione principale per gli strati di piccole dimensioni nel modello è la velocità di addestramento, eseguire nuovamente il benchmarking dei modelli con strati più grandi sulla TPU. Ad esempio, l'aumento della dimensione di output di uno strato da 256 a 512 può il tempo di addestramento del 20% anche se il modello sta eseguendo il doppio molto altro.
Profilazione del modello a livello di operatore
Spesso è utile misurare il tempo di esecuzione a livello di operazione e l'utilizzo della memoria in modo da
per identificare i colli di bottiglia delle prestazioni. Per istruzioni su come eseguire questa operazione,
consulta la guida Cloud TPU Tools: Trace Viewer.
Il debug comporta cali di accuratezza del modello
Uno degli obiettivi dell'ecosistema Cloud TPU è che qualsiasi modello addestrato su una CPU o una GPU ottiene una precisione molto simile quando viene addestrato sulla TPU, probabilmente con piccole modifiche agli iperparametri. come la dimensione del batch e il tasso di apprendimento. A volte, però, gli utenti possono osservare un peggioramento dell'accuratezza durante l'addestramento dei modelli sulla TPU. Il debug di questi problemi può essere estremamente frustrante a causa della natura casuale dell'addestramento delle reti neurali. Questa sezione fornisce indicazioni su come individuare la causa principale di a causa di un calo nell'accuratezza del modello durante la portabilità del modello sulla TPU.
Informazioni sullo sharding dei dati (parallelismo dei dati)
Uno degli obiettivi principali di TensorFlow è che ogni operazione debba produrre risultati quasi identici indipendentemente dal fatto che venga eseguita su CPU, GPU o TPU. Esistono alcune eccezioni, come le operazioni casuali. In generale, se rilevi una differenza significativa tra l'output delle operazioni non casuali sulla TPU e sulla CPU, segnala il problema come bug.
Tuttavia, per la pipeline di addestramento nel suo complesso, esiste una differenza significativa tra l'addestramento su CPU/GPU e TPU. Durante l'addestramento su una TPU,
TensorFlow esegue lo sharding dei dati,
Ogni Cloud TPU contiene 8 core TPU che operano come
le unità di elaborazione. Per ogni passaggio dell'addestramento, ogni core TPU riceve un batch
di dati, calcola i gradienti di peso, scambia i gradienti con
e altri core TPU,
e poi calcola l'aggiornamento del peso. Per impostazione predefinita, la perdita viene calcolata in media
core, ma può essere sommato modificando il parametro di CrossShardOptimizer
.
Se la perdita totale del modello può essere calcolata come media (o somma) di perdite indipendenti per campione, questa procedura è matematicamente equivalente all'addestramento su un singolo batch di grandi dimensioni.
L'operazione più comune che non è indipendente per campione è batch normalizzazione, che supera ogni batch per core separatamente. Ad esempio, se la dimensione totale del batch è 128, la dimensione del batch per core è di 16 e ciascuno degli 8 core esegue la normalizzazione del batch su 16 campioni. In alcuni casi, l'esecuzione in batch è stato riscontrato che la normalizzazione in piccoli batch (ad esempio, meno di 32) la precisione è peggiorata. In uno scenario ideale, la dimensione totale del batch deve essere elevata (ad esempio da 256 a 1024). Se la dimensione del batch è troppo grande per essere contenuta nella memoria, l'effetto dello sharding deve essere valutato caso per caso.
Addestramento deterministico
Un motivo per cui è difficile eseguire il debug delle differenze di accuratezza del modello è che in diversi framework (TensorFlow, PyTorch, JAX), la il software di addestramento utilizza diversi valori di inizializzazione dei pesi e data shuffling ogni volta che viene addestrato un modello. È utile modificare la procedura di addestramento in modo che sia deterministica, in modo che più esecuzioni producano modelli quasi identici. Questa sezione illustra come eseguire il tutorial MNIST in modo deterministico:
- Genera un file di checkpoint iniziale eseguendo un singolo passaggio sulla CPU. Questo passaggio viene utilizzato per ottenere un'inizializzazione deterministica delle ponderazioni. Inoltre, assicurati di utilizzare un seed casuale fisso per qualsiasi funzione casuale nel modello.
# Run training for 1 step to create an initial checkpoint. python mnist_tpu.py \ --use_tpu=False \ --data_dir=${STORAGE_BUCKET}/data/ \ --model_dir=${STORAGE_BUCKET}/init_output \ --random_seed=12345 \ --iterations=1 --train_steps=1
- Modifica le eventuali funzioni di data shuffling nella funzione di input in modo da utilizzare un seed casuale. Questo è già stato fatto nel tutorial su MNIST. Funziona per l'input perché vengono eseguite sempre sulla CPU. Le operazioni casuali nella funzione del modello potrebbero non essere deterministiche tra la TPU e la CPU. Ogni volta che chiami un'operazione casuale, passa un seed fisso per garantire gli stessi risultati tra le esecuzioni. Ad esempio:
# In the flag definitions
tf.flags.DEFINE_integer("batch_size", None, "Random seed for training")
# In the input_fn
if FLAGS.random_seed is not None:
dataset = dataset.shuffle(seed=FLAGS.random_seed)
-
Esegui due volte lo stesso modello sulla CPU per verificare che l'addestramento sia
deterministici. Tieni presente che l'addestramento deve essere eseguito per un numero ragionevole di passaggi (ad esempio 1000), ma non deve essere eseguito fino alla convergenza.
Poiché l'addestramento della CPU è confrontato con l'addestramento di una TPU single-core, utilizza un dimensione del batch che può adattarsi a un singolo core TPU (di solito, la dimensione completa del batch diviso 8). TensorFlow non garantisce il determinismo bit per bit tra ma la perdita dovrebbe essere molto vicina:
Copia i pesi iniziali
gcloud storage cp ${STORAGE_BUCKET}/init_output/* ${STORAGE_BUCKET}/cpu_output_1/ --continue-on-error gcloud storage cp ${STORAGE_BUCKET}/init_output/* ${STORAGE_BUCKET}/cpu_output_2/ --continue-on-error
Gara 1
python mnist_tpu.py \ --use_tpu=False \ --data_dir=${STORAGE_BUCKET}/data/ \ --model_dir=${STORAGE_BUCKET}/cpu_output_1 \ --batch_size=128 \ --random_seed=12345 \ --train_steps=2000 \ --eval_steps=10
Output 1
accuracy = 0.9910644, global_step = 1000, loss = 0.025323588
Corsa 2
python mnist_tpu.py \ --use_tpu=False \ --data_dir=${STORAGE_BUCKET}/data/ \ --model_dir=${STORAGE_BUCKET}/cpu_output_1 \ --batch_size=128 \ --random_seed=12345 \ --train_steps=2000 \ --eval_steps=10
Uscita 2
accuracy = 0.9910644, global_step = 1000, loss = 0.025323414
Addestramento con TPU a un core
Una volta che puoi eseguire il tutorial MNIST in modo deterministico, il passaggio successivo consiste nel riprodurre i risultati addestrati su CPU sulla TPU, utilizzando un singolo core TPU per individuare se il problema è correlato allo sharding dei dati o al motore di esecuzione della TPU stesso.
Ecco come eseguire addestramento e valutazione single-core nel tutorial MNIST:
Utilizza la stessa inizializzazione del peso della CPU
gcloud storage cp ${STORAGE_BUCKET}/init_output/* ${STORAGE_BUCKET}/tpu_output --continue-on-error
Esegui l'addestramento per 1000 passaggi
python mnist.py \ --use_tpu=True \ --master=$GRPC_SERVER \ --train_file=${STORAGE_BUCKET}/data/train.tfrecords \ --model_dir=${STORAGE_BUCKET}/tpu_output \ --random_seed=12345 \ --num_shards=1 \ --batch_size=128 \ --train_steps=1000 \ --eval_steps=10
Output
accuracy = 0.9910644, global_step = 1000, loss = 0.02514153
La perdita non corrisponderà esattamente al modello addestrato con CPU, ma dovrebbe essere simile. Se non è così per il tuo modello, è possibile che tu abbia trovato un bug nel motore di esecuzione TPU. Prima del giorno l'invio di una segnalazione di bug, controlla quanto segue:
Stai passando
num_shards=1
aTPUConfig
.Non sono presenti operazioni casuali nella funzione del modello, mentre nella funzione della funzione di input sia stato eseguito correttamente.
Stai utilizzando lo stesso file di checkpoint iniziale per l'addestramento di CPU e TPU.
Debug dell'addestramento di TPU multi-core
Se il tuo modello raggiunge la stessa perdita sulla CPU e sulla TPU single-core, il problema è probabilmente uno dei seguenti:
(a) Il degrado è dovuto alla varianza casuale naturale durante l'addestramento con diverse inizializzazioni.
(b) Il degrado è dovuto a un problema relativo allo sharding dei dati sulla TPU.
Per determinare se (a) è il problema, riaddestra il modello completo su CPU/GPU e TPU multi-core, con la stessa inizializzazione di peso.
Se ritieni che il calo dell'accuratezza sia statisticamente significativo, i problemi più probabili relativi allo sharding dei dati sono:
- Se il modello utilizza la normalizzazione del batch, la dimensione totale del batch è inferiore a 256 (ad esempio, meno di 32 per core) potrebbe ridurre l'accuratezza.
- Le funzioni di perdita a livello di batch sono interessate dallo sharding. Tali funzioni di perdita sono in genere abbastanza specializzate. Ad esempio: Karras et al. 2017 utilizza un discriminatore batch durante l'addestramento di una rete avversaria generativa.
Risoluzione dei problemi di configurazione di gcloud
- Problema
gcloud components update
mostra il seguente messaggio di errore:
ERROR: (gcloud.components.update) You cannot perform this action because the Cloud SDK component manager is disabled for this installation.
- Soluzione
- Per utilizzare
gcloud
, devi utilizzare un'installazione digcloud
non gestita tramite un gestore dei pacchetti. Per installaregcloud
dal codice sorgente:
sudo apt-get remove google-cloud-sdk curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-311.0.0-linux-x86_64.tar.gz tar -xzf google-cloud-sdk-311.0.0-linux-x86_64.tar.gz ./google-cloud-sdk/install.sh source ~/.bashrc
- Problema
Il comando
gcloud compute tpus tpu-vm ssh ${TPU_NAME} --zone ${ZONE}
visualizza il seguente messaggio di errore:Waiting for SSH key to propagate. ssh: connect to host 34.91.136.59 port 22: Connection timed out ssh: connect to host 34.91.136.59 port 22: Connection timed out ssh: connect to host 34.91.136.59 port 22: Connection timed out ERROR: (gcloud.compute.tpus.tpu-vm.ssh) Could not SSH into the instance. It is possible that your SSH key has not propagated to the instance yet. Try running this command again. If you still cannot connect, verify that the firewall and instance are set to accept ssh traffic.
- Soluzione
Potrebbe esserci un problema con la propagazione della chiave SSH. Prova a spostare chiavi generate automaticamente in una posizione di backup per forzare la nuova creazione di
gcloud
quali:mv ~/.ssh/google_compute_engine ~/.ssh/old-google_compute_engine mv ~/.ssh/google_compute_engine.pub ~/.ssh/old-google_compute_engine.pub
Log di debug
I framework Cloud TPU supportati, JAX, PyTorch e TensorFlow, accedono alle TPU utilizzando una libreria condivisa denominata libtpu
presente su ogni VM TPU. Questa libreria include il compilatore XLA utilizzato per compilare
i programmi TPU, il runtime TPU utilizzato per eseguire i programmi compilati,
e il driver TPU utilizzato dal runtime per l'accesso di basso livello alla TPU.
La libreria libtpu
registra informazioni che possono essere utili per il debug.
Per impostazione predefinita, questi log vengono scritti in /tmp/tpu_logs
su ogni VM Cloud TPU.
Le seguenti variabili di ambiente possono essere impostate prima di iniziare l'addestramento
per modificare il comportamento di logging:
- TPU_LOG_DIR: la directory in cui vengono scritti i log
- La posizione della directory predefinita è
/tmp/tpu_logs
. La directory è vengono create se non esiste già, ma non vengono create directory padre. Se si verifica un errore durante la ricerca o la creazione della directory specificata, viene visualizzato un messaggio in stderr, ma il programma non viene interrotto e il logging viene disattivato. Imposta il nome della directory su "disattivato" a disattivare del tutto il logging su disco. - TPU_MIN_LOG_LEVEL: la gravità minima che verrà registrata sul disco
- Le opzioni sono 0 (INFO), 1 (WARNING), 2 (ERROR) e 3 (FATAL). Il valore predefinito è 0.
- TPU_STDERR_LOG_LEVEL: la gravità minima che verrà registrata in stderr, oltre che sul disco, se applicabile
- Le opzioni sono le stesse di TPU_MIN_LOG_LEVEL. Il valore predefinito è 3.
- TPU_MAX_LOG_SIZE_MB: la dimensione massima in megabyte di ogni file di log
- Verrà avviato automaticamente un nuovo file di log quando quello precedente raggiungerà di queste dimensioni. Il valore predefinito è 1024.