škrbina Ubrzavanje zaključivanja modela velikog jezika: Tehnike za učinkovitu implementaciju - Unite.AI
Povežite se s nama

Brzi inženjering

Ubrzavanje zaključivanja modela velikog jezika: Tehnike za učinkovitu implementaciju

mm

Objavljeno

 on

LLM Inference Ubrzajte

Veliki jezični modeli (LLM) poput GPT-4, LlaMA, i PaLM pomiču granice onoga što je moguće s obradom prirodnog jezika. Međutim, implementacija ovih masivnih modela u proizvodna okruženja predstavlja značajne izazove u smislu računalnih zahtjeva, upotrebe memorije, latencije i troškova. Kako LLM-ovi nastavljaju rasti i postaju sve sposobniji, optimizacija njihove izvedbe zaključivanja ključna je za aplikacije u stvarnom svijetu.

U ovom tehničkom detalju, istražit ćemo vrhunske tehnike za ubrzavanje LLM zaključivanja, omogućavajući brže vrijeme odziva, veću propusnost i učinkovitije korištenje hardverskih resursa. Pokrit ćemo metode u rasponu od tehnika numeričke preciznosti i novih mehanizama pažnje do arhitektonskih inovacija izričito skrojenih za učinkovito generiranje teksta.

Započnimo s razumijevanjem zašto je LLM zaključivanje toliko izazovno u usporedbi s tradicionalnim NLP modelima.

Izazov zaključivanja s velikim jezičnim modelima

Prije pojave LLM-a, obrada prirodnog jezika oslanjala se na manje modele usredotočene na specifične zadatke kao što su klasifikacija teksta, prepoznavanje imenovanih entiteta i analiza osjećaja. Iako su još uvijek računalno intenzivni, ovi modeli mogu se implementirati na skromnom hardveru i pratiti relativno jednostavne procese zaključivanja.

LLM, s druge strane, predstavljaju promjenu paradigme. Ovi modeli treniraju se na golemim skupovima podataka pomoću milijardi parametara, što im omogućuje izvođenje širokog spektra jezičnih zadataka s izvanrednom stručnošću. Međutim, ova moć ima svoju cijenu – dramatično povećani računalni zahtjevi tijekom obuke i zaključivanja.

Jedan ključni izazov je autoregresivna priroda generiranja teksta s LLM-om. Kako bi proizveli tekst sličan ljudskom, ovi modeli predviđaju jedan po jedan token (riječ ili podriječ), pri čemu svaki novi token ovisi o prethodno generiranom izlazu. Ova sekvencijalna ovisnost sprječava učinkovitu paralelizaciju i rezultira računalnim zahtjevima koji se polinomski skaliraju s duljinom sekvence.

Osim toga, LLM-ovi često zahtijevaju duge sekvence unosa (upitne upute) za uspostavljanje potrebnog konteksta za visokokvalitetno generiranje teksta. Dulje duljine unosa zahtijevaju više memorije za pohranjivanje međustanja i matrica pažnje, dodatno opterećujući hardverske resurse.

Uz ove jedinstvene izazove, tradicionalne tehnike optimizacije kao što su kvantizacija i grafikoni statičkog izračuna mogu podbaciti, boreći se za održavanje performansi LLM-a uz postizanje značajnih ubrzanja. Uronimo u neke od ključnih strategija koje su eksplicitno skrojene za ubrzavanje LLM zaključivanja.

Tehnike numeričke preciznosti

Od 32-bitne do 16-bitne preciznosti

Od 32-bitne do 16-bitne preciznosti

Jedan put za ubrzanje Mr zaključak je iskoristiti smanjenu numeričku preciznost za težine modela i aktivacije. Moderni okviri dubokog učenja kao što su PyTorch i TensorFlow obično koriste 32-bitnu preciznost s pomičnim zarezom (FP32) prema zadanim postavkama. Međutim, istraživanje je pokazalo da LLM-ovi često mogu zadržati visoku točnost čak i kada rade na nižim preciznostima, kao što su 16-bitni (FP16), 8-bitni cijeli brojevi (INT8) ili čak 4-bitni cijeli brojevi (INT4).

