Prompt engineering

Kiihdytä suurten kielen mallien inference: Tekniikat tehokkaaseen käyttöönottoon

mm
LLM Inference Speed up

Suuret kielen mallit (LLM) kuten GPT-4, LLaMA ja PaLM ovat viemässä luonnollisen kielen prosessoinnin mahdollisuuksia eteenpäin. Kuitenkin näiden massiivisten mallien käyttöönotto tuotantoympäristöissä esittää merkittäviä haasteita laskennallisten vaatimusten, muistin käytön, viiveen ja kustannusten suhteen. Koska LLM:t jatkavat kasvamistaan suuremmiksi ja kykyisemmiksi, niiden inference-suorituskyvyn optimointi on kriittistä todellisten sovellusten kannalta.

Tässä teknisessä syväsukelluksessa tutkimme viimeisimpiä tekniikoita kiihdyttämään LLM-inferenssiä, mahdollistaen nopeammat vastausajat, suuremman läpimenoisuuden ja tehokkaamman laitteiston resurssien käytön. Käsittelemme menetelmiä, jotka ulottuvat numeerisen tarkinasteisuuden tekniikoista uusiin huomion mekanismeihin ja arkkitehtuurin innovaatioihin, jotka on suunniteltu nimenomaan tehokkaalle tekstin generoinnille.

Aloita ymmärtämällä, miksi LLM-inferenssi on haasteellista verrattuna perinteisiin NLP-malleihin.

Haaste suurten kielen mallien inferenssissä

Ennen LLM:iä luonnollisen kielen prosessointi perustui pienempiin malleihin, jotka keskittyivät tiettyihin tehtäviin kuten tekstin luokitteluun, nimien tunnistamiseen ja mielipidetutkimukseen. Vaikka nämä mallit olivat edelleen laskennallisia, ne voitiin käyttöönottaa kohtuullisella laitteistolla ja noudattivat suhteellisen suoraviivaista inference-prosessia.

LLM:t edustavat kuitenkin paradigman muutosta. Nämä mallit on koulutettu valtavilla tietoaineistoilla, joissa on miljardeja parametreja, mikä mahdollistaa niiden suorittamisen laajaa joukkoa kielen tehtäviä merkittävällä taidolla. Tämä valta tulee kuitenkin kustannuksella – dramaattisesti lisääntyneillä laskennallisilla vaatimuksilla sekä koulutuksen aikana että inference-ajan.

Yksi avainhaaste on tekstin generoinnin autoregressiivinen luonne LLM:issä. Ihmismäisessä tekstin tuottamisessa nämä mallit ennustavat yhden tokenin (sanana tai subwordina) kerrallaan, jossa jokainen uusi token riippuu aiemmin tuotetusta tulosteesta. Tämä sekvenssinen riippuvuus estää tehokkaan rinnakkaisuuden ja johtaa laskennallisiin vaatimuksiin, jotka kasvavat polynominaalisesti sekvenssin pituuden mukaan.

Lisäksi LLM:t usein vaativat pitkiä syöte-sekvenssejä (ohjeita) luodakseen tarvittavan kontekstin korkealaatuiselle tekstin generoinnille. Pitemmät syöte-pituudet vaativat enemmän muistia väliaikaisten tilojen ja huomio-matriisien tallentamiseen, mikä rasittaa laitteiston resursseja entisestään.

Näiden ainutlaatuisten haasteiden vuoksi perinteiset optimointitekniikat kuten kvantisaatio ja staattiset laskentakaavat voivat olla riittämättömiä, kamppaillessaan LLM-suorituskyvyn ylläpitämisen kanssa samalla kun ne tarjoavat merkittäviä nopeutuksia. Tutustumme nyt joillekin keskeisistä strategioista, jotka on suunniteltu nimenomaan kiihdyttämään LLM-inferenssiä.

Numeerisen tarkinasteisuuden tekniikat

32-bittisestä 16-bittiseen tarkinasteisuuteen

32-bittisestä 16-bittiseen tarkinasteisuuteen

