Prompt engineering

Accelerarea inferenței modelelor de limbaj mari: tehnici pentru implementare eficientă

mm
Adaugă Unite.AI la sursele tale preferate pe Google
LLM Inference Speed up

Modelele de limbaj mari (LLM) precum GPT-4, LLaMA și PaLM extind granițele procesării limbajului natural. Cu toate acestea, implementarea acestor modele masive în medii de producție prezintă provocări semnificative în ceea ce privește cerințele computaționale, utilizarea memoriei, latența și costul. Pe măsură ce LLM-urile continuă să crească în dimensiune și capacitate, optimizarea performanței lor de inferență este crucială pentru aplicațiile din lumea reală.

În acest articol tehnic, vom explora tehnici de ultimă generație pentru accelerarea inferenței LLM, permițând timpi de răspuns mai rapizi, un debit mai ridicat și o utilizare mai eficientă a resurselor hardware. Vom acoperi metode care variază de la tehnici de precizie numerică și mecanisme de atenție inovatoare până la inovații arhitecturale special concepute pentru generarea eficientă de text.

Să începem prin a înțelege de ce inferența LLM este atât de provocatoare în comparație cu modelele NLP tradiționale.

Provocarea inferenței cu modelele de limbaj mari

Înainte de apariția LLM-urilor, procesarea limbajului natural se baza pe modele mai mici, axate pe sarcini specifice, cum ar fi clasificarea textului, recunoașterea entităților numite și analiza sentimentului. Deși aceste modele erau încă intensiv computaționale, ele puteau fi implementate pe hardware modest și urmau procese de inferență relativ straightforward.

LLM-urile, pe de altă parte, reprezintă o schimbare de paradigmă. Aceste modele sunt antrenate pe seturi de date uriașe, folosind miliarde de parametri, ceea ce le permite să execute o gamă largă de sarcini de limbaj cu o remarcabilă pricepere. Cu toate acestea, această putere vine la un preț – cerințe computaționale dramatic crescute atât în timpul antrenamentului, cât și al inferenței.

Una dintre provocările cheie este natura autoregresivă a generării de text cu LLM-urile. Pentru a produce texte umanoide, aceste modele prezic un token (cuvânt sau subcuvânt) la un moment dat, cu fiecare token nou depinzând de ieșirea generată anterior. Această dependență secvențială împiedică paralelizarea eficientă și duce la cerințe computaționale care se escaladează polinomial cu lungimea secvenței.

În plus, LLM-urile necesită adesea secvențe de intrare lungi (prompt-uri) pentru a stabili contextul necesar pentru generarea de text de înaltă calitate. Lungimile de intrare mai lungi cer mai multă memorie pentru a stoca stări intermediare și matrice de atenție, ceea ce suprasolicitează și mai mult resursele hardware.

Cu aceste provocări unice, tehnicile de optimizare tradiționale, cum ar fi cuantificarea și grafurile de calcul statice, pot fi ineficiente, luptând să mențină performanța LLM-urilor în timp ce oferă accelerări semnificative. Să ne adâncim în unele dintre strategiile cheie special concepute pentru accelerarea inferenței LLM.

Tehnici de precizie numerică

O direcție pentru accelerarea inferenței LLM o reprezintă utilizarea preciziei numerice reduse pentru greutățile și activările modelului. Cadrele moderne de învățare profundă, cum ar fi PyTorch și TensorFlow, folosesc de obicei precizia cu punct flotant de 32 de biți (FP32) în mod implicit. Cu toate acestea, cercetările au arătat că LLM-urile pot menține o acuratețe ridicată chiar și atunci când funcționează la precizii mai scăzute, cum ar fi 16 biți (FP16), 8 biți întregi (INT8) sau chiar 4 biți întregi (INT4).

Reducerea preciziei numerice oferă mai multe beneficii:

  • Amprentă de memorie redusă: Reprezentările cu precizie mai mică necesită mai puțină memorie, permițând modelelor mai mari sau dimensiuni de lot mai mari să se încadreze în aceleași constrângeri de hardware.
  • Calcul mai rapid: Multe procesoare și unități de procesare grafică moderne oferă instrucțiuni specializate și accelerare hardware pentru aritmetică de precizie mai mică, permițând accelerări semnificative.
  • Eficiență energetică îmbunătățită: Cu cerințe de memorie mai mici și calcule mai rapide, inferența cu precizie mai mică poate se traduce în consum redus de energie – un avantaj crucial pentru implementările de margine și mobile.