Smanjenje numeričke preciznosti nudi nekoliko prednosti:

  • Smanjeni memorijski otisak: Prikazi s manjom preciznošću zahtijevaju manje memorije, dopuštajući većim modelima ili veličinama serija da stanu unutar istih hardverskih ograničenja.
  • Brže računanje: Mnogi moderni CPU-i i GPU-i pružaju specijalizirane upute i hardversko ubrzanje za nižu preciznost aritmetike, omogućujući značajna ubrzanja.
  • Poboljšana energetska učinkovitost: S manjim zahtjevima za memoriju i bržim izračunima, zaključivanje niže preciznosti može se pretvoriti u smanjenu potrošnju energije – ključna prednost za rubne i mobilne primjene.

Iako su moćne, tehnike numeričke preciznosti donose određeni gubitak točnosti u usporedbi s radom FP32. Ključ je pažljivo procijeniti ovaj kompromis između računalnih dobitaka i potencijalnog pada performansi za vaš specifični slučaj upotrebe.

Postoje dva glavna pristupa kvantizaciji s LLM-ovima:

Kvantizacija nakon treninga (PTQ): U ovoj metodi, LLM se prvo obučava koristeći standardnu ​​FP32 preciznost. Nakon obuke, težine modela se kvantiziraju (pretvaraju) u format niže preciznosti kao što je INT8 ili INT4. PTQ je jednostavan za implementaciju, ali može dovesti do većeg pada točnosti.

Obuka svjesna kvantizacije (QAT): Uz QAT, proces kvantizacije simulira se tijekom same faze treninga. To omogućuje modelu da nauči kompenzirati pogreške kvantizacije, minimizirajući degradaciju točnosti kada se postavi konačni kvantizirani model. QAT je uključeniji, ali često daje bolje rezultate u usporedbi s PTQ.

Za praktičnu primjenu, mogli bi se iskoristiti unaprijed kvantizirani modeli dostupni na platformama kao što su Zagrljeno lice, koji sadrži niz modela optimiziranih različitim metodama kvantizacije. Na primjer, ako je poželjan model kvantiziran korištenjem Auto-GPTQ, korisnici ga mogu jednostavno učitati pomoću biblioteke transformatora Hugging Face. Osim toga, za kvantizaciju modela mogu se koristiti alati poput AutoGPTQ-a, koji se besprijekorno integriraju s postojećim bibliotekama za učinkovito komprimiranje modela.

Ovdje je primjer učitavanja prethodno kvantiziranog modela Llama-2-7b pomoću biblioteke transformatora Hugging Face:

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)
And for custom quantization, one might follow these steps using the AutoGPTQ toolkit:
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "llama-2-7b-original"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset="your-dataset", tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)

Imajte na umu da kvantizacija može zahtijevati fino podešavanje nakon kvantizacije ili brzi inženjering kako bi se održala kvaliteta modela. Za novu kvantizaciju, možete doprinijeti zajednici tako što ćete svoje kvantizirane modele plasirati na platforme kao što je Hugging Face.

Uvijek osigurajte ravnotežu između veličine modela, računalnih zahtjeva i performansi pri odabiru strategije kvantizacije za vaš specifični slučaj upotrebe.

 

Algoritam Flash Attention

Mehanizam pažnje s više glava ključna je komponenta LLM-ova temeljenih na transformatorima, omogućujući modelu da uhvati dugotrajne ovisnosti i kontekstualizirane reprezentacije. Međutim, ova operacija pozornosti računalno je neučinkovita za autoregresivno generiranje teksta, budući da zahtijeva ponovno izračunavanje mnogih istih vrijednosti za svaki novi token.

Korištenje električnih romobila ističe Algoritam Flash Attention, predstavljen u članku FlashAttention, pruža memorijski učinkovitiji pristup operaciji pozornosti koji je prilagođen paralelizaciji. Umjesto ponovnog izračunavanja vrijednosti pozornosti za svaki token, Flash Attention sprema i ponovno koristi međumatrice ključ/vrijednost, izbjegavajući suvišne izračune.

Ova optimizacija ne samo da smanjuje troškove računanja, već i poboljšava obrasce pristupa memoriji, što dovodi do boljeg iskorištenja propusnosti i paralelizma GPU memorije.

Dok su pojedinosti Flash Attention-a prilično zapletene, ideja na visokoj razini je razložiti operaciju pozornosti u dvije faze:

  1. Ugradnja zbroja prefiksa: Ova faza izračunava i predmemorira ugradnje ključeva/vrijednosti za sve ulazne tokene, omogućujući učinkovitu ponovnu upotrebu tijekom generiranja.
  2. Uzročna pažnja: stvarna operacija pažnje, sada optimizirana za korištenje predmemoriranih umetanja ključa/vrijednosti iz prve faze.