Yksi tapa kiihdyttää LLM-inferenssiä on hyödyntää vähennettyä numeerista tarkinasteisuutta mallipainoille ja aktivaatioille. Nykyaikaiset syväoppimisen kehykset kuten PyTorch ja TensorFlow käyttävät yleensä 32-bittistä liukulukutarkinasteisuutta oletuksena. Kuitenkin tutkimus on osoittanut, että LLM:t voivat usein ylläpitää korkeaa tarkinasteisuutta jopa alhaisemmissa tarkinasteisuuksissa, kuten 16-bittisessä (FP16), 8-bittisissä kokonaisluvuissa (INT8) tai jopa 4-bittisissä kokonaisluvuissa (INT4).

Numeerisen tarkinasteisuuden vähentäminen tarjoaa useita etuja:

  • Vähennetty muistijälki: Alempi tarkinasteisuus edellyttää vähemmän muistia, mahdollistaen suurempien mallien tai eräkokojen sijoittamisen samoihin laitteistoon.
  • Nopeampi laskenta: Monet modernit CPU:t ja GPU:t tarjoavat erikoisohjeita ja laitteiston kiihdytystä alempaan tarkinasteisuuteen, mahdollistaen merkittäviä nopeutuksia.
  • Parannettu energiatehokkuus: Pienemmän muistinvaatimusten ja nopeamman laskennan ansiosta alempi tarkinasteisuus voi kääntyä vähemmän energiankulutukseen – tärkeä etu reunalla ja mobiilissa käytössä.

Vaikka numeerisen tarkinasteisuuden tekniikat ovat voimakkaita, ne esittävät tietyn tarkinasteisuuden menetyksen verrattuna 32-bittiseen toimintaan. Avain on arvioida tarkasti tämä tasapaino laskennallisten hyötyjen ja potentiaalisen suorituskyvyn heikentymisen välillä kussakin tapauksessa.

On kaksi pääasiallista lähestymistapaa LLM-kvantisaatioon:

Koulutuksen jälkeinen kvantisaatio (PTQ): Tässä menetelmässä LLM koulutetaan ensin käyttäen standardia 32-bittistä tarkinasteisuutta. Koulutuksen jälkeen mallipainot kvantisoidaan (muunnetaan) alempaan tarkinasteisuuteen, kuten INT8 tai INT4. PTQ on suoraviivainen toteuttaa, mutta voi johtaa suurempiin tarkinasteisuuden menetyksiin.

Kvantisaatiotietoinen koulutus (QAT): QAT:ssa kvantisaatioprosessi simuloidaan itse koulutusvaiheessa. Tämä mahdollistaa mallille oppimisen kompensoida kvantisaatiavirheitä, minimoiden tarkinasteisuuden heikentymisen, kun lopullinen kvantisoidtu malli otetaan käyttöön. QAT on monimutkaisempi, mutta usein tarjoaa parempia tuloksia verrattuna PTQ:hen.

Käytännön soveltamisessa voi hyödyntää esikvantisoituja malleja, jotka ovat saatavilla alustoilla kuten Hugging Face, joka isännöi laajan valikoiman malleja, jotka on optimoitu eri kvantisaatiomenetelmillä. Esimerkiksi, jos halutaan malli, joka on kvantisoinut Auto-GPTQ:lla, käyttäjät voivat ladata sen helposti Hugging Facen transformers-kirjastosta. Lisäksi, kvantisoitaessa mallia, voidaan käyttää työkaluja kuten AutoGPTQ, jotka integroidaan helposti olemassa oleviin kirjastoihin mallin tehokkaaseen pakkaamiseen.

Tässä on esimerkki pre-kvantisoidun Llama-2-7b-mallin lataamisesta Hugging Facen transformers-kirjaston avulla:

from transformers import AutoModelForCausalLM, AutoTokenizer

<p>model_id = "TheBloke/Llama-2-7b-Chat-GPTQ"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
Ja mukautetun kvantisaation osalta voidaan seurata seuraavia askelia AutoGPTQ-työkalun avulla:</p>

<p>from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig</p>

<p>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)</p>

