Está a ter dificuldades com a IA ou com o desenvolvimento full-stack? Os nossos especialistas estão aqui para o orientar: aconselhamento personalizado, integração técnica e muito mais. Entre em contacto com [email protected].

Instalação e implantação do LLaMA 3.1 405B na produção no GCP Compute Engine

O LLaMA 3.1 405b é um modelo de linguagem de grande dimensão desenvolvido pela Meta AI, representando um dos maiores modelos de IA disponíveis abertamente em termos de dimensão dos parâmetros, com 405 mil milhões de parâmetros. Faz parte da família Llama 3.1, que inclui modelos de diferentes tamanhos (8B, 70B e 405B parâmetros).

A versão 405B é particularmente notável pela sua escala, com o objetivo de igualar ou mesmo ultrapassar o desempenho de alguns dos principais modelos de código fechado, como o GPT-4, em vários parâmetros de referência, indicando as suas capacidades de ponta na compreensão e geração de linguagem e outras tarefas. Os modelos Llama 3.1 foram concebidos com um suporte multilingue melhorado, capaz de compreender e gerar texto em várias línguas, o que alarga a sua aplicabilidade em diferentes regiões e bases de utilizadores.

Neste artigo, mostramos como instalar e implantar o LLaMA 3.1 405B em produção no Compute Engine do Google Cloud Platform (GCP). Primeiro, falamos sobre os requisitos de hardware, depois sobre o provisionamento de instâncias no GCP e sobre a implantação e a quantização com o vLLM.

LLaMA 3.1 405B

LLaMA 3.1 405B: requisitos de hardware

Os requisitos de hardware para executar o Llama 3.1 405B são bastante extensos devido ao seu tamanho e complexidade. Como é habitual na implementação de LLMs, a parte mais complexa é o GPU. É necessária uma grande quantidade de VRAM (ou seja, memória GPU) para implementar este modelo:

Tendo em conta estas necessidades, é normal considerar configurações como:

Como é habitual, é preciso ter cuidado com a quantização e certificar-se de que a qualidade do modelo não é demasiado afetada. No nosso teste, a quantização fp8 não parece prejudicar a qualidade do modelo, pelo que a vamos utilizar neste artigo.

Provisionamento de uma instância para o LLaMA 3.1 405B no GCP Compute Engine

O Google Cloud Platform (GCP) é um fornecedor interessante para implementar e dimensionar as suas cargas de trabalho de IA. São relativamente baratos e têm uma boa oferta de GPU (NVIDIA H100 80GB, NVIDIA A100 80GB, NVIDIA V100, NVIDIA L4, NVIDIA T4...).

Também são bastante flexíveis em termos de escolha de instâncias. Por exemplo, pode fornecer instâncias com uma ou mais GPUs H100: 1xH100, 2xH100, 4xH100 ou 8xH100.

No entanto, poderá não ter permissão para aprovisionar instâncias GPU se a sua conta for nova e, se for esse o caso, terá de recorrer ao suporte para pedir um aumento da quota.

Como primeiro passo, você vai querer criar um novo projeto no GCP. Em seguida, habilitará a API do Compute Engine para o seu projeto. Para isso, vá até a Biblioteca de APIs no Console do GCP e procure por "Compute Engine". Clique nele e, em seguida, clique em "Habilitar" para ativar a API.

Depois de ter ativado a API, poderá criar uma nova instância. Pode fazê-lo indo à secção "VM instances" (Instâncias de VM) na Consola GCP e clicando em "Create instance" (Criar instância).

Em seguida, ser-lhe-á pedido que escolha um tipo de máquina. Para o LLaMA 3.1 405B no modo fp8, você vai querer escolher uma máquina a3-highgpu-1g com 8xH100 GPUs.

Instância GCP para LLaMA 3.1 405B Instância GCP para LLaMA 3.1 405B

Terá então de poder definir muitos detalhes para a sua VM, como rede, armazenamento, etc. Não vamos analisar todas essas configurações neste artigo, mas vamos nos concentrar no tipo de imagem e no armazenamento.

Para fazer o download dos pesos do modelo LLaMA 3.1 405B no formato fp8, você precisará de pelo menos 500 GB de espaço em disco. Também recomendamos que utilize uma imagem Linux Deep Learning com CUDA 12 já instalado, uma vez que pode poupar algum trabalho mais tarde. Pode conseguir isso na secção "SO e armazenamento":

Imagem do GCP e espaço em disco para o LLaMA 3.1 405B Imagem do GCP e espaço em disco para o LLaMA 3.1 405B

Instalando o vLLM

O vLLM, que significa Virtual Large Language Model, representa um avanço significativo no domínio da IA, particularmente na forma como os modelos de linguagem de grande dimensão (LLM) são servidos e utilizados para inferência.

O vLLM foi projetado para inferências de alto rendimento e baixa latência, tornando-o ideal para aplicações em que o processamento rápido e eficiente de linguagem é crucial. Ele consegue isso por meio de técnicas inovadoras como o PagedAttention, que otimiza o uso da memória gerenciando a chave de atenção e a memória de valor de forma mais eficiente, permitindo um rendimento até 24 vezes maior em comparação com métodos tradicionais como o HuggingFace Transformers.

O núcleo da eficiência da vLLM está no seu gerenciamento de memória. Usando o PagedAttention, o vLLM divide o cache de valor-chave (KV) em blocos, o que permite uma melhor utilização da memória e reduz a fragmentação, um gargalo comum no uso da memória da GPU para LLMs. Essa abordagem não apenas acelera o processamento, mas também permite lidar com mais solicitações simultaneamente sem quedas significativas no desempenho.

