Como a fusão de kernels CUDA acelera a inferência de LLM
Tradução automática
Este artigo foi traduzido automaticamente a partir da versão original em inglês.
A fusão de kernels CUDA combina operações que, de outro modo, seriam executadas como kernels GPU separados. Pode reduzir o custo de lançamento e evitar escrever um tensor intermédio na memória da GPU apenas para o voltar a ler imediatamente. É útil quando estes custos representam uma parte significativa da latência de inferência.
Siga os dados intermédios
Considere uma adição residual seguida de normalização. Kernels separados podem escrever o resultado da adição na memória principal da GPU e voltar a lê-lo para a normalização. Uma implementação fundida compatível pode reutilizar valores intermédios dentro do kernel. Isto poupa transferências; não elimina as operações matemáticas nem os seus requisitos de correção.
A fusão também se aplica a operações maiores. DeepFusionKernel estuda a fusão de um cálculo completo da rede de propagação direta SwiGLU, incluindo as suas multiplicações de matrizes. Vai além da combinação de funções de ativação elemento a elemento.
FlashNorm usa uma transformação diferente: incorpora o fator de escala aprendido de RMSNorm numa operação linear subsequente e adia o reajuste de escala.
Verifique se a fusão ajudou
| Compare | O que uma melhoria mostraria |
|---|---|
| Lançamentos de kernels e intervalos entre eles | Menos custo entre operações pequenas |
| Leituras e escritas em HBM | Menos transferências intermédias |
| Uso de registos e memória partilhada | Se o kernel combinado precisa de mais armazenamento local |
| Transferências de registos para memória e blocos ativos | Se a pressão sobre os recursos reduziu a execução em paralelo |
| Latência do pedido completo | Se a alteração do kernel fez diferença para os utilizadores |
O guia de otimização de Hopper explica os limites de recursos que restringem o trabalho GPU ativo em simultâneo. Combinar operações pode aumentar o uso de registos, provocar transferências de registos para memória ou limitar os blocos que são executados ao mesmo tempo. Por isso, um kernel fundido maior pode ser mais lento para algumas formas de tensor.
Mantenha constantes o modelo, a precisão, a GPU, o comprimento da entrada e o tamanho do lote. Verifique os resultados numéricos e a qualidade na tarefa, além do tempo. Compare também a descodificação com lotes pequenos com o prefill com lotes maiores: reduzir o custo de lançamento pode ser muito mais relevante para operações curtas do que para cálculos matriciais longos.
O guia de engenharia: kernels CUDA e fusão relaciona estes métodos com kernels matriciais quantizados.