Võitlevad tehisintellekti või täieliku arendusega? Meie eksperdid on siin, et teid juhendada: kohandatud nõuanded, tehniline integratsioon ja palju muud. Võtke ühendust aadressil [email protected].

LLM järelduste optimeerimise tehnikad

Järelduste optimeerimine on tootmises kasutatavate genereerivate tehisintellekti rakenduste kriitiline osa. LLMide tõhus kasutamine mastaabis on väljakutse ja viimastel aastatel on välja töötatud palju meetodeid, et muuta järeldamine kiiremaks ja odavamaks. Vaatleme neid tehnikaid selles artiklis.

LLM järelduste optimeerimise tehnikad

Tähelepanu LLM-arhitektuurile

Suured keelemudelid (LLM) põhinevad kõik 2017. aastal Vaswani et al. poolt leiutatud transformaatorite arhitektuuril. Transformaatorite arhitektuuriga saavutatakse ülekaalukas täpsus, vähese õppimise ja peaaegu inimvõimelised võimed erinevates keeleülesannetes. Siiski on neid alusmudeleid, mis sageli sisaldavad kümneid kuni sadu miljardeid parameetreid, kulukas treenida ja järeldamise ajal ressursimahukad. Järeldamise kulud suurenevad pikkade sisendkontekstide puhul, mis nõuavad suurte sisendandmete tõttu märkimisväärset töötlemisvõimsust. See muudab tõhusa järeldamise kriitiliseks väljakutseks, eriti mälu- ja arvutusressursside haldamisel.

Trafo arhitektuur
Trafo arhitektuur

Täpsemalt, enamik tuntud LLM-idest on ainult dekooderiga LLM-id, nagu GPT-3, GPT-4, LLaMA, Mistral, DeepSeek jne. Need mudelid on eelnevalt treenitud põhjusliku modelleerimise ülesande alusel, toimides järgmise sõna ennustajatena. Nad töötlevad sisendina žetoonide jada ja toodavad autoregressiivselt järgmisi žetooni, kuni saavutatakse peatumistingimus.

LLM-järeldus ainult dekooderiga mudelites hõlmab kahte põhifaasi: eeltäitmise faas ja dekodeerimise faas. Eeltäitmisfaasis töötleb mudel sisendmärke, et arvutada vahepealsed olekud (võtmed ja väärtused) esimese uue märgi genereerimiseks. See faas, mis sarnaneb maatriks-maatriks-operatsiooniga, on väga paralleelselt rakendatav ja kasutab tõhusalt GPU võimalusi. Seevastu dekodeerimisfaas genereerib žetoonid ükshaaval, tuginedes eelmiste žetoonide olekutele. See maatriks-vektor operatsioon on mälupõhine, kuna andmete ülekandmine GPU-le, mitte arvutamiskiirus, määrab peamiselt latentsuse, mis viib GPU arvutusvõimsuse alakasutamiseni.

Dekodeerimisfaasi optimeerimine on järeldusprobleemide lahendamise keskmes. Lahenduste hulka kuuluvad tõhusate tähelepanumehhanismide väljatöötamine ning võtmete ja väärtuste parem haldamine, et vähendada mälu kitsaskohti. Postituses tuuakse välja praktilised lähenemisviisid järelduste jõudluse suurendamiseks, eeldades, et lugejatel on põhiteadmised transformaatori arhitektuurist ja tähelepanumehhanismidest. Need optimeerimised on olulised läbilaskevõime parandamiseks ja latentsuse vähendamiseks LLM-i tegelikes rakendustes.

Täiendav keerukus tuleneb erinevate tokenizerite kasutamisest erinevates LLMides, mis mõjutab tokenite võrreldavust. Tokenid, mis vastavad ligikaudu neljale ingliskeelsele tähemärgile, on sõltuvalt tokenizerist erinevalt esitatud, mis muudab otsesed võrdlused järelduste jõudluse kohta (nt tokenid sekundis) eksitavaks. Selline varieeruvus rõhutab vajadust standardiseeritud hindamismetoodika järele, et täpselt hinnata ja võrrelda LLMi jõudlust järelduste tegemisel.

Panustamine

