tynkä Suuren kielen mallin päättelyn nopeuttaminen: Tehokkaan käyttöönoton tekniikat – Unite.AI
Liity verkostomme!

Nopea suunnittelu

Suuren kielimallin päättelyn nopeuttaminen: Tehokkaan käyttöönoton tekniikat

mm

Julkaistu

 on

LLM-johtopäätös Nopeuta

Suuret kielimallit (LLM), kuten GPT-4, Laama, ja PaLM ylittävät luonnollisen kielen käsittelyn rajoja. Näiden massiivisten mallien käyttöönotto tuotantoympäristöissä asettaa kuitenkin merkittäviä haasteita laskentavaatimusten, muistin käytön, viiveen ja kustannusten suhteen. Koska LLM-yritykset kasvavat jatkuvasti isommiksi ja kykenevimmiksi, niiden päättelysuorituskyvyn optimointi on ratkaisevan tärkeää tosielämän sovelluksille.

Tässä teknisessä syvässä sukelluksessa tutkimme huippuluokan tekniikoita LLM-päätelmien nopeuttamiseksi, mikä mahdollistaa nopeammat vasteajat, suuremman suorituskyvyn ja tehokkaamman laitteistoresurssien käytön. Käsittelemme menetelmiä numeerisista tarkkuustekniikoista ja uusista huomiomekanismeista arkkitehtonisiin innovaatioihin, jotka on räätälöity tehokkaaseen tekstintuotantoon.

Aloitetaan ymmärtämällä, miksi LLM-päättely on niin haastavaa verrattuna perinteisiin NLP-malleihin.

Päätelmähaaste suurilla kielimalleilla

Ennen LLM:ien tuloa luonnollisen kielen käsittely perustui pienempiin malleihin, jotka keskittyivät tiettyihin tehtäviin, kuten tekstin luokitteluun, nimettyjen entiteettien tunnistamiseen ja tunneanalyysiin. Vaikka nämä mallit ovat edelleen laskennallisesti intensiivisiä, niitä voitaisiin käyttää vaatimattomilla laitteistoilla ja seurata suhteellisen yksinkertaisia ​​päättelyprosesseja.

LLM:t sen sijaan edustavat paradigman muutosta. Nämä mallit on koulutettu laajojen tietojoukkojen käyttöön miljardeja parametreja käyttäen, minkä ansiosta ne voivat suorittaa monenlaisia ​​kielitehtäviä erinomaisella taidolla. Tällä teholla on kuitenkin hinta - dramaattisesti lisääntynyt laskentavaatimus sekä harjoittelun että päättelyn aikana.

Yksi keskeinen haaste on tekstin luomisen autoregressiivinen luonne LLM:ien kanssa. Ihmisen kaltaisen tekstin tuottamiseksi nämä mallit ennustavat yhden tunnuksen (sanan tai alisanan) kerrallaan, ja jokainen uusi merkki riippuu aiemmin luodusta tuloksesta. Tämä peräkkäinen riippuvuus estää tehokkaan rinnakkaisuuden ja johtaa laskentavaatimuksiin, jotka skaalautuvat polynomiaalisesti sekvenssin pituuden mukaan.

Lisäksi LLM:t vaativat usein pitkiä syöttösarjoja (kehotteita) luodakseen tarvittavan kontekstin laadukkaan tekstin luomiseen. Pidemmät syöttöpituudet vaativat enemmän muistia välitilojen ja huomiomatriisien tallentamiseen, mikä lisää laitteistoresurssien rasitusta.

Näiden ainutlaatuisten haasteiden ansiosta perinteiset optimointitekniikat, kuten kvantisointi ja staattiset laskentakaaviot, voivat jäädä vajaaksi, ja niiden on vaikeuksia ylläpitää LLM-suorituskykyä samalla, kun ne tarjoavat merkittäviä nopeuksia. Sukellaanpa joihinkin tärkeimpiin strategioihin, jotka on räätälöity erityisesti LLM-päätelmien nopeuttamiseksi.

Numeeriset tarkkuustekniikat

32-bitistä 16-bittiseen tarkkuuteen

32-bitistä 16-bittiseen tarkkuuteen

Yksi tapa kiihdyttää OTK päätelmä on hyödyntää alennettua numeerista tarkkuutta mallien painojen ja aktivointien osalta. Nykyaikaiset syväoppimiskehykset, kuten PyTorch ja TensorFlow, käyttävät tyypillisesti oletusarvoisesti 32-bittistä liukulukutarkkuutta (FP32). Tutkimukset ovat kuitenkin osoittaneet, että LLM:t voivat usein säilyttää korkean tarkkuuden myös silloin, kun ne toimivat pienemmällä tarkkuudella, kuten 16-bittiset (FP16), 8-bittiset kokonaisluvut (INT8) tai jopa 4-bittiset kokonaisluvut (INT4).

