Categoria: Runtime: Buffer Allocation Failure
Questo errore indica che l'allocatore di memoria del runtime XLA:TPU non è riuscito a trovare un blocco di memoria adatto nella HBM dell'acceleratore per l'allocazione richiesta.
Esempio di messaggio di errore:
ValueError: RESOURCE_EXHAUSTED: Error allocating device buffer: Attempting to allocate 8.00M. That was not possible. There are 6.43M free.; (0x0x1_HBM0)
Backend XLA: TPU
Panoramica
Questo errore viene generato su
- errori di allocazione del buffer avviata dall'utente tramite
jax.device_puto - errori di allocazione dell'output del programma pianificato dall'utente.
Questi errori sono in genere causati da un paio di motivi:
- Esaurimento della memoria (OOM): l'utente sta tentando di allocare un blocco di memoria più grande della quantità totale di memoria libera disponibile nella HBM della TPU.
- Frammentazione della memoria:l'allocazione non riesce perché nessun singolo blocco libero contiguo nello spazio di memoria è abbastanza grande da soddisfare le dimensioni richieste. La quantità totale di memoria libera è sufficiente per l'allocazione, ma è distribuita nello spazio di memoria in blocchi piccoli e non contigui.
Il runtime TPU dispone di diversi meccanismi per riprovare ad allocare le risorse in caso di errori, tra cui:
- Se sono presenti deallocazioni in coda, il runtime riprova le allocazioni non riuscite,
- In caso di errori di memoria insufficiente causati da una frammentazione, il runtime può attivare automaticamente una deframmentazione e un nuovo tentativo.
- Il runtime della TPU dà la priorità alle allocazioni del buffer rispetto al mantenimento dei programmi caricati. Se l'allocazione di un buffer non riesce a causa di HBM insufficiente, il sistema espelle i programmi TPU caricati finché non è disponibile memoria sufficiente per il buffer.
Pertanto, un errore riscontrato dopo le mitigazioni sopra indicate in genere richiede l'intervento dell'utente.
Debug
- Riduci l'utilizzo di memoria del modello:
- Diminuisci dimensione batch: la riduzione della dimensione del batch riduce direttamente l'utilizzo della memoria.
- Suddivisione dei parametri: per modelli molto grandi, utilizza tecniche come il parallelismo del modello o la suddivisione per distribuire i parametri nella HBM di più core TPU o host.
- Riduzione della lunghezza della sequenza/del contesto: per i modelli che operano su sequenze (come i modelli linguistici), la riduzione della lunghezza della sequenza di input può ridurre significativamente l'utilizzo di memoria.
- Buffer Donation: utilizza le funzionalità del framework (ad esempio
jax.jit(..., donate_argnums=...)) per segnalare a XLA che determinati buffer di input possono essere sovrascritti e riutilizzati per gli output. - Ottimizza la strategia di checkpoint: anziché salvare l'intero stato del modello contemporaneamente, valuta la possibilità di salvare solo i pesi del modello o di utilizzare una strategia di checkpoint con partizionamento.
- Layout e padding della memoria degli indirizzi:
- La memoria TPU viene allocata in blocchi e il padding può aumentare le dimensioni effettive dei tensori.
- Assicurati che non ci siano perdite di memoria:
- Assicurati che i riferimenti agli oggetti
jax.Arraynon vengano conservati più a lungo del previsto. Il mantenimento degli oggettijax.Arraypotrebbe impedire la deallocazione automatica anche dopo il completamento della compilazione del programma.
- Assicurati che i riferimenti agli oggetti
Strumenti
Attiva il flag tpu_log_allocations_on_oom per cui l'allocatore genererà un
report dettagliato di tutte le allocazioni correnti quando si verifica un errore di memoria insufficiente, il che può essere
fondamentale per il debug.