Como um mecanismo de inferência e de serviço, o vLLM se concentra não apenas em executar LLMs, mas em fazê-lo de uma forma que maximize a utilização de recursos. Ele emprega técnicas como o agrupamento contínuo de solicitações de entrada, o que garante que a GPU permaneça totalmente utilizada, reduzindo assim os tempos ociosos e aumentando a eficiência geral.

O vLLM suporta várias técnicas de quantização (como GPTQ, AWQ, INT4, INT8, FP8) que reduzem a precisão dos pesos do modelo, diminuindo assim a utilização da memória e acelerando potencialmente a inferência.

A instalação do vLLM é relativamente fácil. Vamos nos conectar à nossa instância de VM do GCP e instalar o vLLM usando o pip:

pip install vllm

Vamos efetuar a inferência distribuída em 8 GPUs H100, pelo que também precisamos de instalar o Ray:

pip install ray

Se tiver problemas de compatibilidade ao instalar o vLLM, poderá ser mais simples compilar o vLLM a partir da fonte ou utilizar a sua imagem Docker: consulte as instruções de instalação do vLLM.

Servidor de Inferência para LLaMA 3.1 405B

Vamos começar com um exemplo básico em Python para testar o nosso modelo:

from vllm import LLM

# Load LLaMA 3.1 405B on 8 GPUs
llm = LLM("neuralmagic/Meta-Llama-3.1-405B-Instruct-FP8-dynamic", tensor_parallel_size=8)

print(llm.generate("What is the difference between fp8 quantization and int8 quantization?"))

Pode executar o script Python. Se esta for a primeira vez que o executa, terá de esperar que o modelo seja descarregado e carregado na GPU e, em seguida, receberá uma resposta como esta:

FP8 (Floating-Point 8) and INT8 (Integer 8) are both quantization techniques used to reduce the precision of numerical values in deep learning models, but they differ in their representation and behavior.

**INT8 Quantization**

INT8 quantization represents numbers as 8-bit integers, which can take on values between -128 and 127 (or 0 and 255 for unsigned integers). This means that the precision of the numbers is limited to 8 bits, and any values outside this range are clipped or saturated.

INT8 quantization is a simple and widely used technique, especially for integer-based architectures like ARM and x86. Most deep learning frameworks, including TensorFlow and PyTorch, support INT8 quantization.

**FP8 Quantization**

FP8 quantization, on the other hand, represents numbers as 8-bit floating-point numbers, with 1 sign bit, 2 exponent bits, and 5 mantissa bits. This allows for a much larger dynamic range than INT8, with values that can be as small as 2^-14 or as large as 2^15.

FP8 quantization is a more recent development, and its main advantage is that it can provide better accuracy than INT8 quantization, especially for models that require a large dynamic range, such as those with batch normalization or depthwise separable convolutions. FP8 is also more suitable for models that are sensitive to quantization noise, like those with recurrent neural networks (RNNs) or long short-term memory (LSTM) networks.

**Key differences**

Here are the key differences between FP8 and INT8 quantization:

1. **Dynamic range**: FP8 has a much larger dynamic range than INT8, which means it can represent a wider range of values.
2. **Precision**: FP8 has a lower precision than INT8, with 5 mantissa bits compared to 8 bits for INT8.
3. **Behavior**: FP8 is more suitable for models that require a large dynamic range, while INT8 is better suited for models with smaller weights and activations.
4. **Hardware support**: INT8 is widely supported by most hardware platforms, while FP8 is still an emerging standard, with limited hardware support.

In summary, FP8 quantization offers better accuracy and a larger dynamic range than INT8 quantization, but it requires more sophisticated hardware support and may not be suitable for all models or applications. 

O modelo LLaMA 3.1 405B já foi quantizado em fp8 para vLLM pelo Neural Magic, portanto não precisamos realizar a quantização novamente. Simplesmente carregamos o modelo quantizado do HuggingFace Hub.

O parâmetro tensor_parallel_size é definido de acordo com o número de GPUs que possuímos na nossa máquina.

No entanto, este simples script Python não é um servidor de produção adequado. Vamos agora iniciar o servidor de inferência para consumir muitos pedidos em paralelo e maximizar o rendimento:

python -m vllm.entrypoints.openai.api_server \
--model neuralmagic/Meta-Llama-3.1-405B-Instruct-FP8-dynamic \
--tensor-parallel-size 8

Quando o modelo estiver carregado, pode iniciar um segundo terminal e efetuar alguns pedidos:

curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
    "model": "neuralmagic/Meta-Llama-3.1-405B-Instruct-FP8-dynamic",
    "prompt": "Who are you?"
}'

I'm an artificial intelligence model known as Llama. Llama stands for "Large Language Model Meta AI."

Conclusão

O LLaMA 3.1 405B é um modelo de IA generativo de ponta, mas a sua implementação na produção não é fácil.

O maior desafio é encontrar o hardware correto. As GPUs são muito caras e há uma escassez global. Mas quando se consegue fornecer as GPUs certas, a implementação do modelo com um servidor de inferência como o vLLM é bastante fácil.

Para modelos tão grandes, pode querer aproveitar a quantização para reduzir a utilização de VRAM e melhorar a latência, como fizemos. Mas tenha cuidado: a quantização nem sempre é uma bala de prata, pois pode diminuir a precisão do modelo.

Se não puder ou não quiser implementar o LLaMA 3.1 405B por si próprio, pode facilmente utilizá-lo no NLP Cloud e tirar partido deste excelente modelo em escala na produção. Experimente o LLaMA 3.1 405B no NLP Cloud agora!

Se tiver dúvidas sobre o LLaMA 3.1 405B e sobre a IA em geral, não hesite em perguntar-nos, é sempre um prazer aconselhá-lo!

Julien
CTO na NLP Cloud