Máte problémy s AI alebo vývojom celého balíka? Naši odborníci sú tu, aby vám poradili: poradenstvo na mieru, technická integrácia a ďalšie služby. Obráťte sa na [email protected].

Optimalizačné techniky LLM

Optimalizácia odvodzovania je dôležitou súčasťou generatívnych aplikácií umelej inteligencie nasadených v produkcii. Efektívne využívanie LLM v širokom meradle je výzvou a v posledných rokoch bolo vyvinutých mnoho techník na urýchlenie a zlacnenie inferencie. Poďme si tieto techniky preskúmať v tomto článku.

Optimalizačné techniky LLM

Zameranie na architektúru LLM

Všetky veľké jazykové modely (LLM) sú založené na transformátorovej architektúre, ktorú v roku 2017 vynašli Vaswani a i. Transformátorová architektúra dosahuje vynikajúcu presnosť, učenie na niekoľko snímok a schopnosti blízke ľudským v rôznych jazykových úlohách. Tieto základné modely, ktoré často obsahujú desiatky až stovky miliárd parametrov, sú však nákladné na trénovanie a náročné na zdroje počas inferencie. Náklady na inferenciu sa zvyšujú pri dlhých vstupných kontextoch, ktoré si kvôli veľkému množstvu vstupných údajov vyžadujú značný výpočtový výkon. Z toho vyplýva, že efektívna inferencia je kritickou výzvou, najmä pokiaľ ide o správu pamäte a výpočtových zdrojov.

Architektúra transformátora
Architektúra transformátora

Presnejšie, väčšina známych LLM sú len dekódovacie LLM, ako napríklad GPT-3, GPT-4, LLaMA, Mistral, DeepSeek atď. Tieto modely sú predtrénované na úlohe kauzálneho modelovania a fungujú ako prediktory nasledujúceho slova. Spracúvajú postupnosť tokenov ako vstup a autoregresívne produkujú nasledujúce tokeny, kým sa nedosiahne podmienka zastavenia.

Odvodzovanie LLM v modeloch len s dekodérom zahŕňa dve kľúčové fázy: fázu predvypĺňania a fázu dekódovania. Vo fáze prefill model spracováva vstupné tokeny na výpočet medzistavov (kľúčov a hodnôt) na generovanie prvého nového tokenu. Táto fáza, pripomínajúca operáciu matica - matica, je vysoko paralelizovaná a efektívne využíva možnosti GPU. Naopak, dekódovacia fáza generuje tokeny jeden po druhom, pričom sa spolieha na stavy predchádzajúcich tokenov. Táto maticovo-vektorová operácia je viazaná na pamäť, pretože prenos údajov do GPU, a nie rýchlosť výpočtu, určuje predovšetkým latenciu, čo vedie k nedostatočnému využitiu výpočtového výkonu GPU.

Optimalizácia dekódovacej fázy je ústredným bodom pri riešení problémov s odvodzovaním. Riešenia zahŕňajú vývoj účinných mechanizmov pozornosti a lepšiu správu kľúčov a hodnôt s cieľom znížiť úzke miesta v pamäti. Príspevok poukazuje na praktické prístupy na zvýšenie výkonu inferencie za predpokladu, že čitatelia majú základné znalosti o architektúre transformátora a mechanizmoch pozornosti. Tieto optimalizácie sú kľúčové pre zlepšenie priepustnosti a zníženie latencie v reálnych nasadeniach LLM.

Ďalšia komplikácia vyplýva z používania rôznych tokenizérov v rôznych LLM, čo ovplyvňuje porovnateľnosť tokenov. Tokeny, ktoré zhruba zodpovedajú štyrom anglickým znakom, sa líšia v reprezentácii v závislosti od tokenizéra, čo spôsobuje, že priame porovnanie priepustnosti odvodzovania (napr. tokeny za sekundu) je zavádzajúce. Táto variabilita zdôrazňuje potrebu štandardizovaných hodnotiacich metrík na presné posúdenie a porovnanie výkonu LLM počas inferencie.

Dávkovanie

