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

CompareO que uma melhoria mostraria
Lançamentos de kernels e intervalos entre elesMenos custo entre operações pequenas
Leituras e escritas em HBMMenos transferências intermédias
Uso de registos e memória partilhadaSe o kernel combinado precisa de mais armazenamento local
Transferências de registos para memória e blocos ativosSe a pressão sobre os recursos reduziu a execução em paralelo
Latência do pedido completoSe 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.