Deși puternice, tehnicile de precizie numerică introduc o anumită pierdere de acuratețe în comparație cu operațiunile FP32. Cheia este evaluarea atentă a acestui compromis între câștiguri computaționale și degradarea potențială a performanței pentru cazul dvs. specific.

Există două abordări principale pentru cuantificarea LLM-urilor:

Cuantificare post-antrenament (PTQ): În această metodă, un LLM este mai întâi antrenat folosind precizia standard FP32. După antrenament, greutățile modelului sunt cuantificate (convertite) într-un format de precizie mai mică, cum ar fi INT8 sau INT4. PTQ este ușor de implementat, dar poate duce la căderi mai mari de acuratețe.

Antrenament conștient de cuantificare (QAT): Cu QAT, procesul de cuantificare este simulat în timpul fazei de antrenament. Acest lucru permite modelului să învețe să compenseze erorile de cuantificare, minimizând degradarea acurateței atunci când modelul cuantificat final este implementat. QAT este mai implicat, dar adesea oferă rezultate mai bune în comparație cu PTQ.

Pentru aplicații practice, puteți utiliza modele pre-cuantificate disponibile pe platforme precum Hugging Face, care găzduiește o varietate de modele optimizate prin diferite metode de cuantificare. De exemplu, dacă doriți un model cuantificat folosind Auto-GPTQ, puteți încărca ușor modelul folosind biblioteca de transformatori a Hugging Face. În plus, pentru a cuantifica un model, puteți utiliza instrumente precum AutoGPTQ, care se integrează perfect cu bibliotecile existente pentru a comprima modelul în mod eficient.

Aici este un exemplu de încărcare a unui model LLaMA-2-7b pre-cuantificat, folosind biblioteca de transformatori a Hugging Face:

“`python
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = “TheBloke/Llama-2-7b-Chat-GPTQ”
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
“`

Și pentru cuantificarea personalizată, puteți urma acești pași, folosind kit-ul de instrumente AutoGPTQ:

“`python
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig

model_id = “llama-2-7b-original”
tokenizer = AutoTokenizer.from_pretrained(model_id)
config_cuantificare = GPTQConfig(bits=4, dataset=”dataset_dvs”, tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, config_cuantificare=config_cuantificare)
“`

Apoi, rețineți că cuantificarea poate necesita ajustări fine sau inginerie de prompt pentru a menține calitatea modelului. Pentru o nouă cuantificare, puteți contribui la comunitate prin încărcarea modelelor dvs. cuantificate pe platforme precum Hugging Face.

Asigurați-vă întotdeauna că echilibrați dimensiunea modelului, cerințele computaționale și performanța atunci când alegeți strategia de cuantificare pentru cazul dvs. specific.

 

Algoritmul de atenție Flash

Mecanismul de atenție multi-cap este o componentă cheie a LLM-urilor bazate pe transformatori, permițând modelului să capteze dependențe pe termen lung și reprezentări contextualizate. Cu toate acestea, această operație de atenție este ineficientă din punct de vedere computațional pentru generarea autoregresivă de text, deoarece necesită recalcularea multor valori aceleiași pentru fiecare token nou.

Algoritmul de atenție Flash, introdus în lucrarea FlashAttention, oferă o abordare mai eficientă din punct de vedere al memoriei și mai prietenoasă cu paralelizarea pentru operația de atenție. În loc de a recalcula valorile de atenție pentru fiecare token, atenția Flash cachează și reutilizează matricele cheie/valoare intermediare, evitând calcule redundante.

Această optimizare nu numai că reduce suprasarcina computațională, dar îmbunătățește și modelele de acces la memorie, conducând la o utilizare mai bună a benzii de memorie GPU și paralelism.

Deși detaliile atenției Flash sunt destul de complexe, ideea de bază este să descompună operația de atenție în două faze:

  1. Încorporare de sumă prefix: Această fază calculează și stochează încorporări cheie/valoare pentru toți tokenii de intrare, permițând reutilizarea eficientă în timpul generării.
  2. Atenție cauzală: Operația reală de atenție, acum optimizată pentru a valorifica încorporările cheie/valoare stocate din prima fază.

Prin separarea acestor faze, atenția Flash poate profita de operațiuni paralele pe GPU de înaltă performanță, accelerând semnificativ gâtul de sticlă al atenției în inferența LLM.

