Categoria:ambiente de execução: falha na alocação de buffer
Esse erro indica que o alocador de memória do tempo de execução do XLA:TPU não encontrou um bloco de memória adequado na HBM do acelerador para a alocação solicitada.
Exemplo de mensagem de erro:
ValueError: RESOURCE_EXHAUSTED: Error allocating device buffer: Attempting to allocate 8.00M. That was not possible. There are 6.43M free.; (0x0x1_HBM0)
Backends do XLA:TPU
Visão geral
Esse erro é gerado em
- falhas de alocação de buffer iniciada pelo usuário via
jax.device_putou - falhas nas alocações de saída do programa programado pelo usuário.
Essas falhas geralmente ocorrem por dois motivos:
- Falta de memória (OOM): o usuário está tentando alocar um bloco de memória maior que a quantidade total de memória livre disponível na HBM da TPU.
- Fragmentação de memória:a alocação falha porque nenhum bloco livre contíguo no espaço de memória é grande o suficiente para atender ao tamanho solicitado. A quantidade total de memória livre é suficiente para a alocação, mas está espalhada pelo espaço de memória em blocos pequenos e não contíguos.
O ambiente de execução da TPU tem vários mecanismos para tentar novamente falhas de alocação, incluindo:
- Se houver desalocações na fila, o ambiente de execução vai tentar novamente as alocações com falha.
- Em OOMs causados por uma fragmentação, o ambiente de execução pode acionar automaticamente uma desfragmentação e uma nova tentativa.
- O tempo de execução da TPU prioriza alocações de buffer em vez de manter programas carregados. Se uma alocação de buffer falhar devido à HBM insuficiente, o sistema vai desalojar programas de TPU carregados até que haja memória suficiente para o buffer.
Portanto, um erro encontrado após as mitigações acima geralmente exige uma ação do usuário.
Depuração
- Reduza o consumo de memória do modelo:
- Diminuir o tamanho do lote: reduzir o tamanho do lote diminui diretamente o uso de memória.
- Fragmentação de parâmetros: para modelos muito grandes, use técnicas como paralelismo de modelo ou fragmentação para distribuir parâmetros na HBM de vários núcleos ou hosts de TPU.
- Diminua o comprimento da sequência/contexto: para modelos que operam em sequências (como modelos de linguagem), reduzir o comprimento da sequência de entrada pode diminuir significativamente a área de ocupação da memória.
- Doação de buffer: use recursos do framework (como
jax.jit(..., donate_argnums=...)) para sinalizar ao XLA que determinados buffers de entrada podem ser substituídos e reutilizados para saídas. - Otimize a estratégia de checkpoint: em vez de salvar todo o estado do modelo de uma vez, salve apenas os pesos do modelo ou use uma estratégia de checkpoint fragmentada.
- Layout e padding da memória de endereço:
- A memória da TPU é alocada em partes, e o preenchimento pode aumentar o tamanho real dos tensores.
- Verifique se não há vazamentos de memória:
- Verifique se as referências a objetos
jax.Arraynão estão sendo mantidas por mais tempo do que o pretendido. Manter objetosjax.Arraypode impedir a desalocação automática, mesmo depois que a compilação do programa for concluída.
- Verifique se as referências a objetos
Ferramentas
Ative a flag tpu_log_allocations_on_oom para que o alocador gere um relatório detalhado de todas as alocações atuais quando ocorrer um OOM, o que pode ser muito útil para depuração.