Muista, että kvantisaatio saattaa edellyttää jälkikvantisaatiota tai ohjeiden suunnittelua mallin laadun ylläpitämiseksi. Uuden kvantisaation osalta voit osallistua yhteisöön lähettämällä kvantisoidut mallisi alustoille kuten Hugging Face.

Aina varmista, että mallin koko, laskennalliset vaatimukset ja suorituskyky ovat tasapainossa valitessasi kvantisaatiestrategiaa kussakin tapauksessa.

 

Flash Attention -algoritmi

Monipäinen huomio-mekanismi on keskeinen osa transformer-pohjaisissa LLM:issä, mahdollistaen mallille havaita pitkän aikavälin riippuvuudet ja kontekstualisoidut edustukset. Kuitenkin tämä huomio-toiminto on laskennallisesti tehokas autoregressiiviselle tekstin generoinnille, koska se edellyttää useiden samojen arvojen uudelleenlaskentaa jokaiselle uudelle tokenille.

Flash Attention -algoritmi, joka on esitetty Flash Attention -paperissa, tarjoaa tehokkaamman ja rinnakkaisuuden kannalta edullisemman lähestymistavan huomio-toiminnolle. Sen sijaan, että huomio-arvoja lasketaan uudelleen jokaiselle tokenille, Flash Attention käyttää välimuistia ja uudelleen hyödyntää väliaikaisia avain/arvo-matriiseja, välttäen turhia laskentaa.

Tämä optimointi ei ainoastaan vähennä laskennallista kuormitusta, vaan myös parantaa muistin käyttöä, johtaa parempaan GPU-muistin kaistanleveyden hyödyntämiseen ja rinnakkaisuuteen.

Vaikka Flash Attentionin yksityiskohdat ovat melko monimutkaisia, korkean tason ideana on jakaa huomio-toiminto kahteen vaiheeseen:

  1. Etuliite-summan upotus: Tässä vaiheessa lasketaan ja välimuistitaan avain/arvo-upotuksia kaikille syötteille, mahdollistaen tehokkaan uudelleenhyödyntämisen generoinnin aikana.
  2. Kausaalinen huomio: Itse huomio-toiminto, joka on nyt optimoitu hyödyntämään välimuistitetuja avain/arvo-upotuksia ensimmäisestä vaiheesta.

Erottamalla nämä vaiheet, Flash Attention voi hyödyntää tehokkaasti GPU:n rinnakkaisia operaatioita, kiihdyttäen merkittävästi huomio-toiminnon pullonkaulan LLM-inferenssissä.

Tässä on lyhyt, konseptuaalinen esimerkki Flash Attentionin toteuttamisesta LLM:llä:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention

<p># Lataa LLM kuten OctoCoder
model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder")</p>

<p># Esimerkki järjestelmäohje, joka ohjaa mallia paremmaksi koodausavustajaksi
system_prompt = "... (järjestelmäohjeen yksityiskohdat) ..."</p>

<p># Valmistele pitempi syöte järjestelmäohjeen kanssa
long_prompt = system_prompt + "Kysymys: Kirjoita funktio Pythonissa, joka muuttaa tavut gigatavuiksi."</p>

<p># Muunna malli Flash Attention -optimoinniksi
model.to_bettertransformer()</p>

<p># Suorita malli Flash Attentionilla
start_time = time.time()
with torch.backends.cuda.sdp_kernel(enable_flash=True):
result = model.generate(long_prompt, max_new_tokens=60)
print(f"Generoitu {time.time() - start_time} sekunnissa.")

Vaikka Flash Attention tarjoaa vaikuttavia suorituskyvyn parannuksia, se toimii olemassa olevan transformer-arkkitehtuurin puitteissa. Täysimääräisesti kiihdyttääkseen LLM-inferenssiä, meidän on tutkittava arkkitehtuurin innovaatioita, jotka on suunniteltu nimenomaan tähän tehtävään.

LLMien harvennus