Parteerimine on peamine strateegia GPU kasutamise ja läbilaskevõime parandamiseks suurte keelemudelite (LLM) puhul. Mitme päringu samaaegne töötlemine sama mudeli abil jaotab mudeli kaalude mälukulu päringute vahel, võimaldades suuremate partiide puhul kasutada rohkem GPU arvutusvõimsust. Partii suurusel on siiski piir, sest liiga suured partiid võivad LLMide mälunõudluse tõttu põhjustada mälu ülevoolu, eriti seoses võtmeväärtuste (KV) vahemäluga (sellest lähemalt hiljem).

Panustamismeetodid
Panustamismeetodid

Traditsioonilisel või staatilisel pakkimisel on piirangud, sest taotlused ühe paki piires loovad sageli erineva arvu lõpetamistunnuseid, mis toob kaasa erinevad täitmisajad. See põhjustab selle, et kõik taotlused ootavad kõige aeglasema lõpetamist, mis võib olla problemaatiline, kui genereerimise pikkus on märkimisväärselt erinev. Selle probleemi lahendamiseks on välja töötatud täiustatud tehnikad, nagu lennu ajaline pakkimine, et optimeerida jõudlust.

Lennu ajal toimuv pakkimine, mida nimetatakse ka pidevaks pakkimiseks, aitab lahendada LLM-i töökoormuse dünaamilisest iseloomust tulenevaid probleeme, mis võivad ulatuda lihtsatest vestlusroboti vastustest kuni keeruliste dokumentide kokkuvõtete või koodide genereerimiseni. Need ülesanded toodavad väga erineva suurusega väljundeid, mistõttu on raske taotlusi tõhusalt paralleelselt töödelda ja täita. Erinevalt staatilisest pakkimisest võimaldab lennu ajal toimuv pakkimine serveril lõpetada lõpetatud jadade pakkimise kohe ja alustada uute taotluste töötlemist, kui teised on veel pooleli. See lähenemisviis suurendab märkimisväärselt GPU kasutust, kohandudes päringute erineva täitmisajaga reaalsetes stsenaariumides.

Multi-GPU kasutuselevõtt mudeli paralleelsusega

Mudelite paralleelistamine on kriitiline strateegia suurte masinõppe mudelite mälu- ja arvutusnõuete haldamiseks, jaotades need mitmele GPU-le. See lähenemisviis võimaldab käsitleda suuremaid mudeleid või sisendipartiisid, mis ületavad ühe seadme mälumahtu, mistõttu on see oluline nii treenimiseks kui ka järelduste tegemiseks, kui mälupiirangud on kitsad. Mudelite kaalude jagamiseks on olemas erinevaid tehnikaid, sealhulgas toruparallelism, tensorparallelism ja järjestusparallelism, millest igaüks käsitleb mudeli jaotamise erinevaid aspekte. Erinevalt andmete paralleelsusest, mis keskendub mudeli kaalude kordamisele eri seadmetes, et töödelda suuremaid sisendpartiisid koolituse ajal, on need meetodid olulisemad mälujälje vähendamiseks nii koolituse kui ka järelduste tegemisel.

Mitu NVIDIA GPU-d
Mitu NVIDIA GPU-d

Torustiku paralleelsus jagab mudeli vertikaalselt järjestikuste osade kaupa, kusjuures iga osa sisaldab eraldi seadmele määratud kihtide alamhulka. Näiteks neljakäigulise torujuhtme ülesehituses töötleb iga seade veerandit mudeli kihtidest, edastades väljundid järjestikku järgmisele seadmele. Kuigi see vähendab oluliselt mäluvajadust seadme kohta, tekitab see ebatõhusust, mida nimetatakse "torujuhtme mullideks", kus seadmed võivad seisata, oodates eelmiste kihtide väljundeid. Mikropartiisimine, mis jagab sisendpartiid väiksemateks alampartiideks järjestikuse töötlemise jaoks, võib neid mullid vähendada, kuid ei kõrvalda neid täielikult, kuna tühikäigud jäävad edasi- ja tagasikäikude ajal püsima.