Dávkovanie je kľúčovou stratégiou na zlepšenie využitia a priepustnosti GPU vo veľkých jazykových modeloch (LLM). Spracovaním viacerých požiadaviek súčasne s použitím toho istého modelu dávkovanie rozdeľuje pamäťové náklady na váhy modelu medzi požiadavky, čo umožňuje pri väčších dávkach využiť väčší výpočtový výkon GPU. Veľkosť dávok má však svoje hranice, pretože príliš veľké dávky môžu spôsobiť pretečenie pamäte v dôsledku pamäťových nárokov LLM, najmä v súvislosti s ukladaním do vyrovnávacej pamäte kľúč-hodnota (KV) (viac o tom neskôr).

Techniky dávkovania
Techniky dávkovania

Tradičné alebo statické dávkovanie má obmedzenia, pretože požiadavky v rámci dávky často generujú rôzny počet žetónov dokončenia, čo vedie k rôznym časom vykonávania. To spôsobuje, že všetky požiadavky čakajú na dokončenie tej najpomalšej, čo môže byť problematické, keď sa dĺžka generovania výrazne líši. Na riešenie tohto problému boli vyvinuté pokročilé techniky, ako napríklad dávkovanie za letu, ktoré optimalizujú výkon.

Dávkovanie počas letu, známe aj ako kontinuálne dávkovanie, rieši výzvy vyplývajúce z dynamickej povahy pracovných záťaží LLM, ktoré môžu siahať od jednoduchých odpovedí chatbotov až po komplexné sumarizácie dokumentov alebo generovanie kódu. Tieto úlohy produkujú výstupy značne odlišných veľkostí, čo sťažuje dávkovanie a efektívne paralelné vykonávanie požiadaviek. Na rozdiel od statického dávkovania umožňuje dávkovanie za behu serveru okamžite vyradiť dokončené sekvencie z dávky a začať spracovávať nové požiadavky, zatiaľ čo ostatné ešte prebiehajú. Tento prístup výrazne zvyšuje využitie GPU tým, že sa prispôsobuje rôznym časom vykonávania požiadaviek v reálnych scenároch.

Nasadenie viacerých GPU s paralelizáciou modelu

Paralelizácia modelov je kritická stratégia na riadenie pamäťových a výpočtových požiadaviek rozsiahlych modelov strojového učenia ich rozdelením medzi viaceré GPU. Tento prístup umožňuje spracovávať väčšie modely alebo vstupné dávky, ktoré presahujú pamäťovú kapacitu jedného zariadenia, čo je nevyhnutné na trénovanie aj odvodzovanie, keď sú pamäťové obmedzenia prísne. Na rozdelenie váh modelov existujú rôzne techniky vrátane paralelnosti potrubí, tenzorovej paralelnosti a sekvenčnej paralelnosti, pričom každá z nich rieši iné aspekty distribúcie modelov. Na rozdiel od dátového paralelizmu, ktorý sa zameriava na replikáciu modelových váh medzi zariadeniami na spracovanie väčších vstupných dávok počas trénovania, tieto metódy majú väčší význam pre zníženie pamäťovej stopy počas trénovania aj inferencie.

Viacero grafických procesorov NVIDIA
Viacero grafických procesorov NVIDIA

Paralelnosť potrubia rozdeľuje model vertikálne na sekvenčné časti, pričom každá časť obsahuje podmnožinu vrstiev priradených k samostatnému zariadeniu. Napríklad v štvorcestnej pipeline konfigurácii každé zariadenie spracúva štvrtinu vrstiev modelu a výstupy odovzdáva ďalšiemu zariadeniu v poradí. Hoci sa tým výrazne znižujú požiadavky na pamäť na zariadenie, zavádzajú sa tým neefektívnosti známe ako "bubliny pipeline", keď zariadenia môžu byť nečinné, kým čakajú na výstupy z predchádzajúcich vrstiev. Mikrodávkovanie, ktoré rozdeľuje vstupné dávky na menšie čiastkové dávky na sekvenčné spracovanie, môže tieto bubliny znížiť, ale nie úplne odstrániť, pretože časy nečinnosti pretrvávajú počas priechodov dopredu a dozadu.