Iată o ilustrare conceptuală, scurtă, a implementării atenției Flash cu un LLM:

“`python
from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention

# Încărcarea unui LLM, cum ar fi OctoCoder
model = AutoModelForCausalLM.from_pretrained(“bigcode/octocoder”)

# Un prompt de sistem care îndrumă modelul către a fi un asistent de codare mai bun
system_prompt = “… (detalii prompt de sistem) …”

# Pregătirea unui input mai lung cu promptul de sistem
long_prompt = system_prompt + “Întrebare: Vă rog să scrieți o funcție în Python care transformă octeți în gigaocteți.”

# Conversia modelului pentru optimizarea atenției Flash
model.to_bettertransformer()

# Rularea modelului cu atenție Flash
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f”Generat în {time.time() – start_time} secunde.”)
“`

Deși atenția Flash oferă câștiguri de performanță impresionante, ea funcționează în cadrul arhitecturii transformator existente. Pentru a debloca pe deplin potențialul inferenței LLM accelerate, trebuie să explorăm inovații arhitecturale special concepute pentru această sarcină.

Împădurirea LLM-urilor

Împădurirea LLM-urilor este o tehnică pentru reducerea dimensiunii modelului, menținând în același timp funcționalitatea. Ea folosește un estimator dependent de date pentru importanța greutăților, pe baza aproximărilor matricelor Hessian. În împădurire, grupurile de greutăți mai puțin importante sunt eliminate, apoi modelul este ajustat fin pentru a recupera acuratețea. Pachetul LLM-Pruner oferă scripturi pentru împădurire cu diverse strategii suportate. Împădurirea include descoperirea dependențelor, estimarea contribuțiilor grupurilor și o etapă de recuperare care implică un scurt antrenament post-implementare.

Aici este un exemplu simplificat de cod Python care demonstrează utilizarea LLM-Pruner pentru un model LLaMa:

“`python
from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner

# Încărcarea modelului LLaMa pre-antrenat
model = AutoModelForSequenceClassification.from_pretrained(“llama-base”)

# Inițializarea împăduririi cu configurația dorită
pruner = LLMPruner(
model,
raport_de_împădurire=0.25,
straturi_MLP_blocate=(4, 30),
straturi_de_atenție_blocate=(4, 30),
tip_de_împădurire=’taylor’
)

# Executarea împăduririi
model_împădurit = pruner.prune()

# Ajustarea fină a modelului împădurit
model_împădurit.fine_tune(date_de_antrenament)
“`

Acest schiță de cod reprezintă încărcarea unui model LLaMa pre-antrenat, setarea împăduririi cu configurații specifice (cum ar fi care straturi să fie împădurite și tipul de împădurire), executarea procesului de împădurire și, în final, ajustarea fină a modelului împădurit.

Rețineți că, pentru o implementare reală, ar trebui să completați detalii precum numele modelului specific, căile către date, precum și parametri suplimentari pentru procesul de ajustare fină. De asemenea, fiți conștienți că acest cod este o reprezentare conceptuală, iar sintaxa reală poate varia în funcție de biblioteca și versiunile utilizate.

Inovații arhitecturale pentru generarea eficientă de text

Arhitectura transformator, deși extrem de eficientă pentru sarcinile de modelare a limbajului, a fost concepută ca un model secvențial-secvențial general. Când se implementează LLM-urile pentru sarcini de generare de text cu contexte de intrare lungi, cercetătorii au descoperit că arhitecturi specializate pot îmbunătăți semnificativ eficiența inferenței fără a compromite calitatea.

Iată câteva dintre inovațiile arhitecturale cheie care permit inferența LLM mai rapidă:

Alibi: Arhitectura Alibi, introdusă în lucrarea PAL-Instruction, separă modelarea contextului de intrare lung de la procesul de generare a textului în sine. Ea folosește o reprezentare comprimată a contextului de intrare („alibi”) pentru a inițializa procesul de generare, evitând necesitatea de a procesa secvența de intrare completă de mai multe ori în timpul generării autoregresive.

Încorporări rotative: În loc de a folosi încorporări poziționale standard, tehnica încorporărilor rotative utilizează matrice de rotație pentru a codifica informații poziționale în mod mai eficient. Această abordare a demonstrat îmbunătățiri ale performanței și a permis procesarea secvențelor de intrare mai lungi.