Tensorparallelism seevastu tükeldab üksikud kihid horisontaalselt väiksemateks arvutusplokkideks, mida saab sõltumatult eri seadmetes täita. See on eriti tõhus selliste transformaatorite komponentide puhul nagu tähelepanuplokid ja mitmekihilised pertseptronid (MLP), kus näiteks erinevad tähelepanupead saab paralleelseks arvutamiseks määrata eraldi seadmetele. Tensorparallelism on aga vähem tõhus selliste operatsioonide puhul nagu LayerNorm ja Dropout, mida ei saa hõlpsasti jagada ja mida tuleb korrata erinevates seadmetes, mis toob kaasa üleliigse mälukasutuse aktiveerimiste salvestamiseks. See piirang rõhutab vajadust täiendavate lähenemisviiside järele, et optimeerida mälu tõhusust.

Järjestuse paralleelsus tegeleb selliste operatsioonide nagu LayerNorm ja Dropout mälu ebaefektiivsusega, jaotades neid mööda sisendjärjestuse mõõdet, kasutades ära nende sõltumatust järjestuse elementide vahel. See meetod vähendab üleliigsete aktivatsioonide mälumahtu, mis muudab selle väärtuslikuks täienduseks tensorparallelismile. Need paralleliseerimistehnikad ei välista üksteist ja neid saab kombineerida, et optimeerida suuri keelemudeleid (LLM) veelgi. Lisaks võivad tähelepanu mooduli spetsiifilised optimeerimisstrateegiad suurendada skaleeritavust ja vähendada mälunõudlust GPU kohta, võimaldades suurte mudelite tõhusamat treenimist ja järelduste tegemist.

Tähelepanu optimeerimine

Vaswani jt. 2017. aasta kirjutises *Attention Is All You Need* tutvustati Transformer-mudelit, mille nurgakiviks on enese tähelepanu. Enesehäälestus võimaldab mudelil hinnata erinevate sõnade asjakohasust lauses üksteise suhtes, parandades kontekstuaalset mõistmist selliste ülesannete puhul nagu loomuliku keele töötlemine. Artiklis formaliseeriti enesehäälestus, eelkõige SDPA (Scaled Dot-product Attention) mehhanismi kaudu, mis kaardistab päringu ja võtme-väärtuse paarid väljundiks, muutes selle kaasaegsete neurovõrkude keskseks komponendiks. Siin on mõned kõige olulisemad tehnikad tähelepanuarvutuste optimeerimiseks:

Tähelepanu paber
Tähelepanu paber

Multi-head attention (MHA) tugineb SDPA-le, käivitades paralleelselt mitu tähelepanuoperatsiooni, millest igaühel on erinevad päringu-, võtme- ja väärtusmaatriksite projektsioonid. Need paralleelsed operatsioonid ehk "pead" keskenduvad erinevatele representatiivsetele alamruumidele, rikastades mudeli arusaamist sisendist. Nende peade väljundid ühendatakse ja projitseeritakse lineaarselt, säilitades ühe peaga tähelepanuga võrreldava arvutusliku tõhususe, vähendades iga pea dimensioonilisust (nt jagades mudeli dimensiooni peade arvuga, näiteks 8).

Mitme päringu tähelepanu (MQA) optimeerib MHA-d järelduste tegemiseks, jagades võtme- ja väärtuseprojektsioone mitme tähelepanu pea vahel, säilitades samal ajal mitu päringuprojektsiooni. See vähendab mälu ribalaiusnõudeid ja võtme-väärtuse (KV) vahemälu suurust, võimaldades suuremaid partiide suurusi ja paremat arvutuskasutust. MQA võib siiski pisut vähendada täpsust ja seda kasutavaid mudeleid tuleb jõudluse säilitamiseks treenida või peenhäälestada, kui MQA on sisse lülitatud.

Grupeeritud päringu tähelepanu (GQA) tasakaalustab MHA ja MQA, grupeerides päringupead ja jagades võtme väärtuste projektsioone igas grupis, saavutades peaaegu MHA-kvaliteedi ja MQA-le lähemal oleva arvutustõhususe. Sellised mudelid nagu Llama 2 70B kasutavad GQA-d ja MHA-ga koolitatud mudeleid saab kohandada GQA-le minimaalse lisakoolitusega. Nii MQA kui ka GQA vähendavad KV vahemälu nõudlust, kuigi vahemälu haldamise edasine optimeerimine on endiselt vajalik.