Naproti tomu tenzorový paralelizmus rozdeľuje jednotlivé vrstvy horizontálne na menšie výpočtové bloky, ktoré sa môžu vykonávať nezávisle na rôznych zariadeniach. To je obzvlášť efektívne pri transformátorových komponentoch, ako sú bloky pozornosti a viacvrstvové perceptróny (MLP), kde sa napríklad rôzne hlavy pozornosti môžu priradiť samostatným zariadeniam na paralelný výpočet. Tenzorový paralelizmus je však menej efektívny pre operácie ako LayerNorm a Dropout, ktoré sa nedajú jednoducho rozdeliť a musia sa replikovať v rôznych zariadeniach, čo vedie k nadbytočnému využívaniu pamäte na ukladanie aktivácií. Toto obmedzenie zdôrazňuje potrebu doplnkových prístupov na optimalizáciu efektívnosti pamäte.

Sekvenčný paralelizmus rieši pamäťovú neefektívnosť operácií ako LayerNorm a Dropout ich rozdelením pozdĺž dimenzie vstupnej sekvencie, čím sa využíva ich nezávislosť od prvkov sekvencie. Táto metóda znižuje pamäťovú stopu nadbytočných aktivácií, čím sa stáva cenným doplnkom tenzorového paralelizmu. Tieto paralelizačné techniky sa navzájom nevylučujú a možno ich kombinovať na ďalšiu optimalizáciu veľkých jazykových modelov (LLM). Okrem toho špecifické optimalizačné stratégie pre modul pozornosti môžu zvýšiť škálovateľnosť a znížiť pamäťové nároky na procesor, čo umožní efektívnejšie trénovanie a odvodzovanie veľkých modelov.

Optimalizácia pozornosti

V roku 2017 Vaswani a kol. v článku *Attention Is All You Need* predstavili model Transformer, ktorého základom je sebapozornosť. Sebapozornosť umožňuje modelu posúdiť vzájomnú relevantnosť rôznych slov vo vete, čím sa zlepšuje kontextové porozumenie pri úlohách, ako je spracovanie prirodzeného jazyka. V článku sa formalizovala samopozornosť, najmä prostredníctvom mechanizmu SDPA (scaled dot-product attention), ktorý mapuje dvojice dotaz a kľúč-hodnota na výstup, čím sa stal kľúčovou zložkou moderných neurónových sietí. Tu sú uvedené niektoré z najdôležitejších techník na optimalizáciu výpočtov pozornosti:

Dokument o pozornosti
Dokument o pozornosti

Pozornosť s viacerými hlavami (MHA) je založená na SDPA paralelným vykonávaním viacerých operácií pozornosti, pričom každá z nich má odlišné projekcie matíc dopytov, kľúčov a hodnôt. Tieto paralelné operácie alebo "hlavy" sa zameriavajú na rôzne reprezentačné podpriestory, čím obohacujú modelové chápanie vstupných údajov. Výstupy z týchto hláv sa spájajú a lineárne premietajú, pričom sa zachováva výpočtová účinnosť porovnateľná s pozornosťou jednej hlavy znížením dimenzionality každej hlavy (napr. vydelením dimenzie modelu počtom hláv, napr. 8).

Pozornosť na viacero dotazov (MQA) optimalizuje MHA na odvodzovanie zdieľaním kľúčových a hodnotových projekcií medzi viacerými hlavami pozornosti pri zachovaní viacerých projekcií dotazov. Tým sa znižujú nároky na šírku pásma pamäte a veľkosť vyrovnávacej pamäte kľúč-hodnota (KV), čo umožňuje väčšie veľkosti dávok a lepšie využitie výpočtovej kapacity. MQA však môže mierne znížiť presnosť a modely, ktoré ju využívajú, si na zachovanie výkonu vyžadujú tréning alebo jemné doladenie so zapnutou MQA.

Pozornosť na zoskupené dotazy (GQA) vyvažuje MHA a MQA zoskupovaním hláv dotazov a zdieľaním projekcií kľúčov a hodnôt v rámci každej skupiny, čím sa dosahuje kvalita blízka MHA s výpočtovou efektívnosťou bližšou MQA. Modely ako Llama 2 70B používajú GQA a modely vyškolené pomocou MHA sa dajú prispôsobiť GQA s minimálnym dodatočným školením. MQA aj GQA znižujú nároky na pamäť KV cache, hoci sú naďalej potrebné ďalšie optimalizácie v oblasti správy cache.