Atenție multi-întrebare (MQA): În atenția tradițională, fiecare token de ieșire se concentrează asupra întregii secvențe de intrare, rezultând calcule redundante. MQA reformulează operația de atenție pentru a partaja calculele între mai multe tokeni de ieșire, reducând complexitatea generală.

Atenție multi-întrebare

Atenție multi-întrebare

Atenție grupată-întrebare (GQA): Construind pe baza MQA, GQA grupează tokenii de ieșire în cluster și calculează atenția în mod comun pentru fiecare cluster. Această abordare reduce și mai mult cerințele computaționale, menținând în același timp generarea de text de înaltă calitate.

Deși încă în cercetare activă și dezvoltare, aceste inovații arhitecturale au demonstrat accelerări impresionante pentru inferența LLM, în special atunci când sunt combinate cu tehnici precum atenția Flash și optimizarea preciziei numerice.

Considerații de implementare în lumea reală

Dincolo de algoritmii și arhitecturile de bază, există mai multe considerații practice și compromisuri de navigat atunci când se implementează LLM-urile în medii de producție:

Accelerare hardware: Deși procesoarele CPU pot gestiona inferența LLM, unitățile de procesare grafică (GPU) și alte acceleratoare, cum ar fi TPUs de la Google , sunt esențiale pentru a obține un debit ridicat și o latență scăzută. Alegerea hardware-ului potrivit și optimizarea utilizării memoriei sunt cruciale.

Împachetare și paralelism: Pentru a valorifica pe deplin paralelismul hardware, strategii precum inferența în loturi (procesarea mai multor intrări simultan) și paralelismul modelului (distribuirea unui LLM pe mai multe dispozitive) pot crește semnificativ debitul.

Compromis între cuantificare și calitate: Gradul de cuantificare (8 biți, 4 biți, etc.) va afecta direct viteza de inferență și utilizarea memoriei, dar va afecta și calitatea ieșirii. Acest compromis trebuie evaluat cu atenție pentru fiecare caz de utilizare.

Distilarea modelului: O alternativă la cuantificare, tehnicile de distilare a modelului pot comprima LLM-urile mari în modele mai mici și mai eficiente, menținând în același timp o acuratețe ridicată.

Cache și medii de rulare optimizate: Medii de rulare de învățare profundă optimizate, cum ar fi TensorRT de la NVIDIA , și cadre concepute special pentru servirea LLM-urilor (de exemplu, MosaicML’s Composable Inference Suite) pot oferi îmbunătățiri semnificative ale performanței prin tehnici precum fuziunea operatorilor, optimizarea kernel-ului și strategii de cache inteligente.

Calea către implementarea optimă a LLM-urilor implică adesea combinarea mai multor tehnici, luând în considerare cu atenție cerințele specifice ale aplicației, constrângerile infrastructurii și țintele de performanță.

Concluzie

Pe măsură ce LLM-urile continuă să evolueze rapid, accelerarea performanței lor de inferență devine tot mai crucială pentru a permite aplicații din lumea reală și a democratiza accesul la aceste capacități AI puternice.

În acest ghid tehnic, am explorat tehnici de ultimă oră care acoperă optimizarea preciziei numerice, algoritmii de atenție inovatori precum atenția Flash și inovații arhitecturale special concepute pentru generarea eficientă de text. Deși fiecare abordare oferă avantaje proprii, adevărata putere vine adesea din combinarea mai multor strategii, navigând compromisurile complexe între viteză, utilizare a memoriei și calitate a ieșirii.

Privind spre viitor, ne putem aștepta la cercetări și dezvoltări continue în acest domeniu, alimentate de cererea insațiabilă de LLM-uri mai capabile și mai accesibile. De la accelerarea hardware-ului și comprimarea modelului până la arhitecturi complet noi, căutarea inferenței LLM eficiente rămâne o frontieră excitantă în lumea procesării limbajului natural și a inteligenței artificiale.

Am petrecut ultimii cinci ani scufundându-mă în lumea fascinantă a Machine Learning și Deep Learning. Pasinea și expertiza mea m-au condus să contribui la peste 50 de proiecte diverse de inginerie software, cu un focus deosebit pe AI/ML. Curiozitatea mea în continuare m-a atras și spre Natural Language Processing, un domeniu pe care sunt dornic să îl explorez mai departe.