FlashAttention täiustab tähelepanumehhanisme, korrastades arvutused ümber, et tõhusamalt kasutada GPU mäluhierarhiat. Erinevalt traditsioonilisest kihtide kaupa töötlemisest sulatab FlashAttention operatsioone ja kasutab "plaatimist" väljundmaatriksi väikeste osade arvutamiseks korraga, minimeerides mälu lugemis- ja kirjutamisoperatsioone. See I/O-teadlik, täpne tähelepanualgoritm integreerub sujuvalt olemasolevatesse mudelitesse ilma muudatusteta, pakkudes märkimisväärset kiirendust andmete liikumise optimeerimise kaudu.

Võtme-väärtuse vahemälu

KV vahemälu on kriitiline optimeerimistehnika, mida kasutatakse suurte keelemudelite (LLM) dekodeerimisfaasis, et parandada enesekohaste arvutuste tõhusust. Selles faasis sõltub iga genereeritud märgend kõigi eelnevate märgendite võtme (K) ja väärtuse (V) tensoritest, sealhulgas eeltäitmise etapis ja järgmistes dekodeerimisetappides arvutatud märgenditest. Selle asemel, et neid tensoreid iga märgi jaoks igal ajasammul uuesti arvutada, salvestab KV vahemälu need GPU mällu, lisades uusi tensoreid vahemällu nende arvutamise ajal. Tavaliselt säilitatakse eraldi KV vahemälu mudeli iga kihi jaoks, mis vähendab märkimisväärselt üleliigseid arvutusi ja kiirendab dekodeerimisprotsessi.

Võtme-väärtuse vahemälu
Võtme-väärtuse vahemälu

LLM-i mäluvajadus GPUs tuleneb peamiselt kahest komponendist: mudeli kaalud ja KV vahemälu. Mudeli kaalud, mis koosnevad mudeli parameetritest, võtavad märkimisväärselt palju mälu; näiteks 7 miljardi parameetriga mudel nagu Llama 2 7B 16-bitise täpsusega nõuab umbes 14 GB. KV vahemälu seevastu salvestab uuesti arvutamise vältimiseks enesekohaseid tensoreid, kusjuures selle suurus sõltub sellistest teguritest nagu kihtide arv, tähelepanupead, pea mõõtmed ja täpsus. Iga märgendi puhul arvutatakse vahemälu suurus järgmiselt: 2 * num_layers * (num_heads * dim_head) * precision_in_bytes, kus tegur 2 arvestab nii K- kui ka V-maatriksit. Sisendite partii puhul kasvab KV vahemälu kogusuurus koos partii suuruse ja järjestuse pikkusega, saavutades potentsiaalselt märkimisväärse suuruse, näiteks ~2 GB Llama 2 7B mudeli puhul, mille järjestuse pikkus on 4096 ja partii suurus on 1.

KV vahemälu tõhus haldamine tekitab probleeme, kuna selle maht kasvab lineaarselt koos partii suuruse ja järjestuse pikkusega, mis võib piirata läbilaskevõimet ja raskendada pika kontekstiga sisendite käsitlemist. Üldine ebaefektiivsus tuleneb staatilisest ülevarustamisest, kus mälu reserveeritakse maksimaalse toetatud järjestuse pikkuse jaoks (nt 2 048 märki), olenemata tegelikust sisendi suurusest. See toob kaasa märkimisväärse mälu raiskamise või killustatuse, kuna suur osa reserveeritud ruumist jääb sageli kasutamata kogu päringu eluea jooksul, mis seob väärtuslikke GPU mäluressursse.

Nende ebatõhususte kõrvaldamiseks võetakse PagedAttention algoritmiga kasutusele uudne lähenemine, mis on inspireeritud operatsioonisüsteemi lehtede sirvimisest. See jagab KV vahemälu fikseeritud suurusega plokkideks, millest igaüks kujutab endast kindlat arvu märklaid, mida saab mällu salvestada mitteüheselt. Blokitabel jälgib neid plokke, võttes neid vajaduse korral tähelepanu arvutuste ajal. Uute märkide tekkimisel eraldatakse dünaamiliselt täiendavaid plokke. See meetod minimeerib mälu raiskamist, kõrvaldades vajaduse sidusaks jaotamiseks ja liigseks eraldamiseks, võimaldades suuremaid partiide suurusi ja parandades läbilaskevõimet, mis teeb sellest olulise edasimineku KV vahemälu haldamisel LLMide jaoks.