Odvajanjem ovih faza, Flash Attention može iskoristiti visoko paralelne GPU operacije, značajno ubrzavajući usko grlo pažnje u LLM zaključivanju.

Evo kratke, konceptualne ilustracije implementacije Flash Attention-a s LLM-om:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention
# Load an LLM like OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")
# Sample system prompt that guides the model towards being a better coding assistant
system_prompt = """... (system prompt details) ..."""
# Preparing a longer input with the system prompt
long_prompt = system_prompt + "Question: Please write a function in Python that transforms bytes to Gigabytes."
# Converting the model for Flash Attention optimization
model.to_bettertransformer()
# Running the model with Flash Attention
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f"Generated in {time.time() - start_time} seconds.")

Dok Flash Attention nudi impresivne dobitke u performansama, on radi unutar postojeće arhitekture transformatora. Kako bismo u potpunosti oslobodili potencijal ubrzanog zaključivanja LLM-a, moramo istražiti arhitektonske inovacije posebno skrojene za ovaj zadatak.

Orezivanje LLM-a

Obrezivanje LLM-ova je tehnika za smanjenje veličine modela uz zadržavanje funkcionalnosti. Koristi procjenitelj ovisan o podacima za važnost težine na temelju aproksimacija Hessove matrice. U rezanju se uklanjaju manje važne grupe težine, a zatim se model fino podešava kako bi se povratila točnost. Paket LLM-Pruner nudi skripte za obrezivanje s različitim podržanim strategijama. Obrezivanje uključuje otkrivanje ovisnosti, procjenu doprinosa grupe i fazu oporavka koja uključuje kratku naknadnu obuku.

Evo pojednostavljenog primjera Python koda koji pokazuje korištenje LLM-Orezivač za model LLaMa:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner
# Load pre-trained LLaMa model
model = AutoModelForSequenceClassification.from_pretrained("llama-base")
# Initialize the pruner with desired configuration
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)
# Execute pruning
pruned_model = pruner.prune()
# Fine-tune the pruned model
pruned_model.fine_tune(training_data)

Ova skica koda predstavlja učitavanje prethodno obučenog LLaMa modela, postavljanje alata za rezanje s određenim konfiguracijama (kao što su slojevi za obrezivanje i vrsta alata za obrezivanje), izvršavanje procesa rezanja i na kraju, fino podešavanje modela za obrezivanje.

Imajte na umu da biste za stvarnu implementaciju trebali ispuniti pojedinosti poput specifičnog naziva modela, putova do podataka i dodatnih parametara za postupak finog podešavanja. Također, imajte na umu da je ovaj kod konceptualni prikaz, a stvarna sintaksa može varirati ovisno o korištenoj biblioteci i verzijama.

Arhitektonske inovacije za učinkovito generiranje teksta

Arhitektura transformatora, iako vrlo učinkovita za zadatke modeliranja jezika, dizajnirana je kao model opće namjene od sekvence do sekvence. Prilikom postavljanja LLM-ova za zadatke generiranja teksta s dugim kontekstima unosa, istraživači su otkrili da specijaliziranije arhitekture mogu značajno poboljšati učinkovitost zaključivanja bez žrtvovanja kvalitete.

Ovdje su neke od ključnih arhitektonskih inovacija koje omogućuju brže LLM zaključivanje:

Alibi: Arhitektura Alibi, predstavljena u dokumentu PAL-Instruction, odvaja modeliranje dugog ulaznog konteksta od samog procesa generiranja teksta. Koristi komprimiranu reprezentaciju ulaznog konteksta ("alibi") za inicijalizaciju procesa generiranja, izbjegavajući potrebu za obradom cijele ulazne sekvence više puta tijekom autoregresivne generacije.

Rotacijske ugradnje: Umjesto korištenja standardnih pozicijskih umetanja, tehnika rotacijskog ugrađivanja koristi rotacijske matrice za učinkovitije kodiranje pozicijskih informacija. Pokazalo se da ovaj pristup poboljšava performanse i omogućuje obradu duljih ulaznih nizova.

