Codice di errore: E0100

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 nell'HBM dell'acceleratore per l'allocazione richiesta.

Messaggio di errore di esempio:

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_put

o

  • Errori di allocazione dell'output del programma pianificato dall'utente.

Questi errori sono in genere causati da due 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 in caso di errori di allocazione, tra cui:

  • Se sono presenti deallocazioni in coda, il runtime riprova ad allocare le risorse non riuscite.
  • In caso di errori di memoria 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 descritte in genere richiede l'intervento dell'utente.

Debug

  • Ridurre il footprint della memoria del modello
    • Diminuisci la dimensione del 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.
    • Ridurre la lunghezza della sequenza/finestra contestuale:per i modelli che operano su sequenze (come i modelli linguistici), la riduzione della lunghezza della sequenza di input può diminuire significativamente il footprint della memoria.
    • Donazione di buffer: 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. Per maggiori dettagli, leggi la sezione Donazione del buffer.
    • 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 checkpointing suddivisa.
  • 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.Array non vengano conservati più a lungo del previsto. Il mantenimento degli oggetti jax.Array potrebbe impedire la deallocazione automatica anche dopo il completamento della compilazione del programma.

Consulta anche Codice di errore: E1000 per altre strategie che puoi utilizzare per ridurre la quantità di memoria utilizzata da ogni programma.

Strumenti

Attiva il flag tpu_log_allocations_on_oom per cui l'allocatore eseguirà il dump di un report dettagliato di tutte le allocazioni correnti quando si verifica un errore di memoria insufficiente, il che può essere fondamentale per il debug.