FlashAttention vylepšuje mechanizmy pozornosti zmenou poradia výpočtov tak, aby efektívnejšie využívali hierarchie pamäte GPU. Na rozdiel od tradičného spracovania po vrstvách FlashAttention spája operácie a používa "tiling" na výpočet malých častí výstupnej matice naraz, čím minimalizuje operácie čítania/zápisu do pamäte. Tento algoritmus presnej pozornosti, ktorý si uvedomuje vstupno-výstupné operácie, sa bez problémov integruje do existujúcich modelov bez úprav a ponúka výrazné zrýchlenie vďaka optimalizácii pohybu údajov.

Ukladanie kľúčov do vyrovnávacej pamäte

KV caching je kritická optimalizačná technika používaná počas dekódovacej fázy veľkých jazykových modelov (LLM) na zlepšenie efektívnosti výpočtov vlastnej pozornosti. V tejto fáze každý generovaný token závisí od tenzorov kľúča (K) a hodnoty (V) všetkých predchádzajúcich tokenov vrátane tých, ktoré boli vypočítané počas fázy predvypĺňania a následných krokov dekódovania. Namiesto opätovného výpočtu týchto tenzorov pre každý token v každom časovom kroku ich KV caching ukladá do pamäte GPU, pričom nové tenzory sa do cache pridávajú v čase ich výpočtu. Zvyčajne sa pre každú vrstvu modelu udržiava samostatná vyrovnávacia pamäť KV, čím sa výrazne znižujú nadbytočné výpočty a urýchľuje sa proces dekódovania.

Ukladanie kľúčov do vyrovnávacej pamäte
Ukladanie kľúčov do vyrovnávacej pamäte

Pamäťové požiadavky na LLM na grafických procesoroch určujú predovšetkým dve zložky: váhy modelov a vyrovnávacia pamäť KV. Modelové váhy, ktoré pozostávajú z parametrov modelu, zaberajú značnú časť pamäte; napríklad model so 7 miliardami parametrov, ako je Llama 2 7B v 16-bitovej presnosti, vyžaduje približne 14 GB. Na druhej strane, vyrovnávacia pamäť KV uchováva tenzory vlastnej pozornosti, aby sa predišlo opätovnému prepočítavaniu, pričom jej veľkosť je určená faktormi, ako je počet vrstiev, hlavy pozornosti, rozmery hlavy a presnosť. Pre každý token sa veľkosť vyrovnávacej pamäte vypočíta ako 2 * počet_vrstiev * (počet_hláv * dim_hlavy) * presnosť_v_bytoch, kde faktor 2 zohľadňuje matice K aj V. Pre dávku vstupov sa celková veľkosť vyrovnávacej pamäte KV škáluje s veľkosťou dávky a dĺžkou sekvencie, pričom môže dosiahnuť značné veľkosti, napríklad ~2 GB pre model Llama 2 7B s dĺžkou sekvencie 4 096 a veľkosťou dávky 1.

Efektívna správa vyrovnávacej pamäte KV predstavuje výzvu vzhľadom na jej lineárny rast s veľkosťou dávky a dĺžkou sekvencie, čo môže obmedzovať priepustnosť a komplikovať spracovanie vstupov s dlhým kontextom. Bežná neefektívnosť vyplýva zo statického nadmerného poskytovania, keď je pamäť rezervovaná pre maximálnu podporovanú dĺžku sekvencie (napr. 2 048 tokenov) bez ohľadu na skutočnú veľkosť vstupu. To vedie k značnému plytvaniu pamäťou alebo fragmentácii, pretože veľká časť rezervovaného priestoru často zostáva nevyužitá počas celej doby trvania požiadavky, čo viaže cenné pamäťové zdroje GPU.

Na riešenie týchto neefektívností zavádza algoritmus PagedAttention nový prístup inšpirovaný stránkovaním operačného systému. Rozdeľuje vyrovnávaciu pamäť KV na bloky pevnej veľkosti, z ktorých každý predstavuje stanovený počet tokenov, ktoré môžu byť uložené v pamäti nespojito. Bloková tabuľka sleduje tieto bloky a podľa potreby ich načítava počas výpočtov pozornosti. Pri generovaní nových tokenov sa dynamicky prideľujú ďalšie bloky. Táto metóda minimalizuje plytvanie pamäťou tým, že eliminuje potrebu súvislého prideľovania a nadmerného poskytovania, umožňuje väčšie veľkosti dávok a zlepšuje priepustnosť, čím predstavuje významný pokrok v správe pamäte vyrovnávacej pamäte KV pre LLM.

