LLaMA 3.1 405b er en stor språkmodell utviklet av Meta AI, og representerer en av de største åpent tilgjengelige AI-modellene når det gjelder parameterstørrelse, med 405 milliarder parametere. Den er en del av Llama 3.1-familien, som omfatter modeller av ulik størrelse (8B, 70B og 405B parametere).
405B-versjonen er spesielt bemerkelsesverdig på grunn av sin størrelse, og har som mål å matche eller til og med overgå ytelsen til noen av de beste modellene med lukket kildekode, som GPT-4, i ulike benchmarks, noe som viser at den er på topp når det gjelder språkforståelse, generering og andre oppgaver. Llama 3.1-modellene er utviklet med forbedret flerspråklig støtte, slik at de kan forstå og generere tekst på flere språk, noe som gjør dem mer anvendelige på tvers av ulike regioner og brukerbaser.
I denne artikkelen viser vi hvordan du installerer og distribuerer LLaMA 3.1 405B i produksjon på Google Cloud Platform (GCP) Compute Engine. Vi snakker først om maskinvarekrav, deretter om instansklargjøring på GCP, og deretter om distribusjon og kvantisering med vLLM.
Maskinvarekravene for å kjøre Llama 3.1 405B er ganske omfattende på grunn av størrelsen og kompleksiteten. Som vanlig når man implementerer LLM-er, er GPU-en den mest komplekse delen. Du trenger mye VRAM (dvs. GPU-minne) for å distribuere denne modellen:
Med tanke på disse behovene vil du vanligvis se på oppsett som:
Som vanlig må du være forsiktig med kvantisering og sørge for at kvaliteten på modellen ikke lider for mye. I vår test ser det ikke ut til at fp8-kvantiseringen skader kvaliteten på modellen, så vi kommer til å bruke den i denne artikkelen.
Google Cloud Platform (GCP) er en interessant leverandør for distribusjon og skalering av AI-arbeidsbelastninger. De er relativt billige og har et godt GPU-tilbud (NVIDIA H100 80GB, NVIDIA A100 80GB, NVIDIA V100, NVIDIA L4, NVIDIA T4...).
De er også ganske fleksible når det gjelder valg av instanser. Du kan for eksempel forsyne instanser med én eller flere H100 GPU-er: 1xH100, 2xH100, 4xH100 eller 8xH100.
Det er imidlertid ikke sikkert at du får lov til å klargjøre GPU-instanser hvis kontoen din er ny, og i så fall må du gå via kundestøtte for å be om en kvoteøkning.
Som et første trinn vil du opprette et nytt prosjekt på GCP. Deretter vil du aktivere Compute Engine API for prosjektet ditt. Du kan gjøre dette ved å gå til API-biblioteket i GCP-konsollen og søke etter "Compute Engine". Klikk på den og klikk deretter på "Enable" for å aktivere API-et.
Når du har aktivert API-et, kan du opprette en ny instans. Dette gjør du ved å gå til "VM instances"-delen i GCP Console og klikke på "Create instance".
Deretter blir du bedt om å velge en maskintype. For LLaMA 3.1 405B i fp8-modus vil du velge en a3-highgpu-1g-maskin med 8xH100 GPUer.
GCP-forekomst for LLaMA 3.1 405B
Deretter må du kunne angi mange detaljer for VM-en din, for eksempel nettverk, lagring osv. Vi skal ikke gå gjennom alle disse innstillingene i denne artikkelen, men vi vil fokusere på avbildningstype og lagring.
For å laste ned LLaMA 3.1 405B-modellvektene i fp8-format trenger du minst 500 GB diskplass. Vi anbefaler også at du bruker et Linux Deep Learning-bilde med CUDA 12 allerede installert, da det kan spare deg for en del arbeid senere. Du kan gjøre det i delen "OS og lagring":
GCP-bilde og diskplass for LLaMA 3.1 405B
vLLM, som står for Virtual Large Language Model, representerer et betydelig fremskritt innen kunstig intelligens, særlig når det gjelder hvordan store språkmodeller (LLM-er) serveres og brukes til inferens.
vLLM er utviklet for høy gjennomstrømning og lav latenstid, noe som gjør den ideell for applikasjoner der rask og effektiv språkbehandling er avgjørende. Dette oppnås ved hjelp av innovative teknikker som PagedAttention, som optimaliserer minnebruken ved å administrere oppmerksomhetsnøkkelen og verdiminnet mer effektivt, noe som gir opptil 24 ganger høyere gjennomstrømning sammenlignet med tradisjonelle metoder som HuggingFace Transformers.
Kjernen i vLLMs effektivitet ligger i minnehåndteringen. Ved hjelp av PagedAttention deler vLLM nøkkelverdibufferen (KV) inn i blokker, noe som gir bedre utnyttelse av minnet og reduserer fragmentering, en vanlig flaskehals i GPU-minnebruk for LLM-er. Denne tilnærmingen gir ikke bare raskere prosessering, men gjør det også mulig å håndtere flere forespørsler samtidig uten at ytelsen synker vesentlig.
Som inferens- og serveringsmotor fokuserer vLLM ikke bare på å kjøre LLM-er, men på å gjøre det på en måte som maksimerer ressursutnyttelsen. Den bruker teknikker som kontinuerlig batching av innkommende forespørsler, noe som sikrer at GPU-en er fullt utnyttet, og dermed reduserer tomgangstider og øker den samlede effektiviteten.
vLLM støtter ulike kvantifiseringsteknikker (som GPTQ, AWQ, INT4, INT8, FP8) som reduserer presisjonen til modellvektene, noe som reduserer minnebruken og potensielt gir raskere inferens.
Det er relativt enkelt å installere vLLM. La oss koble oss til GCP VM-instansen vår og installere vLLM ved hjelp av pip:
pip install vllm
Vi skal utføre distribuert inferens på 8 x H100 GPU-er, så vi må også installere Ray:
pip install ray
Hvis du opplever kompatibilitetsproblemer når du installerer vLLM, kan det være enklere for deg å kompilere vLLM fra kildekode eller bruke Docker-imaget deres: ta en titt på installasjonsinstruksjonene for vLLM.
Vi begynner med et grunnleggende Python-eksempel for å teste modellen vår:
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?"))
Du kan kjøre Python-skriptet. Hvis dette er første gang du kjører det, må du vente på at modellen lastes ned og lastes inn på GPU-en, og deretter vil du få et svar som dette:
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.
LLaMA 3.1 405B-modellen har allerede blitt kvantisert i fp8 for vLLM av Neural Magic, så vi trenger ikke å utføre kvantiseringen på nytt. Vi laster ganske enkelt inn den kvantiserte modellen fra HuggingFace Hub.
Parameteren tensor_parallel_size er satt i henhold til antall GPU-er vi har på maskinen vår.
Dette enkle Python-skriptet er imidlertid ikke en ordentlig produksjonsserver. Vi vil nå starte inferensserveren for å kunne bruke mange forespørsler parallelt og maksimere gjennomstrømningen:
python -m vllm.entrypoints.openai.api_server \
--model neuralmagic/Meta-Llama-3.1-405B-Instruct-FP8-dynamic \
--tensor-parallel-size 8
Når modellen er lastet inn, kan du starte en annen terminal og gjøre noen forespørsler:
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 er en banebrytende generativ AI-modell, men det er ikke enkelt å ta den i bruk i produksjon.
Den største utfordringen er å finne riktig maskinvare. GPU-er er svært kostbare, og det er global mangel på dem. Men når du først har klart å skaffe de riktige GPU-ene, er det ganske enkelt å distribuere modellen med en inferensserver som vLLM.
For så store modeller kan det være lurt å utnytte kvantisering for å redusere VRAM-bruken og forbedre ventetiden, slik vi gjorde. Men vær forsiktig: Kvantisering er ikke alltid en mirakelkur, da det kan redusere modellens nøyaktighet.
Hvis du ikke kan eller vil distribuere LLaMA 3.1 405B selv, kan du enkelt bruke den på NLP Cloud og utnytte denne flotte modellen i stor skala i produksjonen. Prøv LLaMA 3.1 405B på NLP Cloud nå!
Hvis du har spørsmål om LLaMA 3.1 405B og AI generelt, ikke nøl med å spørre oss, det er alltid en glede å gi deg råd!
Julien
Teknisk direktør i NLP Cloud