Porque é que a descodificação de um LLM é limitada pela memória e o prefill pelo cálculo?
Tradução automática
Este artigo foi traduzido automaticamente a partir da versão original em inglês.
A descodificação de um LLM é frequentemente limitada pela memória porque um lote pequeno reutiliza cada peso do modelo apenas algumas vezes antes de carregar os pesos seguintes. O prefill de sequências longas ou de lotes suficientemente grandes reutiliza os pesos para muitos tokens do prompt, pelo que o cálculo matricial pode tornar-se o recurso limitante. Estas são condições da carga de trabalho, e não propriedades permanentes de cada fase.
A intensidade aritmética ajuda a decidir se é necessário reduzir a movimentação de dados ou melhorar a execução de operações matriciais.
Comparar os cálculos com os bytes transferidos
A intensidade aritmética é o número de operações de vírgula flutuante realizadas por byte transferido da memória. O modelo roofline compara-a com a capacidade máxima de cálculo dividida pela largura de banda da memória.
As especificações da H100 SXM da NVIDIA indicam aproximadamente 989 TFLOPS para cálculos densos FP16/BF16 nos Tensor Cores e 3.35 TB/s de largura de banda da memória. O valor anunciado de 1,979 TFLOPS pressupõe esparsidade estruturada. A razão entre os dois é de cerca de 295 FLOPs por byte. Este é um limite teórico calculado com especificações de hardware correspondentes.
Uma multiplicação simplificada de uma matriz densa por um vetor realiza cerca de duas operações por peso de dois bytes: aproximadamente um FLOP por byte. Um descodificador com um lote de tamanho um não consegue aproveitar a capacidade máxima de cálculo matricial da GPU nestas condições. Lotes maiores permitem que um peso carregado contribua para o cálculo de vários tokens. O prefill também reutiliza os pesos para os tokens do prompt. Splitwise descreve estas diferenças entre fases.
Escolher uma alteração com base no limite medido
| Observação | Alteração a investigar | O que pode impedir um ganho |
|---|---|---|
| A descodificação de lotes pequenos gasta tempo a transferir pesos | Quantização de pesos suportada; lotes de descodificação maiores | Kernels de quantização, perda de qualidade, limites de latência |
| A descodificação com contexto longo gasta tempo a ler o histórico de atenção | Menos cabeças KV; quantização KV suportada; atenção eficiente | Arquitetura do modelo e suporte da precisão da cache |
| Um prefill grande utiliza intensivamente as unidades matriciais | Kernels matriciais eficientes; cálculo com menor precisão suportado | Prompts curtos, lotes pequenos, outras operações |
| Muitos kernels curtos deixam intervalos sem execução na GPU | Fusão ou redução do custo de lançamento | Maior utilização de registos e memória partilhada |
Após cada alteração, meça tanto a latência até ao primeiro token como os intervalos entre os tokens seguintes. Um lote maior pode aumentar o total de tokens por segundo e, ao mesmo tempo, tornar cada pedido mais lento. A razão entre os parâmetros do hardware identifica um limite possível; um registo de execução mostra de que recurso a sua carga de trabalho está realmente à espera.
Guia de engenharia: inferência limitada pela memória ou pelo cálculo inclui o diagrama roofline e otimizações específicas de cada fase.