Optimalizácia modelu

V tejto časti sa zaoberáme rôznymi technikami optimalizácie veľkých jazykových modelov (LLM) s cieľom znížiť ich spotrebu pamäte a zvýšiť výkon na GPU. Kľúčové metódy zahŕňajú kvantizáciu, riedkosť a destiláciu, pričom každá z nich sa zameriava na iné aspekty efektívnosti modelu. Tieto techniky upravujú váhy modelov, využívajú hardvérovú akceleráciu GPU a prenášajú znalosti do menších modelov, čo umožňuje spúšťanie väčších modelov na obmedzenom hardvéri pri zachovaní výkonu. Tieto metódy môžu znížiť presnosť modelu, preto by sa mali používať opatrne.

Kvantovanie znižuje presnosť váh a aktivácií modelu, zvyčajne z 32 alebo 16 bitov na 8 alebo menej bitov, čo umožňuje modelom zaberať menej pamäte a efektívnejšie prenášať údaje. Kým kvantovanie váh je jednoduché vzhľadom na ich pevný charakter po tréningu, kvantovanie aktivácií je zložitejšie kvôli odľahlým hodnotám, ktoré rozširujú ich dynamický rozsah. Techniky ako LLM.int8() to riešia selektívnym použitím vyššej presnosti na určité aktivácie alebo opätovným použitím dynamického rozsahu kvantizovaných váh pre aktivácie, hoci GPU môžu vyžadovať prevod váh späť na vyššiu presnosť pre operácie.

Riedkosť zahŕňa orezanie hodnôt modelu blízkych nule, čím sa vytvoria riedke matice, ktoré vyžadujú menej pamäte. GPU podporujú štruktúrovanú riedkosť, napríklad reprezentovanie dvoch z každých štyroch hodnôt ako núl, čo urýchľuje výpočty. Kombinácia riedkosti s kvantizáciou môže ďalej zvýšiť rýchlosť vykonávania. Výskum pokračuje v skúmaní optimálnych riedkych reprezentácií pre LLM, čo naznačuje sľubnú cestu na zlepšenie rýchlosti odvodzovania.

Destilácia prenáša znalosti z väčšieho "učiteľského" modelu do menšieho "študentského" modelu, čím sa zmenšuje veľkosť pri zachovaní výkonu. Napríklad DistilBERT dosahuje 40 % zníženie veľkosti a 60 % zvýšenie rýchlosti v porovnaní s BERT, pričom si zachováva 97 % svojich schopností. Distilácia môže zahŕňať napodobňovanie výstupov učiteľa alebo používanie údajov vytvorených učiteľom na trénovanie, pričom metódy ako "Distilácia krok za krokom!" obsahujú zdôvodnenia efektívneho učenia. Obmedzujúce licencie na mnohé pokročilé LLM však obmedzujú dostupnosť vhodných modelov učiteľov na destiláciu.

Špekulatívne závery

Špekulatívne odvodzovanie, známe aj ako špekulatívne vzorkovanie alebo asistované generovanie, je metóda na paralelizáciu vykonávania autoregresívnych modelov veľkých jazykov (LLM), ako sú modely typu GPT, ktoré zvyčajne generujú text token po tokene. Pri štandardnom vykonávaní závisí každý token od všetkých predchádzajúcich tokenov, čo znemožňuje paralelné generovanie, keďže n-ty token musí byť vygenerovaný pred (n+1)tym. Špekulatívna inferencia to rieši použitím "lacnejšieho" návrhu modelu na predpovedanie viacerých budúcich tokenov súčasne, ktoré sú potom paralelne overované alebo zamietané hlavným modelom, čo umožňuje rýchlejšie generovanie textu.