Mudeli optimeerimine

Selles jaotises arutame erinevaid tehnikaid suurte keelemudelite (LLM) optimeerimiseks, et vähendada nende mälukulu ja suurendada jõudlust GPUs. Peamised meetodid on kvantimine, hõredus ja destillatsioon, millest igaüks on suunatud mudeli tõhususe erinevatele aspektidele. Need meetodid muudavad mudeli kaalusid, kasutavad ära GPU riistvara kiirendust ja kannavad teadmisi väiksematele mudelitele üle, võimaldades suuremate mudelite töötamist piiratud riistvaral, säilitades samal ajal jõudluse. Need meetodid võivad vähendada mudeli täpsust, seega tuleks neid kasutada ettevaatlikult.

Kvantimine vähendab mudeli kaalude ja aktiveerimiste täpsust, tavaliselt 32 või 16 bitilt 8 või vähemale bitile, mis võimaldab mudelitel hõivata vähem mälu ja edastada andmeid tõhusamalt. Kui kaalude kvantimine on lihtne, kuna need on treenimisjärgselt fikseeritud, siis aktiveerimiste kvantimine on keerulisem, kuna nende dünaamilist ulatust laiendavad kõrvalekalded. Sellised tehnikad nagu LLM.int8() lahendavad selle probleemi, kohaldades teatud aktiveerimiste suhtes valikuliselt suuremat täpsust või kasutades uuesti kvanteeritud kaalude dünaamilist vahemikku aktiveerimiste jaoks, kuigi GPU-d võivad nõuda kaalude teisendamist tagasi suuremale täpsusele operatsioonide jaoks.

Harvus hõlmab mudeli nullilähedaste väärtuste kärpimist, luues hõredad maatriksid, mis nõuavad vähem mälu. GPUd toetavad struktureeritud hõredust, näiteks kahe väärtuse esitamist neljast nullidena, mis kiirendab arvutusi. Harvaesinevuse ja kvantimise kombineerimine võib veelgi suurendada täitmiskiirust. Teadusuuringud jätkavad optimaalse hõreda representatsiooni uurimist LLMide jaoks, mis näitab paljulubavat teed järelduste tegemise kiiruse parandamiseks.

Destillatsioon kannab teadmised suuremast "õpetaja" mudelist üle väiksemasse "õpilase" mudelisse, vähendades suurust, säilitades samas jõudluse. Näiteks saavutab DistilBERT 40% suuruse vähenemise ja 60% kiiruse kasvu võrreldes BERTiga, säilitades 97% oma võimekusest. Distillatsioon võib hõlmata õpetaja väljundite jäljendamist või õpetaja poolt genereeritud andmete kasutamist treenimiseks, kusjuures meetodid nagu "Distilling Step by Step!" sisaldavad ratsionaalseid põhjendusi tõhusaks õppimiseks. Paljude täiustatud LLMide piiravad litsentsid piiravad siiski destilleerimiseks sobivate õpetajamudelite kättesaadavust.

Spekulatiivne järeldus

Spekulatiivne järeldamine, mida nimetatakse ka spekulatiivseks proovivõtuks või abistavaks genereerimiseks, on meetod autoregressiivsete suurte keelemudelite (LLM), näiteks GPT-stiilis mudelite, mis tavaliselt genereerivad teksti sümbolite kaupa, täitmise paralleelseks muutmiseks. Tavapärase täitmise korral sõltub iga märgendi kontekstist kõikidest eelnevatest märgenditest, mis muudab paralleelse genereerimise võimatuks, kuna n-nes märgend tuleb genereerida enne (n+1)-ndat märgendit. Spekulatiivne tuletamine lahendab selle probleemi, kasutades "odavamat" eelnõudemudelit, et ennustada samaaegselt mitut tulevast märki, mida siis põhimudel paralleelselt kontrollib või tagasi lükkab, võimaldades kiiremat tekstigenereerimist.

