Ayoola Olafenwa

Guia passo a passo sobre como acelerar grandes modelos de linguagem

Rumo à ciência de dados
fonte

Implantação de grandes modelos de linguagem (LLMs)

Vivemos em uma época incrível de grandes modelos de linguagem como ChatGPT, GPT-4 e Claude, que podem realizar diversas tarefas incríveis. Em praticamente todos os domínios, desde a educação, os cuidados de saúde até às artes e aos negócios, os Grandes Modelos Linguísticos estão a ser utilizados para facilitar a eficiência na prestação de serviços. No ano passado, muitos modelos de linguagem grande de código aberto brilhantes, como Llama, Mistral, Falcon e Gemma, foram lançados. Esses LLMs de código aberto estão disponíveis para uso de todos, mas sua implantação pode ser muito desafiadora, pois podem ser muito lentos e exigir muito poder de computação da GPU para serem executados em tempo real. Diferentes ferramentas e abordagens foram criadas para simplificar a implantação de grandes modelos de linguagem.

Muitas ferramentas de implantação foram criadas para servir LLMs com inferência mais rápida, como vLLM, c2translate, TensorRT-LLM e llama.cpp. Técnicas de quantização também são usadas para otimizar GPUs para carregar modelos de linguagem muito grandes. Neste artigo, explicarei como implantar modelos de linguagem grande com vLLM e quantização.

Latência e taxa de transferência

Alguns dos principais fatores que afetam o desempenho de velocidade de um modelo de linguagem grande são os requisitos de hardware da GPU e o tamanho do modelo. Quanto maior o tamanho do modelo, mais poder de computação da GPU será necessário para executá-lo. Métricas de benchmark comuns usadas para medir o desempenho de velocidade de um modelo de linguagem grande são Latência e Taxa de transferência.

Latência: Este é o tempo necessário para um modelo de linguagem grande gerar uma resposta. Geralmente é medido em segundos ou milissegundos.

Taxa de transferência: Este é o número de tokens gerados por segundo ou milissegundo a partir de um modelo de linguagem grande.

Instale os pacotes necessários

Abaixo estão os dois pacotes necessários para executar um modelo de linguagem grande: Hugging Face transformadores e acelerar.

pip3 install transformers
pip3 install accelerate

O que é Phi-2?

Phi-2 é um modelo básico de última geração da Microsoft com 2,7 bilhões de parâmetros. Foi pré-treinado com uma variedade de fontes de dados, desde código até livros didáticos. Aprender mais sobre Phi-2 daqui.

Comparando latência e rendimento do LLM com Hugging Face Transformers

Saída gerada

Latency: 2.739394464492798 seconds
Throughput: 32.36171766303386 tokens/second
Generate a python code that accepts a list of numbers and returns the sum. (1, 2, 3, 4, 5)
A: def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total

print(sum_list((1, 2, 3, 4, 5)))

Detalhamento do código passo a passo

Linha 6–10: Carregado Phi-2 modelo e tokenizou o prompt “Gere um código python que aceite uma lista de números e retorne a soma.

Linha 12-18: Gerou uma resposta do modelo e obteve o latência calculando o tempo necessário para gerar a resposta.

Linha 21–23: Obteve o comprimento total de tokens na resposta gerada, dividiu-o pelo latência e calculou o Taxa de transferência.

Este modelo foi executado em um A1000 (GPU de 16 GB) e atinge um latência de 2,7 segundos e um rendimento de 32 tokens/segundo.

vLLM é uma biblioteca LLM de código aberto para servir modelos de linguagem grandes em baixo latência e alto Taxa de transferência.

Como funciona o vLLM

O transformador é o alicerce dos grandes modelos de linguagem. A rede do transformador usa um mecanismo chamado mecanismo de atençãoque é usado pela rede para estudar e compreender o contexto das palavras. O mecanismo de atenção é composto por um conjunto de cálculos matemáticos de matrizes conhecidos como chaves de atenção e valores. A memória utilizada pela interação dessas chaves de atenção e valores afeta a velocidade do modelo. vLLM introduziu um novo mecanismo de atenção chamado Atenção Paginada que gerencia eficientemente a alocação de memória para as chaves e valores de atenção do transformador durante a geração de tokens. A eficiência de memória do vLLM provou ser muito útil na execução de modelos de linguagem grande com baixa latência e alto rendimento.

Esta é uma explicação de alto nível de como funciona o vLLM. Para saber detalhes técnicos mais detalhados, visite a documentação do vLLM.

Instale o vLLM

pip3 install vllm==0.3.3

Execute Phi-2 com vLLM

Saída gerada

Latency: 1.218436622619629seconds
Throughput: 63.15334836428132tokens/second
(1, 2, 3, 4, 5)
A: def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total