Tento proces zahŕňa generovanie návrhu pokračovania niekoľkých tokenov pomocou metódy menej náročnej na zdroje, po ktorej nasleduje paralelné overovanie hlavným modelom s použitím návrhu ako špekulatívneho kontextu. Ak sa overovací model zhoduje s návrhom tokenov, sú akceptované; v opačnom prípade sa nezhodujúce sa tokeny a nasledujúce tokeny vyradia a proces sa opakuje s novým návrhom. Návrh tokenov sa môže generovať pomocou rôznych prístupov, ako je trénovanie viacerých modelov, jemné ladenie viacerých hláv na predtrénovanom modeli s cieľom predpovedať budúce tokeny alebo použitie menšieho návrhu modelu spolu s väčším, schopnejším overovacím modelom, pričom každý z nich má svoje vlastné kompromisy.

Disagregované odvodzovanie

Disagregované odvodzovanie je technika, pri ktorej sa výpočtové úlohy rozdelia na rôzny hardvér s cieľom optimalizovať výkon, náklady a využitie zdrojov. Konkrétne ide o oddelenie fáz predvyplňovania a dekódovania. Rozdelením týchto fáz možno každú z nich priradiť hardvéru, ktorý je najvhodnejší pre jej výpočtové požiadavky, čím sa zlepší efektívnosť a škálovateľnosť.

Disagregované odvodzovanie
Disagregované odvodzovanie

Predvypĺňanie je náročné na výpočty, vyžaduje si značné násobenie matíc na spracovanie celej vstupnej výzvy a vytvorenie vyrovnávacej pamäte KV. Táto fáza ťaží z vysoko výkonného hardvéru, ako sú GPU alebo TPU, ktoré vynikajú v paralelných výpočtoch. Keďže predvypĺňanie je jednorazová úloha na jednu inferenčnú požiadavku, možno ju preniesť na centralizovaný výkonný výpočtový uzol optimalizovaný na takéto pracovné zaťaženie. Toto nastavenie umožňuje rýchlejšie spracovanie veľkých výziev a znižuje záťaž menej výkonných zariadení, takže je ideálne pre prostredia založené na cloude alebo dátových centrách, kde je k dispozícii výkonný hardvér.

Dekódovanie je naopak viazané na pamäť a zahŕňa iteračné generovanie tokenov, pričom sa vo veľkej miere spolieha na prístup do vyrovnávacej pamäte KV. Vyžaduje menší výpočtový výkon, ale potrebuje rýchly prístup do pamäte, takže je vhodné pre menej výkonný, pamäťovo optimalizovaný hardvér, ako sú procesory alebo okrajové zariadenia. Presunutím dekódovania na samostatný hardvér - potenciálne bližšie ku koncovému používateľovi, ako sú lokálne servery alebo okrajové zariadenia - sa pri dezagregovanom odvodzovaní zníži latencia a nároky na šírku pásma siete. Toto oddelenie umožňuje flexibilné nasadenie, pri ktorom prefiltrovanie prebieha na špičkových cloudových serveroch a dekódovanie na lokálnych alebo okrajových zariadeniach, čo optimalizuje prideľovanie zdrojov a umožňuje efektívne škálovanie pre aplikácie, ako sú chatboty v reálnom čase alebo interaktívne systémy umelej inteligencie.

Záver

V poslednom čase bolo vynájdených mnoho techník optimalizácie odvodzovania s cieľom zlepšiť výkonnosť LLM.

Implementácia týchto techník si vyžaduje hlboké pochopenie architektúry LLM a hardvéru, ktorý používate, takže je vo všeobecnosti jednoduchšie použiť existujúci inferenčný engine, ktorý už tieto techniky implementoval, ako napríklad vLLM, TensorRT-LLM, LMDeploy atď. V skutočnosti sme tieto techniky implementovali v našom vlastnom inferenčnom engine v NLP Cloud a ak chcete nasadiť svoje vlastné modely, napísali sme príspevok na blogu o inferenčných enginoch: si ho môžete prečítať tu.

Ak nemôžete alebo nechcete sami nasadiť vlastné LLM, môžete použiť službu NLP Cloud a využívať rýchle generatívne modely AI vo veľkom meradle v produkcii. Vyskúšajte rýchle odvodzovanie v službe NLP Cloud teraz!

Ak máte otázky týkajúce sa inferenčných motorov vo všeobecnosti, neváhajte sa nás opýtať, vždy vám radi poradíme!

Julien
Technický riaditeľ spoločnosti NLP Cloud