Protsess hõlmab mitmest tokenist koosneva jätkuprojekti genereerimist vähem ressursimahuka meetodi abil, millele järgneb paralleelne kontrollimine põhimudeli poolt, kasutades eelnõud spekulatiivse kontekstina. Kui kontrollmudel vastab eelnõule, võetakse need vastu; vastasel juhul jäetakse mittevastavad märgid ja järgnevad märgid kõrvale ning protsess kordub uue eelnõuga. Eelnõude märkide genereerimiseks võib kasutada erinevaid lähenemisviise, näiteks mitme mudeli treenimine, eelkoolitatud mudeli mitme pea peenhäälestamine tulevaste märkide prognoosimiseks või väiksema eelnõumudeli kasutamine koos suurema, võimekama kontrollimudeliga, millest igaühel on omad kompromissid.

Disagregeeritud järeldus

Disagregeeritud järelduste tegemine on tehnika, mille puhul arvutuslikud ülesanded jaotatakse eri riistvara vahel, et optimeerida jõudlust, kulusid ja ressursikasutust. Konkreetselt eraldatakse eeltäitmis- ja dekodeerimisfaasid. Nende etappide lahutamine võimaldab määrata iga faasi arvutuslikele nõudmistele kõige paremini vastavale riistvarale, mis parandab tõhusust ja skaleeritavust.

Disagregeeritud järeldus
Disagregeeritud järeldus

Eeltäitmine on arvutusmahukas, nõudes märkimisväärseid maatriksikordistusi, et töödelda kogu sisendkäsklust ja toota KV vahemälu. Selles etapis on kasu suure jõudlusega riistvarast, nagu GPU või TPU, mis on paralleelarvutuste tegemisel suurepärased. Kuna eeltäitmine on ühekordne ülesanne iga järeldusnõude kohta, saab selle üle kanda tsentraliseeritud, võimsale arvutussõlmele, mis on optimeeritud selliste töökoormuste jaoks. Selline ülesehitus võimaldab suurte päringute kiiremat töötlemist ja vähendab vähem võimekate seadmete koormust, mistõttu on see ideaalne pilvepõhistes või andmekeskuste keskkondades, kus on olemas suure läbilaskevõimega riistvara.

Seevastu dekodeerimine on mälupõhine ja hõlmab iteratiivset sümbolite genereerimist, mis tugineb suuresti KV vahemälude kasutamisele. See nõuab vähem arvutusvõimsust, kuid vajab kiiret juurdepääsu mälule, mistõttu sobib see vähem võimsale, mälu optimeeritud riistvarale, nagu protsessorid või servaseadmed. Kui dekodeerimine viiakse eraldi riistvarasse - potentsiaalselt lõppkasutajale lähemale, näiteks kohapealsetesse serveritesse või servaseadmetesse -, siis vähendab lahutatud järeldamine latentsust ja võrgu ribalaiusnõudeid. Selline eraldamine võimaldab paindlikku kasutuselevõttu, kus eeltäitmine toimub kõrgekvaliteedilistes pilveserverites ja dekodeerimine kohalikes või servaseadmetes, optimeerides ressursside jaotamist ja võimaldades tõhusat skaleerimist selliste rakenduste jaoks nagu reaalajas töötavad juturobotid või interaktiivsed tehisintellekti süsteemid.

Kokkuvõte

Hiljuti on leiutatud mitmeid järelduste optimeerimise meetodeid, et parandada LLMide jõudlust.

Nende tehnikate rakendamine nõuab LLM-arhitektuuri ja kasutatava riistvara põhjalikku tundmist, mistõttu on üldiselt lihtsam kasutada olemasolevat järeldusmasinat, mis on need tehnikad juba rakendanud, nagu vLLM, TensorRT-LLM, LMDeploy jne. Me oleme tegelikult rakendanud need tehnikad omaenda järeldusmootoris NLP Cloudis ja me oleme kirjutanud järeldusmootoritest blogipostituse, kui soovite oma mudeleid kasutusele võtta: saate seda lugeda siit.

Kui te ei saa või ei taha oma LLM-i ise kasutusele võtta, saate kasutada NLP Cloudi ja kasutada kiireid genereerivaid tehisintellekti mudeleid tootmises. Proovi kiireid järeldusi NLP Cloudis nüüd!

Kui teil on küsimusi järeldusmootorite kohta üldiselt, küsige julgelt, meil on alati hea meel teid nõustada!

Julien
NLP Cloudi tehnoloogiajuht