numbers = (1, 2, 3, 4, 5)
print(sum_list(numbers))

Detalhamento do código passo a passo

Linha 1–3: Pacotes necessários importados do vLLM para execução Phi-2.

Linha 5–8: Carregado Phi-2 com vLLM, definiu o prompt e definiu parâmetros importantes para executar o modelo.

Linha 10–16: Gerou a resposta do modelo usando llm.generate e calculou o latência.

Linha 19–21: Obteve o comprimento total de tokens gerados a partir da resposta, dividiu o comprimento dos tokens pela latência para obter o Taxa de transferência.

Linha 23–24: Obteve o texto gerado.

eu corri Phi-2 com vLLM no mesmo prompt, “Gere um código python que aceite uma lista de números e retorne a soma.” Na mesma GPU, uma A1000 (GPU de 16 GB), o vLLM produz um latência de 1,2 segundos e um Taxa de transferência de 63 tokens/segundoem comparação com os transformadores Hugging Face latência de 2,85 segundos e um Taxa de transferência de 32 tokens/segundo. Executar um modelo de linguagem grande com vLLM produz o mesmo resultado preciso que usar Hugging Face, com latência muito menor e rendimento mais alto.

Observação: As métricas (latência e rendimento) que obtive para vLLM são benchmarks estimados para desempenho de vLLM. A velocidade de geração do modelo depende de muitos fatores, como a duração do prompt de entrada e o tamanho da GPU. De acordo com o relatório oficial do vLLM, executar um modelo LLM em uma GPU poderosa como o A100 em um ambiente de produção com vLLM alcança Rendimento 24x maior do que Abraçando Transformadores de Rosto.

Comparativo de latência e taxa de transferência em tempo real

A maneira como calculei a latência e a taxa de transferência para executar o Phi-2 é experimental e fiz isso para explicar como o vLLM acelera o desempenho de um modelo de linguagem grande. No caso de uso real de LLMs, como um sistema baseado em chat onde o modelo gera um token à medida que é gerado, medir a latência e a taxa de transferência é mais complexo.

Um sistema baseado em chat é baseado em tokens de saída de streaming. Alguns dos principais fatores que afetam as métricas LLM são Hora do primeiro token (o tempo necessário para um modelo gerar o primeiro token), Tempo por token de saída (o tempo gasto por token de saída gerado), o comprimento da sequência de entrada, a saída esperada, o total de tokens de saída esperadose o tamanho do modelo. Em um sistema baseado em chat, a latência geralmente é uma combinação de Hora do primeiro token e Tempo por token de saída multiplicado pelo total de tokens de saída esperados.

Quanto maior o comprimento da sequência de entrada passada para um modelo, mais lenta será a resposta. Algumas das abordagens usadas na execução de LLMs em tempo real envolvem o agrupamento de solicitações de entrada dos usuários ou prompts para realizar inferências nas solicitações simultaneamente, o que ajuda a melhorar o rendimento. Geralmente, usar uma GPU poderosa e servir LLMs com ferramentas eficientes como vLLM melhora a latência e o rendimento em tempo real.

Execute a implantação do vLLM no Google Colab

A quantização é a conversão de um modelo de aprendizado de máquina de uma precisão mais alta para uma precisão mais baixa, reduzindo os pesos do modelo em pedaços menores, geralmente 8 bits ou 4 bits. Ferramentas de implantação como vLLM são muito úteis para servir inferência de modelos de linguagem grande com latência muito baixa e alto rendimento. Somos capazes de correr Phi-2 com Hugging Face e vLLM convenientemente na GPU T4 no Google Colab porque é um LLM menor com 2,7 bilhões de parâmetros. Por exemplo, um modelo de 7 bilhões de parâmetros como Mistral 7B não pode ser executado no Colab com Hugging Face ou vLLM. A quantização é melhor para gerenciar requisitos de hardware de GPU para modelos de linguagem grande. Quando a disponibilidade da GPU é limitada e precisamos executar um modelo de linguagem muito grande, a quantização é a melhor abordagem para carregar LLMs em dispositivos restritos.

Bits e Bytes

É uma biblioteca python construída com funções de quantização personalizadas para reduzir os pesos do modelo em bits mais baixos (8 bits e 4 bits).

Instalar BitsandBytes

pip3 install bitsandbytes

Quantização do Modelo Mistral 7B

Mistral 7Bum modelo de 7 bilhões de parâmetros da MistralAI, é um dos melhores modelos de linguagem grande de código aberto de última geração. Vou seguir um processo passo a passo de execução Mistral 7B com diferentes técnicas de quantização que podem ser executadas na GPU T4 no Google Colab.