Numeerisen tarkkuuden vähentäminen tarjoaa useita etuja:

  • Pienennetty muistin jalanjälki: Pienemmän tarkkuuden esitykset vaativat vähemmän muistia, jolloin suuremmat mallit tai eräkoot mahtuvat samoihin laitteistorajoituksiin.
  • Nopeampi laskenta: Monet nykyaikaiset suorittimet ja grafiikkasuorittimet tarjoavat erikoisohjeita ja laitteistokiihdytyksen alhaisempaan tarkkuuteen, mikä mahdollistaa merkittäviä nopeutta.
  • Parempi energiatehokkuus: Pienemmillä muistivaatimuksilla ja nopeammilla laskentatoimilla pienempi tarkkuus voi johtaa pienempään energiankulutukseen – tämä on ratkaiseva etu reuna- ja mobiilikäyttöön.

Vaikka tehokkaat numeeriset tarkkuustekniikat aiheuttavat jonkin verran tarkkuushäviöitä verrattuna FP32-toimintaan. Tärkeintä on arvioida huolellisesti tämä kompromissi laskennallisten hyötyjen ja mahdollisen suorituskyvyn heikkenemisen välillä sinun käyttötapauksessasi.

LLM:ien kvantisointiin on kaksi päätapaa:

Harjoittelun jälkeinen kvantisointi (PTQ): Tässä menetelmässä LLM koulutetaan ensin käyttämällä standardia FP32-tarkkuutta. Harjoittelun jälkeen mallipainot kvantisoidaan (muunnetaan) pienempään tarkkuuteen, kuten INT8 tai INT4. PTQ on yksinkertaista toteuttaa, mutta se voi johtaa suurempaan tarkkuuteen.

Kvantisointitietoinen koulutus (QAT): QAT:lla kvantisointiprosessia simuloidaan itse harjoitusvaiheen aikana. Tämän ansiosta malli oppii kompensoimaan kvantisointivirheet ja minimoi tarkkuuden heikkenemisen, kun lopullinen kvantisoitu malli otetaan käyttöön. QAT on mukana enemmän, mutta tuottaa usein parempia tuloksia kuin PTQ.

Käytännön sovelluksissa voitaisiin hyödyntää esim. kvantisoituja malleja, jotka ovat saatavilla esim Halaaminen kasvot, joka isännöi useita malleja, jotka on optimoitu eri kvantisointimenetelmillä. Jos esimerkiksi halutaan Auto-GPTQ:lla kvantisoitu malli, käyttäjät voivat ladata sen helposti käyttämällä Hugging Facen muuntajakirjastoa. Lisäksi mallin kvantisoimiseen voidaan käyttää työkaluja, kuten AutoGPTQ, jotka integroituvat saumattomasti olemassa oleviin kirjastoihin mallin tehokkaan pakkaamiseksi.

Tässä on esimerkki esikvantisoidun Llama-2-7b-mallin lataamisesta käyttämällä Hugging Face -muuntajakirjastoa:

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)

Muista, että kvantisointi saattaa edellyttää kvantisoinnin jälkeistä hienosäätöä tai nopeaa suunnittelua mallin laadun ylläpitämiseksi. Uutta kvantisointia varten voit osallistua takaisin yhteisöön työntämällä kvantisoidut mallisi sellaisille alustoille, kuten Hugging Face.

Varmista aina tasapaino mallin koon, laskentavaatimusten ja suorituskyvyn välillä, kun valitset kvantisointistrategiaa omaan käyttötapaasi varten.

 

Flash Attention Algorithm

Monen pään huomiomekanismi on muuntajapohjaisten LLM:ien ydinkomponentti, jonka avulla malli voi vangita pitkän kantaman riippuvuuksia ja kontekstualisoituja esityksiä. Tämä huomiotoiminto on kuitenkin laskennallisesti tehoton autoregressiiviseen tekstin luomiseen, koska se vaatii useiden samojen arvojen uudelleenlaskemista jokaiselle uudelle tunnisteelle.

- Flash Attention -algoritmi, joka esiteltiin FlashAttention-paperissa, tarjoaa muistia tehokkaamman ja rinnakkaisystävällisemmän lähestymistavan huomiotoimintoon. Sen sijaan, että kunkin tunnuksen huomioarvot laskettaisiin uudelleen, Flash Attention tallentaa välimuistiin ja käyttää uudelleen väliavain/arvomatriiseja välttäen turhia laskelmia.

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

