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çãoAlteração a investigarO que pode impedir um ganho
A descodificação de lotes pequenos gasta tempo a transferir pesosQuantização de pesos suportada; lotes de descodificação maioresKernels 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çãoMenos cabeças KV; quantização KV suportada; atenção eficienteArquitetura do modelo e suporte da precisão da cache
Um prefill grande utiliza intensivamente as unidades matriciaisKernels matriciais eficientes; cálculo com menor precisão suportadoPrompts curtos, lotes pequenos, outras operações
Muitos kernels curtos deixam intervalos sem execução na GPUFusão ou redução do custo de lançamentoMaior 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.