LLMien harvennus on tekniikka, jolla voidaan vähentää mallin kokoa säilyttäen toiminnallisuus. Se käyttää data-riippuvaa estimaattoria painoarvon tärkeydelle, joka perustuu Hessian-matriisin approksimaatioon. Harvennuksessa vähemmän tärkeitä painoryhmiä poistetaan, ja malli suoritetaan uudelleen lyhyen jälkikoulutuksen jälkeen. LLM-Pruner-paketti tarjoaa skriptejä harvennukselle eri strategioilla. Harvennus käsittää riippuvuuksien löytämisen, ryhmäavainomistajien arvioinnin ja palautusvaiheen, joka sisältää lyhyen jälkikoulutuksen.

Tässä on yksinkertaistettu Python-esimerkki LLM-Prunerin käytöstä LLaMa-mallille:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner

<p># Lataa esikoulutettu LLaMa-malli
model = AutoModelForSequenceClassification.from_pretrained("llama-base")</p>

<p># Alusta pruner halutulla konfiguraatiolla
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type='taylor'
)</p>

<p># Suorita harvennus
pruned_model = pruner.prune()</p>

<p># Suorita prunattu malli
pruned_model.fine_tune(training_data)

Tämä koodiesimerkki edustaa LLaMa-mallin lataamista, prunerin määritystä tietyn konfiguraation kanssa, harvennuksen suorittamista ja lopulta prunatun mallin hienosäätöä.

Arkkitehtuurin innovaatiot tehokkaalle tekstin generoinnille

Transformer-arkkitehtuuri, vaikka erittäin tehokas kielen mallinnuksessa, suunniteltiin alun perin yleispäteväksi sekvenssi-sekvenssi-malliksi. Käyttäessä LLM:iä tekstin generoinnistehtäviin pitkien syötekontekstien kanssa, tutkijat ovat löytäneet, että erikoistuneet arkkitehtuurit voivat parantaa merkittävästi inference-tehokkuutta ilman laadun heikentymistä.

Tässä ovat joitakin avainarkkitehtuurin innovaatioita, jotka mahdollistavat nopeamman LLM-inferenssin:

Alibi: Alibi-arkkitehtuuri, joka esiteltiin PAL-ohje-paperissa, erottaa pitkän syötekontekstin mallinnuksen tekstin generoimisprosessista itsessään. Se käyttää tiivistettyä edustusta syötekontekstista (”alibi”) generoimisprosessin aloittamiseen, välttäen tarpeen prosessoida koko syöte-sekvenssi uudelleen jokaisen uuden tokenin generoinnin aikana.

Pyörivät upotuksia: Sen sijaan, että käytettäisiin standardia positionaalisia upotuksia, pyörivien upotusten tekniikka käyttää rotaatiomatriiseja koodata positionaaliset tiedot tehokkaammin. Tämä lähestymistapa on osoittanut parantavansa suorituskykyä ja mahdollistavan pitempien syöte-sekvenssien prosessoinnin.

Monikysymys-huomio (MQA): Perinteisessä huomiossa jokainen tulostetoken huomioi koko syöte-sekvenssin, johtaa turhan laskentaan. MQA uudelleenmuotoilee huomio-toiminnon jakamaan laskennat useiden tulostetokenien kesken, vähentäen kokonaismonimutkaisuutta.

Monikysymys-huomio

Monikysymys-huomio

Ryhmäkysymys-huomio (GQA): GQA laajentaa MQA:ta ryhmittelemällä tulostetokenit klustereihin ja laskelemalla huomion yhdessä kullekin klusterille. Tämä lähestymistapa vähentää laskennallisia vaatimuksia ylläpitäen korkealaatuista tekstin generointia.

Vaikka nämä arkkitehtuurin innovaatiot ovat edelleen aktiivisessa tutkimus- ja kehitysvaiheessa, ne ovat osoittaneet vaikuttavia nopeutuksia LLM-inferenssitehtävissä, erityisesti yhdistettynä tekniikoihin kuten Flash Attention ja numeerisen tarkinasteisuuden optimointiin.

Todellisen maailman käyttöönoton huomioon otettavat seikat

Ylittäen ydin-algoritmit ja arkkitehtuurit, on useita käytännön huomioon otettavia seikkoja ja kompromisseja, joita on selvitettävä LLM:iä käyttöönotettaessa tuotantoympäristöissä:

Laitteiston kiihdytys: Vaikka CPU:t voivat käsitellä LLM-inferenssiä, GPU:t ja muut kiihdyttimet, kuten Google TPUpi, ovat olennaisia saavuttaakseen korkean läpimenoisuuden ja matalan viiveen. Oikean laitteiston valinta ja muistin käytön optimointi on kriittistä.

Eräkäsittely ja rinnakkaisuus: Hyödyntääkseen laitteiston rinnakkaisuutta, strategiat kuten erä-inferenssi (useiden syötteiden prosessointi samanaikaisesti) ja mallin rinnakkaisuus (mallin jakaminen useiden laitteiden kesken) voivat merkittävästi parantaa läpimenoisuuutta.

Kvantisaatio vs. laatu -tasapaino: Kvantisaation aste (8-bittinen, 4-bittinen jne.) vaikuttaa suoraan inference-nopeuteen ja muistin käyttöön, mutta vaikuttaa myös tulosteen laatuun. Tämä tasapaino on arvioitava huolellisesti kussakin tapauksessa.

Mallin tislaus: Kvantisaation vaihtoehtona, mallin tislausmenetelmät voivat pakata suuret LLM:t pienemmiksi, tehokkaammiksi opetusmalliksi, säilyttäen korkean tarkinasteisuuden.

Välimuisti ja optimoidut suoritusaika: Optimoidut syväoppimisen suoritusaika, kuten NVIDIA:n TensorRT, ja kehykset, jotka on suunniteltu nimenomaan LLM-palveluun (esim. MosaicML:n Composable Inference Suite), voivat tarjota merkittäviä suorituskyvyn parannuksia tekniikoiden kautta, kuten operaattorien yhdistäminen, ytimen optimointi ja älykkäät välimuististrategiat.

Optimaalinen LLM-käyttöönotto usein edellyttää useiden tekniikoiden yhdistämistä, samalla huomioiden sovelluksen tarkat vaatimukset, laitteiston rajoitukset ja suorituskykyn tavoitteet.

Johtopäätös

Kun suuret kielen mallit jatkavat nopeaa kehitystään, niiden inference-suorituskyvyn kiihdyttäminen tulee yhä tärkeammaksi mahdollistaakseen todellisen maailman sovellukset ja demokratisoidakseen pääsyn näihin voimakkaisiin AI-ominaisuuksiin.

Tässä teknisessä opasessa tutkimme viimeisimpiä tekniikoita, jotka kattavat numeerisen tarkinasteisuuden optimoinnin, uudet huomio-mekanismit kuten Flash Attentionin, ja arkkitehtuurin innovaatiot, jotka on suunniteltu nimenomaan tehokkaalle tekstin generoinnille. Vaikka kunkin lähestymistavan on omat edut, todellinen voima piilee useiden strategioiden yhdistämisessä, samalla navigoiden monimutkaisissa tasapainoissa nopeuden, muistin käytön ja tulosteen laadun välillä.

Eteenpäin katsoen, voimme odottaa jatkuvaa tutkimusta ja kehitystä tässä alueessa, jota ajaa yhä kasvava kysyntä kykyisemmistä ja helpommin käytettävissä olevista LLM:istä. Laitteiston kiihdytyksestä, mallin pakkaamiseen ja uusiin arkkitehtuureihin, etsintä tehokkaampaa LLM-inferenssiä jatkuu innostavana eturintamana luonnollisen kielen prosessoinnin ja tekoälyalueella.

Olen viettänyt viimeiset viisi vuotta uppoutumalla kiinnostavaan koneoppimisen ja syvän oppimisen maailmaan. Minun intohimoni ja asiantuntemukseni ovat johtaneet minun osallistumiseen yli 50:een monipuoliseen ohjelmistosuunnitteluhankkeeseen, joissa on erityisesti painottunut AI/ML. Minun jatkuva uteliaisuuteni on myös ohjannut minun luontaisen kielen prosessoinnin pariin, jota haluan tutkia tarkemmin.