Vaikka Flash Attention -toiminnon yksityiskohdat ovat melko tärkeitä, korkean tason ideana on jakaa huomiotoiminto kahteen vaiheeseen:

  1. Etuliitesumman upotus: Tämä vaihe laskee ja tallentaa välimuistiin kaikkien syöttötunnisteiden avaimen/arvon upotukset, mikä mahdollistaa tehokkaan uudelleenkäytön luonnin aikana.
  2. Kausaalinen huomio: Varsinainen huomiotoiminto, joka on nyt optimoitu hyödyntämään välimuistissa olevia avaimen/arvon upotuksia ensimmäisestä vaiheesta lähtien.

Erottamalla nämä vaiheet Flash Attention voi hyödyntää erittäin rinnakkaisia ​​GPU-toimintoja, mikä nopeuttaa merkittävästi huomion pullonkaulaa LLM-päätelmissä.

Tässä on lyhyt, käsitteellinen esimerkki Flash Attentionin käyttöönotosta LLM:n kanssa:

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.")

Vaikka Flash Attention tarjoaakin vaikuttavat suorituskyvyn lisäykset, se toimii nykyisessä muuntajaarkkitehtuurissa. Vapauttaaksemme täysin nopeutetun LLM-päätelmän mahdollisuudet, meidän on tutkittava arkkitehtonisia innovaatioita, jotka on räätälöity erityisesti tätä tehtävää varten.

LLM:ien karsiminen

LLM:ien karsiminen on tekniikka mallin koon pienentämiseksi samalla kun toiminnallisuus säilyy. Se käyttää tiedoista riippuvaa estimaattoria painon tärkeydelle, joka perustuu Hessenin matriisin likiarvoihin. Leikkauksessa vähemmän tärkeät painoryhmät poistetaan, minkä jälkeen mallia hienosäädetään tarkkuuden palauttamiseksi. LLM-Pruner-paketti tarjoaa komentosarjoja karsimiseen erilaisilla tuetuilla strategioilla. Karsiminen sisältää riippuvuuksien löytämisen, ryhmäpanosten arvioinnin ja toipumisvaiheen, johon sisältyy lyhyt jälkiharjoittelu.

Tässä on yksinkertaistettu Python-koodiesimerkki, joka osoittaa käytön LLM-leikkuri LLaMa-mallille:

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)

Tämä koodiluonnos edustaa esiopetetun LLaMa-mallin lataamista, karsimen määrittämistä tietyillä kokoonpanoilla (kuten mitkä kerrokset leikataan ja leikkurin tyyppi), karsimisen suorittamista ja lopuksi karsitun mallin hienosäätöä.

Huomaa, että todellista toteutusta varten sinun on täytettävä tiedot, kuten tietyn mallin nimi, polut tietoihin ja lisäparametreja hienosäätöprosessia varten. Huomaa myös, että tämä koodi on käsitteellinen esitys ja todellinen syntaksi voi vaihdella käytetyn kirjaston ja versioiden mukaan.

Arkkitehtoniset innovaatiot tehokkaaseen tekstintuotantoon

Muuntaja-arkkitehtuuri, vaikka se onkin erittäin tehokas kielimallinnustehtävissä, on suunniteltu yleiskäyttöiseksi sekvenssistä sekvenssiin -malliksi. Käytettäessä LLM:itä tekstintuotantotehtäviin pitkillä syöttökonteksteilla tutkijat ovat havainneet, että erikoistuneemmat arkkitehtuurit voivat parantaa merkittävästi päättelytehokkuutta laadusta tinkimättä.

Tässä on joitain tärkeimmistä arkkitehtonisista innovaatioista, jotka mahdollistavat nopeamman LLM-päätelmän:

alibi: PAL-ohjepaperissa esitelty Alibi-arkkitehtuuri erottaa pitkän syöttökontekstin mallinnuksen itse tekstin luomisprosessista. Se käyttää syöttökontekstin pakattua esitystä ("alibi") generointiprosessin alustamiseen välttäen tarvetta käsitellä koko syöttösekvenssiä toistuvasti autoregressiivisen generoinnin aikana.

Rotary upotukset: Pyörivä upotustekniikka käyttää kiertomatriiseja paikannustietojen koodaamiseksi tehokkaammin sen sijaan, että käytettäisiin tavallisia paikka upotuksia. Tämän lähestymistavan on osoitettu parantavan suorituskykyä ja mahdollistavan pidempien syöttöjaksojen käsittelyn.

Multi-Query Attention (MQA): Perinteisessä huomioinnissa jokainen tuloste käsittelee koko syöttösekvenssiä, mikä johtaa redundanttiseen laskentaan. MQA muotoilee uudelleen huomiotoiminnon laskelmien jakamiseksi useiden tulostettujen välineiden kesken, mikä vähentää yleistä monimutkaisuutta.

Monipuolinen huomio

Monipuolinen huomio

Grouped-Query-Attention (GQA): MQA:n pohjalta GQA ryhmittelee lähtötunnisteet klusteriin ja laskee huomion yhdessä kullekin klusterille. Tämä lähestymistapa vähentää laskennallisia vaatimuksia entisestään ja ylläpitää korkealaatuista tekstintuotantoa.

