LLaMA 3.1 405b est un grand modèle de langage développé par Meta AI, qui représente l'un des plus grands modèles d'IA disponibles en libre accès en termes de taille des paramètres, avec 405 milliards de paramètres. Il fait partie de la famille Llama 3.1, qui comprend des modèles de différentes tailles (8B, 70B et 405B paramètres).
La version 405B est particulièrement remarquable par son ampleur, visant à égaler ou même à dépasser les performances de certains des meilleurs modèles à source fermée tels que le GPT-4 dans divers tests de référence, indiquant ses capacités de pointe dans la compréhension du langage, la génération et d'autres tâches. Les modèles Llama 3.1 sont conçus avec un support multilingue amélioré, capable de comprendre et de générer des textes dans plusieurs langues, ce qui élargit leur applicabilité dans différentes régions et bases d'utilisateurs.
Dans cet article, nous montrons comment installer et déployer LLaMA 3.1 405B en production sur Google Cloud Platform (GCP) Compute Engine. Nous parlons d'abord des exigences matérielles, puis du provisionnement d'instance sur GCP, et du déploiement et de la quantification avec vLLM.
Les exigences matérielles pour l'exécution de Llama 3.1 405B sont assez importantes en raison de sa taille et de sa complexité. Comme d'habitude lors du déploiement de LLM, la partie la plus complexe est le GPU. Vous aurez besoin de beaucoup de VRAM (c'est-à-dire de mémoire GPU) pour déployer ce modèle :
Compte tenu de ces besoins, on peut généralement envisager des configurations telles que :
Comme d'habitude, il faut faire attention à la quantification et s'assurer que la qualité du modèle n'en souffre pas trop. Dans notre test, la quantification fp8 ne semble pas nuire à la qualité du modèle, nous allons donc l'utiliser dans cet article.
Google Cloud Platform (GCP) est un fournisseur intéressant pour le déploiement et la mise à l'échelle de vos charges de travail d'IA. Ils sont relativement bon marché et disposent d'une bonne offre de GPU (NVIDIA H100 80GB, NVIDIA A100 80GB, NVIDIA V100, NVIDIA L4, NVIDIA T4...).
Ils sont également très flexibles en termes de choix d'instances. Par exemple, vous pouvez provisionner des instances avec un ou plusieurs GPU H100 : 1xH100, 2xH100, 4xH100 ou 8xH100.
Il se peut que vous ne soyez pas autorisé à provisionner des instances GPU si votre compte est nouveau et si c'est le cas, vous devrez passer par le support pour demander une augmentation de quota.
La première étape consiste à créer un nouveau projet sur GCP. Vous devez ensuite activer l'API Compute Engine pour votre projet. Pour ce faire, accédez à la bibliothèque d'API dans la console GCP et recherchez "Compute Engine". Cliquez dessus, puis cliquez sur "Enable" pour activer l'API.
Une fois l'API activée, vous pourrez créer une nouvelle instance. Vous pouvez le faire en allant dans la section "VM instances" de la console GCP et en cliquant sur "Créer une instance".
Il vous sera alors demandé de choisir un type de machine. Pour LLaMA 3.1 405B en mode fp8, vous voudrez choisir une machine a3-highgpu-1g avec 8xH100 GPUs.
Instance GCP pour LLaMA 3.1 405B
Vous devrez alors être en mesure de définir de nombreux détails pour votre VM, tels que le réseau, le stockage, etc. Nous n'allons pas passer en revue tous ces paramètres dans cet article, mais nous nous concentrerons sur le type d'image et le stockage.
Pour télécharger les poids du modèle LLaMA 3.1 405B au format fp8, vous aurez besoin d'au moins 500 Go d'espace disque. Nous vous recommandons également d'utiliser une image Linux Deep Learning avec CUDA 12 déjà installé car cela peut vous épargner du travail plus tard. Vous pouvez réaliser cela dans la section "OS et stockage" :
Image GCP et espace disque pour LLaMA 3.1 405B
vLLM, qui signifie Virtual Large Language Model, représente une avancée significative dans le domaine de l'IA, en particulier dans la manière dont les grands modèles de langage (LLM) sont servis et utilisés pour l'inférence.
vLLM est conçu pour des inférences à haut débit et à faible latence, ce qui le rend idéal pour les applications où un traitement rapide et efficace du langage est crucial. Il y parvient grâce à des techniques innovantes telles que PagedAttention, qui optimise l'utilisation de la mémoire en gérant plus efficacement la clé d'attention et la mémoire de valeur, ce qui permet un débit jusqu'à 24 fois supérieur à celui des méthodes traditionnelles telles que HuggingFace Transformers.
Le cœur de l'efficacité de vLLM réside dans sa gestion de la mémoire. En utilisant PagedAttention, vLLM divise le cache clé-valeur (KV) en blocs, ce qui permet une meilleure utilisation de la mémoire et réduit la fragmentation, un goulot d'étranglement courant dans l'utilisation de la mémoire des GPU pour les LLM. Cette approche permet non seulement d'accélérer le traitement, mais aussi de traiter plus de requêtes simultanément sans baisse significative des performances.
En tant que moteur d'inférence et de service, vLLM ne se contente pas d'exécuter des LLM, mais le fait de manière à maximiser l'utilisation des ressources. Il utilise des techniques telles que la mise en lot continue des requêtes entrantes, qui garantit que le GPU reste pleinement utilisé, réduisant ainsi les temps morts et augmentant l'efficacité globale.
vLLM prend en charge diverses techniques de quantification (comme GPTQ, AWQ, INT4, INT8, FP8) qui réduisent la précision des poids du modèle, diminuant ainsi l'utilisation de la mémoire et accélérant potentiellement l'inférence.
L'installation de vLLM est relativement simple. Connectons-nous à notre instance GCP VM, et installons vLLM à l'aide de pip :
pip install vllm
Nous allons effectuer une inférence distribuée sur 8 x H100 GPUs, nous devons donc installer Ray également :
pip install ray
Si vous rencontrez des problèmes de compatibilité lors de l'installation de vLLM, il peut être plus simple pour vous de compiler vLLM à partir des sources ou d'utiliser leur image Docker : Consultez les instructions d'installation de vLLM.
Commençons par un exemple Python de base pour tester notre modèle :
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?"))
Vous pouvez exécuter le script Python. Si c'est la première fois que vous l'exécutez, vous devrez attendre que le modèle soit téléchargé et chargé sur le GPU, puis vous recevrez une réponse comme celle-ci :
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.
Le modèle LLaMA 3.1 405B a déjà été quantifié dans fp8 pour vLLM par Neural Magic, nous n'avons donc pas besoin d'effectuer la quantification à nouveau. Nous chargeons simplement le modèle quantifié à partir du HuggingFace Hub.
Le paramètre tensor_parallel_size est fixé en fonction du nombre de GPU que nous possédons sur notre machine.
Ce simple script Python n'est cependant pas un véritable serveur de production. Nous allons maintenant démarrer le serveur d'inférence afin de traiter de nombreuses requêtes en parallèle et de maximiser le débit :
python -m vllm.entrypoints.openai.api_server \
--model neuralmagic/Meta-Llama-3.1-405B-Instruct-FP8-dynamic \
--tensor-parallel-size 8
Une fois le modèle chargé, vous pouvez démarrer un deuxième terminal et faire quelques requêtes :
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."
LLaMA 3.1 405B est un modèle d'IA générative de pointe, mais son déploiement en production n'est pas facile.
Le plus grand défi consiste à trouver le matériel adéquat. Les GPU sont très coûteux et il y a une pénurie mondiale. Mais une fois que vous avez réussi à fournir les bons GPU, le déploiement du modèle avec un serveur d'inférence comme vLLM est assez facile.
Pour des modèles de cette taille, vous pouvez utiliser la quantification pour réduire l'utilisation de la VRAM et améliorer la latence, comme nous l'avons fait. Mais attention : la quantification n'est pas toujours une solution miracle, car elle peut réduire la précision du modèle.
Si vous ne pouvez pas ou ne voulez pas déployer LLaMA 3.1 405B vous-même, vous pouvez facilement l'utiliser sur NLP Cloud et tirer parti de ce grand modèle à l'échelle de la production. Essayez LLaMA 3.1 405B sur NLP Cloud dès maintenant !
Si vous avez des questions sur LLaMA 3.1 405B et sur l'IA en général, n'hésitez pas à nous les poser, c'est toujours un plaisir de vous conseiller !
Julien
Directeur technique de NLP Cloud