1. Otimização de inferência de modelo
Com a implementação de modelos em vários cenários, a aceleração da inferência de modelos tornou-se há muito tempo uma parte importante da engenharia de IA. Nos últimos anos, grandes modelos baseados na arquitetura Transformer tornaram-se populares, alcançando resultados SoTA em diversas tarefas. Seus altos custos de treinamento e inferência tornam suas práticas de implantação a custos razoáveis ainda mais importantes.
Os desafios enfrentados pela inferência de grandes modelos incluem principalmente os dois pontos a seguir:
- Os enormes requisitos de memória (memória de vídeo) vêm principalmente dos requisitos imediatos de parâmetros e inferência do próprio modelo.
- Para um modelo LLaMA2-30B, carregar o próprio modelo na memória de vídeo requer cerca de 60GiB de memória de vídeo. Durante o processo de inferência, o cache KV de um único token requer cerca de 1,6 MiB de memória de vídeo: 6656(camada dim) * 52(. layer num) *2 ( K & V) * 2(fp16, 2bytes); para uma solicitação de 2.048 tokens, são necessários 3,3GiB de memória de vídeo.
- O paralelismo é ruim porque o processo de geração geralmente é um processo serial em termos de tempo, tornando o processo de decodificação difícil de paralelizar e se tornando um gargalo computacional.
Os métodos comuns de otimização de raciocínio incluem Destilação de Conhecimento (KD), Poda e Quantização, bem como várias soluções propostas para otimização de memória LLM (como Atenção Flash, Atenção Paginada, etc.).
A destilação refere-se à construção direta de um modelo pequeno como modelo de estudante e ao aprendizado supervisionado do conhecimento do modelo original por meio da combinação de rótulos flexíveis e rótulos originais, de modo que o modelo pequeno tenha desempenho comparável ao modelo original e, finalmente, substitua o modelo grande com um modelo pequeno para melhorar a eficiência do raciocínio.
[Fonte da imagem: Destilação de conhecimento: uma pesquisa, 2021, p2]
A poda "diminui" o modelo ao podar pesos sem importância no modelo e melhora a eficiência do raciocínio do modelo. Para garantir as capacidades do modelo, o processo de poda geralmente também precisa ser acompanhado pelo ajuste fino do modelo com base nos dados de treinamento. . De acordo com as diferentes dimensões dos pesos de poda, pode ser dividida em poda estruturada e poda não estruturada.
- Poda estruturada: geralmente podando canais sem importância em blocos de acordo com uma ou mais dimensões do tensor de peso, e mantendo a multiplicação normal da matriz, entretanto, como os canais podados afetam o raciocínio das camadas superiores e inferiores, a precisão lógica da rede precisa; ser verificado.
- Poda não estruturada: poda aleatória de elementos sem importância no tensor de peso, de modo que geralmente mantém a estrutura de peso original, resultando em cálculos de multiplicação esparsos, mas não é adequado para hardware de uso geral, portanto, é necessário hardware especial para implementá-lo.
Atualmente, existem poucas aplicações de poda no LLM. Por exemplo, o seguinte trabalho de poda baseado em reconhecimento de ativação [1] executa principalmente poda não estruturada com base no valor absoluto do próprio peso e no valor absoluto do tensor de entrada. O próprio tensor de peso é esparso e a perda de precisão do modelo não pode atender aos requisitos de engenharia.
[Fonte da imagem: Uma abordagem de remoção simples e eficaz para modelos de linguagem grandes, 2021, p2]
Conforme mostrado abaixo, o trabalho recente sobre poda estruturada [2] usa métodos de pesquisa para encontrar subestruturas no modelo e mantém a precisão do modelo por meio de retreinamento. A precisão do modelo podado é bastante reduzida em comparação com o modelo original. comparado com outros modelos menores com o mesmo número de parâmetros (após poda) para mostrar a importância do seu método.
[Fonte da imagem: Sheared LLaMA: acelerando o pré-treinamento do modelo de linguagem por meio de poda estruturada, 2023, p3]
[Fonte da imagem: huggingface/Sheared-llama-1.3B]
A razão pela qual a quantificação se tornou a primeira escolha para redes neurais e LLM é devido às seguintes vantagens:
- O reflexo intuitivo da redução da memória de vídeo.
- Geralmente, os pesos LLM são armazenados no FP16 e, depois que os pesos são quantizados em int4, o volume será intuitivamente reduzido para 1/4 do tamanho original (na verdade, pode ser um pouco maior devido a incorporações não quantificadas, alocação de memória e outros razões), e os requisitos de recursos para memória de vídeo são bastante reduzidos.
- Aceleração de operadores como W4A16 e W8A16 para aumentar a velocidade de cálculo.
2. Introdução à quantificação
base
A essência da quantificação geralmente é converter os parâmetros do modelo, ou o processo de raciocínio de todo o modelo, de ponto flutuante para número inteiro.
O parâmetro de quantização geralmente consiste em dois valores: escala e ponto zero. O primeiro é um ponto flutuante e o último é um número inteiro. Assumindo que x é um tensor (pode ser um peso ou uma variável intermediária para raciocínio), o processo de quantificação pode ser expresso da seguinte forma,
Use b para representar a largura do bit de quantização, q{min} e q{max} representam respectivamente o intervalo do intervalo de valores inteiros. Por exemplo, a quantização int-8 pode levar [-128.127], ou seja, q{min}=. -2^(b-1 )=-128, q{max}=2^(b-1)-1=127, clamp(a;q{min},q{max}) significa que o valor de entrada a é com base na operação de truncamento de intervalo [q{min}, q{max }], x{int} representa o resultado quantizado, s e z representam a escala dos parâmetros de quantização e o ponto zero.
【图片出处:Uma pesquisa de métodos de quantização para inferência eficiente de redes neurais, 2021, p5 ;Uma introdução à quantização de modelos de grandes linguagens, p12】
O processo de desquantização de inteiro para ponto flutuante é o seguinte,
Em relação aos parâmetros de quantização, existem muitos algoritmos baseados em busca, otimização, LKD (destilação camada por camada) e outros algoritmos para calcular suas soluções ótimas, minimizando assim a perda de precisão causada pela quantização e o método de cálculo mais direto de escala e; Isso é baseado em elementos tensores min/max.
A seguir está um exemplo de código simples que representa a quantização do tensor x do tipo inteiro fp32 para o tipo inteiro int8 e, em seguida, a quantização inversa de volta para fp32:
Um exemplo do procedimento x->x{int}->x_hat é o seguinte:
x antes da quantização:
Após a quantização x_hat:
Simétrico/assimétrico
Comparada com a quantização assimétrica, a definição de quantização simétrica é que o intervalo de valores inteiros mapeados pela quantização é simétrico com base no valor 0, ou seja, o ponto zero da fórmula acima é 0, qmax = -qmin, o que torna a expressão forma de quantização mais simplificada.
A quantização assimétrica é benéfica para a utilização total da faixa de quantização. Por exemplo, a saída do tensor de excitação por Conv+ReLU tem todos os valores positivos. Se a quantização simétrica for usada, todos os pontos flutuantes serão mapeados para a faixa [0~127], metade da faixa não será utilizada e sua precisão de quantização não será. tão bom quanto a quantização assimétrica.
[Fonte da imagem: Uma pesquisa de métodos de quantização para inferência eficiente de redes neurais, 2021, p5]
Na prática, muitas vezes é escolhido realizar quantização simétrica no tensor de peso e quantização assimétrica no tensor de entrada. A seguir está uma análise do white paper de quantificação da Qualcomm. Por exemplo, quando a quantização assimétrica é selecionada para pesos e entradas, tomando como exemplo a multiplicação de matrizes da camada Linear, a expressão é expandida da seguinte forma:
- O primeiro item é a operação de multiplicação do tensor inteiro, que é uma operação imediata necessária;
- As operações do terceiro e quarto itens incluem a multiplicação dos pesos de escala, zero e inteiro. Todos são previstos antecipadamente e podem, portanto, ser calculados antecipadamente e somados como compensações;
- O cálculo do segundo item depende de x{int}, que precisa ser calculado imediatamente para cada inferência, o que causará poder computacional adicional.
Portanto, quando mudamos a quantização de peso para quantização simétrica (zW = 0), a fórmula acima é simplificada da seguinte forma. No cálculo em tempo real, precisamos apenas calcular a multiplicação da matriz do primeiro item, e o segundo item é o. item de viés pré-calculado:
Quando ambos são quantizados simetricamente, as expressões são simplificadas da seguinte forma:
Comparando o cálculo de ponto flutuante W{x} no modelo original, W{int}x{int} é a multiplicação entre inteiros e inteiros. O último é muito mais rápido na GPU Nvidia do que o primeiro. a velocidade é bastante acelerada.
3. Quantificação de LLM
Desafios na quantização LLM
Do ponto de vista do desempenho do modelo, uma premissa que a quantificação deve resolver do início ao fim é como manter a precisão do modelo quantizado, ou seja, fazer com que os usuários do modelo sintam que o modelo quantizado pode manter o desempenho original enquanto melhora o eficiência do raciocínio.
As operações que precisam ser quantificadas na rede neural são principalmente a camada convolucional Conv(x;W) e a camada totalmente conectada Wx, ou seja, a quantização de peso (WQ) e excitação de W e x respectivamente de acordo com as operações descritas na parte anterior. Quantificação (Quantização de Ativação, AQ).
Ao contrário do modelo CNN ou do modelo de transformador pequeno, o tensor de excitação gerado pela multiplicação de matrizes do modelo de transformador grande geralmente possui mais outliers, ou seja, o grupo de pontos formado pela maioria dos pontos da distribuição de valores está distante do valor desses elementos. valores com grande valor absoluto mas baixa proporção aumentam a dificuldade de quantificação. Como escolher outliers geralmente é uma grande dificuldade no trabalho de quantificação. Se você considerar muito, o intervalo de quantificação será muito grande e o intervalo de expressão de quantificação será reduzido. Se você truncá-lo demais, esses valores serão absolutos. os valores geralmente estarão no. Tem um impacto maior nos resultados na inferência do modelo, levando a um desempenho insatisfatório do modelo, e este último é particularmente óbvio na quantificação LLM.
As figuras abaixo mostram as estatísticas de valor dos elementos de uma determinada camada de tensores de entrada do Resnet18 e Opt-13B, respectivamente. O sigma representa o desvio padrão de suas respectivas distribuições. O valor máximo da entrada do Resnet18 é de cerca de 28 sigma e a proporção dos valores absolutos. exceto 6sigma é 0,05% e O valor máximo de entrada da rede Opt-13B é 325 sigma, e a proporção de valores absolutos diferentes de 6 sigma é 0,2%. Em termos de efeito de quantificação, a precisão int-8 do Resnet18 basicamente não tem perda, enquanto a precisão do modelo int-8 do Opt-13B entrou em colapso.
[Fonte da imagem: Uma introdução à quantização de modelos de linguagem grande, p20]
Em resposta ao desafio da quantificação de incentivos, existem algumas soluções que tentam reduzir a precisão da quantização, como a ideia proposta por SmoothQuant.
[Fonte da imagem: SmoothQuant, p4]
Na multiplicação de matrizes, eles reduzem o valor do tensor de entrada ) e diag(s)·W. Isto reduz a dificuldade de quantificação do tensor X, garantindo ao mesmo tempo que o produto da operação de multiplicação permanece inalterado. Na engenharia real, o erro de quantização causado por este esquema de quantização ainda tem um impacto relativamente óbvio no efeito de raciocínio de grandes modelos, e há erros óbvios mesmo na quantização de precisão int-8. Por exemplo, os seguintes resultados da aplicação SmoothQuant para Llama2-7B mostram que sua perplexidade é muito baixa e difícil de aplicar na prática.
Portanto, a maioria das soluções práticas na implantação atual da engenharia são soluções de quantificação apenas de peso, ou seja, abrindo mão da quantificação da ativação.
GPTQ
GPTQ é o esquema de quantificação mais antigo aceito para implantação de engenharia. O efeito de quantificação do W8A16 ou W4A16 é próximo do modelo original na maioria dos cenários, e o processo de quantificação é muito rápido.
Processo de quantificação
Tomando como exemplo a operação unitária básica de multiplicação de matrizes, com base no erro quadrático médio do produto antes e depois da quantização apenas de peso, a seguinte função de otimização pode ser escrita,
W é o peso da camada linear no Transformer e X representa sua entrada correspondente. O processo de quantização offline consiste em quantizar módulo por módulo (Transformador) e camada por camada (Q, K, V, O, Fc1, Fc2).
Os parâmetros e dados são definidos da seguinte forma:
- W∈R^{K×M},X∈R^{M×N},Y=W×X∈R^{K ×N}
- conjunto de calibração: parte dos dados é usada para inferência, usada para visualizar a faixa de valores do tensor de entrada de cada camada e quantizada com base nisso.
O processo de quantificação específico é o seguinte:
- Calcule o Hessiano (a função de otimização acima é para o Hessiano de W_hat, não o Hessiano na retropropagação) e adicione o termo de perturbação:
- classificação de ordem de ato (desc_act, colunas com intervalos de valores semelhantes são quantificadas juntas), com base em diag (H), as colunas de W são reorganizadas com base na dimensão M. Da mesma forma, H é reorganizado em duas dimensões de acordo.
- Encontre o inverso H^(-1) (decomposição de Cholesky).
- Para W ao longo da dimensão M, quantize bloco por bloco da esquerda para a direita, tamanho de bloco B=128, e a parte não quantizada no lado direito é atualizada com base em H^(-1) para compensar a perda de quantização.
- (Loop interno) Para cada bloco, quantize coluna por coluna, calcule o erro e atualize as colunas não quantizadas dentro do bloco com base no erro.
- (loop externo) Após operar o bloco, atualize todas as colunas seguintes:
Tamanho do grupo
- Se o tamanho do grupo não for especificado, o padrão é g=-1. Os parâmetros de quantização são contados em unidades de todas as colunas e o peso de cada linha é quantificado. Para W∈R^{K×M}, o número de. parâmetros de quantização são K×1.
- Se o tamanho do grupo for especificado, por exemplo, g=128, os parâmetros de quantização serão contados em unidades de 128 colunas, e o peso de cada linha será quantificado. Para W∈R^{K×M}, o número de. parâmetros de quantização são K×(M/g).
Reorganizar desc_act
De acordo com a Matriz Hessiana H, W é reorganizado com base na dimensão M baseada em diag(H). O objetivo é priorizar as colunas de peso correspondentes à ativação com valores absolutos maiores. Essas colunas são consideradas colunas mais importantes que afetam os resultados do raciocínio. Portanto, espera-se produzir o menor erro possível na quantificação dessas colunas. Desloca mais erros de quantização para colunas posteriores e menos importantes.
Alguns experimentos mostram que o efeito de desc_act na perda de quantização é um truque eficaz na maioria das tarefas.
Perplexidade de Pigmalião-7B com GPTQ [7]
[Fonte da imagem: https://huggingface.co/reeducator/vicuna-13b-free/discussions/22]
operador
Estritamente falando, o W4A16 baseado apenas no peso não tem muita melhoria de eficiência em comparação com o W16A16 original, e o processo quant/dequant também é adicionado à inferência à medida que apenas o peso se torna a corrente principal da quantificação LLM e sua aplicação está se tornando mais; e mais Existem muitos trabalhos de código aberto baseados na escrita de operadores eficientes W4A16 para acelerar o raciocínio de algoritmos quantizados. Por exemplo, o pacote python AutoGPTQ do GPTQ foi integrado à ferramenta de código aberto exllama, que reescreve a computação paralela da multiplicação quantizada. baseado em tritão e CUDA. Em
exllama/exllama_ext/matrix.cuh você pode ver a implementação de out=W_hat·x=(W{int}-z)s·x=(W{int}-z)x·s de dot_product8_h.
[Fonte da imagem: https://github.com/turboderp/exllama/blob/3b013cd53c7d413cf99ca04c7c28dd5c95117c0d/exllama_ext/matrix.cuh#L86]
AWQ
Comparado ao GPTQ, que projeta soluções baseadas em problemas de otimização, o AWQ é uma solução quantitativa baseada em busca.
Usando Q(·) para representar o processo de quantização e quantização inversa, o processo de quantização antes da modificação é o seguinte:
Após a modificação, o processo de quantização é o seguinte, adicionando escala a W:
procurar
O nome completo do AWQ é Quantização de Peso com reconhecimento de ativação, o que significa que a influência do valor de ativação é considerada no processo de quantificação de peso. O ponto de partida também se baseia no fato de que em cada canal de Peso, o canal com maior valor de Ativação correspondente é relativamente importante, e vice-versa, sua importância é então multiplicada por um fator de escala Δ para refletir sua importância e o valor. de Δ é igual a O intervalo é projetado pelo valor do tensor da ativação de entrada.
O padrão de medição da pesquisa é baseado na comparação dos resultados de saída antes e depois da quantização da camada linear, e aquele com o menor resultado MSE é a solução ideal.
Efeito
Em termos de desempenho do modelo, o coeficiente de escala ideal é encontrado através da busca de escala camada por camada para obter a solução com o menor erro de quantização. A seguinte comparação de efeitos do artigo AWQ mostra os resultados de quantificação no teste de duas gerações de Llama. da perspectiva do Perplexity, um pouco melhor que o GPTQ e a versão classificada do GPTQ.
[Fonte da imagem: AWQ, p6]
A julgar pela precisão das tarefas reais, a precisão do AWQ é comparável à versão act_order do GPTQ (GPTQ-R), enquanto a velocidade é melhor que a última.
[Fonte da imagem: AWQ, p5]
Em termos de desempenho computacional do modelo, GPTQ possui uma operação de reordenação, e a multiplicação de matrizes é MV (matriz×vetor), que é um acesso descontínuo à memória, enquanto AWQ não possui uma operação de reordenação, e a multiplicação de matrizes é ( matriz×matriz), que é mais rápido.
4. Resumo
Em relação ao atual desempenho SOTA do trabalho de quantificação LLM, ele é basicamente baseado no modo de quantização somente de peso. A redução da memória de vídeo necessária para rodar o modelo na GPU é sua principal contribuição.
Do desempenho do modelo, porque há perda inevitável de quantização, e o modelo LLM é geralmente muito mais sensível à quantização do que o modelo CNN tradicional, embora o desempenho do LLM após a quantização não seja muito diferente daquele antes da quantização em muitas tarefas , mas em Você ainda poderá não conseguir executar algumas tarefas.
Do ponto de vista da aceleração do modelo, a quantificação apenas do peso promove o trabalho de aceleração subjacente, que é basicamente acelerado em operadores de multiplicação como W4A16, W3A16 e W8A16. A julgar pelos dados teóricos fornecidos no artigo, em comparação com o modelo FP16, é. geralmente é apenas 1,x ~ 3,x vezes a melhoria da velocidade, mas o efeito de implantação real pode ser inferior a esse valor, e seu efeito de aceleração é muito inferior ao método de quantização tradicional de W4A4, W8A8 e outros operadores de multiplicação de número inteiro completo .
De modo geral, o trabalho quantitativo na área de LLM ainda é preliminar. Se a precisão do desempenho do modelo for muito alta em tarefas reais, recomenda-se o uso de algoritmos e ferramentas baseados exclusivamente no cache KV para melhorar o rendimento da memória da unidade, como. Atenção Flash-2, Atenção Paginada, etc.
5. Referência
1. Uma abordagem de poda simples e eficaz para grandes modelos de linguagem, 2023.
2. Sheared LLaMA: Acelerando o pré-treinamento do modelo de linguagem por meio de poda estruturada, 2023.
3. Livro Branco sobre Quantização de Redes Neurais, 2021.
4. SmoothQuant: Quantização pós-treinamento precisa e eficiente para modelos de linguagem grande, 2023.
5. GPTQ: Quantização Pós-Treinamento Precisa para Transformadores Pré-treinados Gerativos, 2023.
6. AWQ: Quantização de peso com reconhecimento de ativação para compressão e aceleração LLM, 2023.
7. Algumas avaliações sobre o desempenho do GPTQ.
*Texto/ xujiong
Este artigo é original da Dewu Technology. Para artigos mais interessantes, consulte: Site oficial da Dewu Technology.
A reimpressão sem a permissão da Dewu Technology é estritamente proibida, caso contrário, a responsabilidade legal será processada de acordo com a lei!
A equipe da Google Python Foundation foi demitida. O Google confirmou as demissões, e as equipes envolvidas em Flutter, Dart e Python correram para a lista de favoritos do GitHub - Como as linguagens e estruturas de programação de código aberto podem ser tão fofas? Xshell 8 abre teste beta: suporta protocolo RDP e pode se conectar remotamente ao Windows 10/11 Quando os passageiros se conectam ao WiFi ferroviário de alta velocidade , a "maldição de 35 anos" dos codificadores chineses surge quando eles se conectam à alta velocidade. rail WiFi. A primeira ferramenta de pesquisa de IA do MySQL com suporte de longo prazo versão 8.4 GA Perplexica : Completamente de código aberto e gratuito, uma alternativa de código aberto ao Perplexity Os executivos da Huawei avaliam o valor do código aberto Hongmeng: Ele ainda tem seu próprio sistema operacional, apesar da supressão contínua. por países estrangeiros. A empresa alemã de software automotivo Elektrobit abriu o código-fonte de uma solução de sistema operacional automotivo baseada no Ubuntu.