Vaikka nämä arkkitehtoniset innovaatiot ovat edelleen aktiivisessa tutkimuksessa ja kehityksessä, ne ovat osoittaneet vaikuttavaa nopeutta LLM-päättelytehtävissä, etenkin kun ne yhdistetään tekniikoihin, kuten Flash Attention ja numeerisen tarkkuuden optimointi.

Tosimaailman käyttöönottoa koskevat näkökohdat

Ydinalgoritmien ja -arkkitehtuurien lisäksi on olemassa useita käytännön näkökohtia ja kompromisseja, jotka on otettava huomioon, kun LLM:itä otetaan käyttöön tuotantoympäristöissä:

Laitteiston kiihdytys: Vaikka prosessorit pystyvät käsittelemään LLM-päätelmiä, grafiikkasuorittimet ja muut kiihdyttimet, kuten Googlen TPU:t, ovat välttämättömiä korkean suorituskyvyn ja alhaisen latenssin saavuttamiseksi. Oikean laitteiston valinta ja muistin käytön optimointi on ratkaisevan tärkeää.

Erotus ja rinnakkaisuus: Jotta laitteiston rinnakkaisuutta voitaisiin hyödyntää täysimääräisesti, strategiat, kuten eräpäättely (useiden syötteiden käsittely samanaikaisesti) ja mallin rinnakkaisuus (LLM:n jakaminen useille laitteille), voivat parantaa merkittävästi suorituskykyä.

Kvantisointi vs. laadun vaihto: Kvantisointiaste (8-bittinen, 4-bittinen jne.) vaikuttaa suoraan päättelynopeuteen ja muistin käyttöön, mutta vaikuttaa myös tulosteen laatuun. Tämä kompromissi on arvioitava huolellisesti jokaisessa käyttötapauksessa.

Mallin tislaus: Vaihtoehto kvantisoinnille, mallitislaustekniikat voivat pakata suuret LLM:t pienemmiksi, tehokkaammiksi opiskelijamalleiksi säilyttäen samalla korkean tarkkuuden.

Välimuisti ja optimoidut suoritusajat: Optimoidut syvän oppimisen ajonajat, kuten NVIDIAn TensorRT ja LLM-palveluun suunnitellut puitteet (esim. MosaicML:n Composable Inference Suite), voivat parantaa suorituskykyä merkittävästi operaattorifuusion, ytimen optimoinnin ja älykkäiden välimuististrategioiden kaltaisilla tekniikoilla.

Polku optimaaliseen LLM:n käyttöönottoon edellyttää usein useiden tekniikoiden yhdistämistä samalla kun harkitset huolellisesti sovelluksesi erityisvaatimuksia, infrastruktuurin rajoituksia ja suorituskykytavoitteita.

Yhteenveto

Kun suuret kielimallit jatkavat nopeaa kehitystään, niiden päättelysuorituskyvyn nopeuttaminen on yhä ratkaisevampaa, jotta voidaan mahdollistaa tosimaailman sovelluksia ja demokratisoida pääsyä näihin tehokkaisiin tekoälyominaisuuksiin.

Tässä teknisessä oppaassa tutkimme huippuluokan tekniikoita, jotka kattavat numeerisen tarkkuuden optimoinnin, uudet huomioalgoritmit, kuten Flash Attention, ja arkkitehtonisia innovaatioita, jotka on räätälöity tehokkaaseen tekstin luomiseen. Vaikka jokaisella lähestymistavalla on omat etunsa, todellinen voima piilee usein useiden strategioiden yhdistämisessä samalla kun navigoidaan nopeuden, muistin käytön ja tulostuslaadun välisissä monimutkaisissa kompromisseissa.

Tulevaisuudessa voimme odottaa jatkuvaa tutkimusta ja kehitystä tällä alalla, jota ruokkii kyltymätön kysyntä kyvykkäille ja helpommin saavutetuille LLM:ille. Laitteistokiihdytyksestä ja mallin pakkaamisesta täysin uusiin arkkitehtuureihin, tehokkaan LLM-päätelmän etsiminen on edelleen jännittävä raja luonnollisen kielen käsittelyn ja tekoälyn maailmassa.

Olen viettänyt viimeiset viisi vuotta uppoutuen koneoppimisen ja syväoppimisen kiehtovaan maailmaan. Intohimoni ja asiantuntemukseni ovat saaneet minut osallistumaan yli 50:een erilaiseen ohjelmistosuunnitteluprojektiin keskittyen erityisesti tekoälyyn/ML:ään. Jatkuva uteliaisuuteni on myös vetänyt minut kohti luonnollisen kielen käsittelyä, alaa, jota olen innokas tutkimaan lisää.