Quantização com precisão de 8 bits: Esta é a conversão do peso de um modelo de aprendizado de máquina em precisão de 8 bits. Bits e Bytes foi integrado aos transformadores Hugging Face para carregar um modelo de linguagem usando o mesmo código Hugging Face, mas com pequenas modificações para quantização.

Linha 1: Importou os pacotes necessários para executar o modelo, incluindo o BitsandBytesConfig biblioteca.

Linha 3–4: Definiu a configuração de quantização e definiu o parâmetro carregar_em_8 bits como verdadeiro para carregar os pesos do modelo em 8 bits precisão.

Linha 7–9: Passe a configuração de quantização para a função de carregamento do modelo, defina o parâmetro mapa_do_dispositivo para bits e bytes para alocar automaticamente memória GPU apropriada para carregar o modelo. Finalmente carreguei os pesos do tokenizer.

Quantização com precisão de 4 bits: Esta é a conversão do peso de um modelo de aprendizado de máquina em 4-biprecisão.

O código para carregar Mistral 7B na precisão de 4 bits é semelhante à de 8 bits precisão, exceto por algumas alterações:

  • mudado carregar_em_8 bits para carregar_em_4 bits.
  • Um novo parâmetro bnb_4bit_compute_dtype é introduzido no BitsandBytesConfig para realizar o cálculo do modelo em bfloat16. bfloat16 é o tipo de dados de computação para carregar os pesos do modelo para uma inferência mais rápida. Pode ser usado com ambos 4 bits e 8 bits precisões. Se estiver em 8 bits você só precisa alterar o parâmetro de bnb_4bit_compute_dtype para bnb_8bit_compute_dtype.

NF4 (flutuação normal de 4 bits) e Dupla Quantização

NF4 (flutuação normal de 4 bits) do QLoRA é uma abordagem de quantização ideal que produz melhores resultados do que a quantização padrão de 4 bits. Está integrado com dupla quantização, onde a quantização ocorre duas vezes; os pesos quantizados do primeiro estágio de quantização são passados ​​para o próximo estágio de quantização, produzindo valores ideais de faixa de flutuação para os pesos do modelo. De acordo com o relatório do artigo QLoRA, NF4 com dupla quantização não sofre queda no desempenho da precisão. Leia detalhes técnicos mais detalhados sobre NF4 e Dupla Quantização no artigo QLoRA:

Linha 4–9: Parâmetros extras foram definidos Configuração de BitsandBytes:

  • carregar_4 bits: o modelo de carregamento com precisão de 4 bits é definido como verdadeiro.
  • bnb_4bit_quant_type: O tipo de quantização é definido como nf4.
  • bnb_4bit_use_double_quant: A quantização dupla está definida como True.
  • bnb_4_bit_compute_dtype: bfloat16 o tipo de dados de computação é usado para inferência mais rápida.

Linha 11–13: Carregou os pesos e o tokenizer do modelo.

Código completo para quantização de modelo

Saída gerada

 (INST) What is Natural Language Processing? (/INST) Natural Language Processing (NLP) is a subfield of artificial intelligence (AI) and
computer science that deals with the interaction between computers and human language. Its main objective is to read, decipher,
understand, and make sense of the human language in a valuable way. It can be used for various tasks such as speech recognition,
text-to-speech synthesis, sentiment analysis, machine translation, part-of-speech tagging, name entity recognition,
summarization, and question-answering systems. NLP technology allows machines to recognize, understand,
and respond to human language in a more natural and intuitive way, making interactions more accessible and efficient.

A quantização é uma abordagem muito boa para otimizar a execução de modelos de linguagem muito grandes em GPUs menores e pode ser aplicada a qualquer modelo, como Llama 70B, Falcon 40B e mpt-30b. De acordo com relatórios do artigo LLM.int8, modelos de linguagem muito grandes sofrem menos com quedas de precisão quando quantizados em comparação com modelos menores. A quantização é melhor aplicada a modelos de linguagem muito grandes e não funciona bem para modelos menores devido à perda de desempenho de precisão.

Execute a quantização Mixtral 7B no Google Colab

Conclusão

Neste artigo, forneci uma abordagem passo a passo para medir o desempenho de velocidade de um modelo de linguagem grande, expliquei como o vLLM funciona e como ele pode ser usado para melhorar a latência e o rendimento de um modelo de linguagem grande. Por fim, expliquei a quantização e como ela é usada para carregar modelos de linguagem grande em GPUs de pequena escala.

Entre em contato comigo através de:

E-mail: olafenwaayoola@gmail.com

Linkedin: https://www.linkedin.com/in/ayoola-olafenwa-003b901a9/

Referências

Fuente