Multi-Query Attention (MQA): U tradicionalnoj pažnji, svaki izlazni token prati cijeli ulazni niz, što rezultira redundantnim računanjem. MQA preformulira operaciju pažnje za dijeljenje izračuna na više izlaznih tokena, smanjujući ukupnu složenost.

Višestruka pažnja

Višestruka pažnja

Pozornost grupiranog upita (GQA): Nadovezujući se na MQA, GQA grupira izlazne tokene u klastere i zajedno izračunava pažnju za svaki klaster. Ovaj pristup dodatno smanjuje računalne zahtjeve uz održavanje visokokvalitetnog generiranja teksta.

Dok su još uvijek u aktivnom istraživanju i razvoju, ove arhitektonske inovacije pokazale su impresivna ubrzanja za LLM zadatke zaključivanja, posebno u kombinaciji s tehnikama kao što su Flash Attention i optimizacija numeričke preciznosti.

Razmatranja implementacije u stvarnom svijetu

Osim temeljnih algoritama i arhitektura, postoji nekoliko praktičnih razmatranja i kompromisa kojima se treba pridržavati prilikom implementacije LLM-ova u proizvodna okruženja:

Ubrzanje hardvera: Dok CPU-ovi mogu podnijeti zaključivanje LLM-a, GPU-ovi i drugi akceleratori poput Googleovih TPU-ova ključni su za postizanje visoke propusnosti i niske latencije. Odabir pravog hardvera i optimizacija korištenja memorije ključni su.

Grupiranje i paralelizam: Kako bi se u potpunosti iskoristio hardverski paralelizam, strategije kao što su grupno zaključivanje (istovremena obrada više ulaza) i paralelizam modela (distribucija LLM-a na više uređaja) mogu značajno povećati propusnost.

Kompromis kvantizacije nasuprot kvaliteti: Stupanj kvantizacije (8-bitni, 4-bitni, itd.) izravno će utjecati na brzinu zaključivanja i korištenje memorije, ali također utječe na kvalitetu izlaza. Ovaj kompromis mora se pažljivo procijeniti za svaki slučaj upotrebe.

Model destilacije: Alternativa kvantizaciji, tehnike destilacije modela mogu komprimirati velike LLM-ove u manje, učinkovitije studentske modele uz zadržavanje visoke točnosti.

Predmemoriranje i optimizirana vremena izvođenja: Optimizirano vrijeme izvođenja dubokog učenja poput NVIDIA-inog TensorRT-a i okvira dizajniranih za LLM posluživanje (npr. MosaicML-ov Composable Inference Suite) može pružiti značajna poboljšanja performansi kroz tehnike kao što su spajanje operatora, optimizacija kernela i inteligentne strategije predmemoriranja.

Put do optimalne implementacije LLM-a često uključuje kombiniranje više tehnika uz pažljivo razmatranje specifičnih zahtjeva vaše aplikacije, infrastrukturnih ograničenja i ciljeva izvedbe.

Zaključak

Kako veliki jezični modeli nastavljaju svoju brzu evoluciju, ubrzanje njihove izvedbe zaključivanja postaje sve važnije za omogućavanje aplikacija u stvarnom svijetu i demokratiziranje pristupa ovim moćnim AI sposobnostima.

U ovom tehničkom vodiču istražili smo vrhunske tehnike koje obuhvaćaju optimizaciju numeričke preciznosti, nove algoritme pažnje poput Flash Attentiona i arhitektonske inovacije skrojene za učinkovito generiranje teksta. Dok svaki pristup nudi svoje prednosti, prava snaga često leži u kombiniranju više strategija dok se krećete kroz zamršene kompromise između brzine, upotrebe memorije i kvalitete ispisa.

Gledajući unaprijed, možemo očekivati ​​nastavak istraživanja i razvoja u ovom području, potaknut nezasitnom potražnjom za sposobnijim i pristupačnijim LLM-ovima. Od hardverske akceleracije i kompresije modela do potpuno novih arhitektura, potraga za učinkovitim zaključivanjem LLM-a ostaje uzbudljiva granica u svijetu obrade prirodnog jezika i umjetne inteligencije.

Proteklih pet godina proveo sam uranjajući u fascinantan svijet strojnog i dubokog učenja. Moja strast i stručnost naveli su me da pridonesem više od 50 različitih projekata softverskog inženjeringa, s posebnim fokusom na AI/ML. Moja stalna znatiželja također me povukla prema obradi prirodnog jezika, polju koje jedva čekam dalje istraživati.