AI-mallit ja alustat

Suorituskyvyn Optimointi Isojen Kielimallien Inferenssille ja Hienosäätölle

mm
Lisää Unite.AI suosikkilähteisiisi Google-palvelussa

Iset suuret kielimallit (LLM) kuten GPT-4, Bloom ja LLaMA ovat saavuttaneet merkittäviä kykyjä skaalautumalla miljardeihin parametreihin. Kuitenkin näiden massiivisten mallien käyttäminen inferenssille tai hienosäätölle on haasteellista niiden valtavien muistivaatimusten vuoksi. Tässä teknisessä blogissa tarkastelemme tekniikoita muistin kulutuksen arvioimiseksi ja optimoimiseksi LLM-inferenssissä ja hienosäätössä erilaisilla laitteistoilla.

Muistin Vaatimusten Ymmärtäminen

Muisti, jota vaaditaan LLM:n lataamiseen, määräytyy pääasiassa parametreiden määrän ja numeerisen tarkkuuden perusteella, jota käytetään parametreiden tallentamiseen. Yksinkertainen sääntö on:

  • Mallin lataaminen, jossa on X miljardia parametreja, vaatii noin 4X GB VRAM:ia 32-bittisessä liukulukumuodossa
  • Mallin lataaminen, jossa on X miljardia parametreja, vaatii noin 2X GB VRAM:ia 16-bittisessä bfloat16/float16 -tarkkuudessa

Esimerkiksi 175 miljardin parametrin GPT-3-mallin lataaminen vaatisi noin 350 GB VRAM:ia bfloat16-tarkkuudessa. Tällä hetkellä suurimmat kaupallisesti saatavissa olevat GPU:t, kuten NVIDIA A100 ja H100, tarjoavat vain 80 GB VRAM:ia, mikä edellyttää tensorin rinnakkaisuuden ja mallin rinnakkaisuuden tekniikoita.

Inferenssissä muistijalanjälki on pääasiassa määriteltynä mallin parametreilla ja tilapäisillä aktivaatiotensorilla, jotka tuotetaan. Korkean tason arvio inferenssin huippumuistinkäytölle on mallin parametreiden ja aktivaatioiden muistin summa.

Inferenssin Muistin Määritys

Määritellään inferenssin muistin vaatimukset OctoCode-mallin avulla, jossa on noin 15 miljardia parametreja bfloat16-muodossa (~ 31 GB). Käytetään Transformers-kirjastoa mallin lataamiseen ja tekstin generointiin:

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch

<p>model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;,
torch_dtype=torch.bfloat16,
device_map=&quot;auto&quot;,
pad_token_id=0)
tokenizer = AutoTokenizer.from_pretrained(&quot;bigcode/octocoder&quot;)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)</p>

<p>prompt = &quot;Kysymys: Kirjoita Python-funktio, joka muuttaa tavut gigatavuiksi.\n\nVastaus:&quot;
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]</p>

<p>def bytes_to_gigabytes(bytes):
return bytes / 1024 / 1024 / 1024</p>

<p>bytes_to_gigabytes(torch.cuda.max_memory_allocated())

Tuloste:

29.0260648727417

Huippu-GPU-muistin käyttö on noin 29 GB, mikä vastaa arviotamme 31 GB:sta mallin parametreiden lataamiseksi bfloat16-muodossa.

Inferenssin Muistin Optimointi Kvantisaatiolla

Vaikka bfloat16 on yleinen tarkkuus LLM:ien koulutuksessa, tutkijat ovat havainneet, että mallipainojen kvantisaatio alempiin tarkkuuksiin, kuten 8-bittisiin kokonaislukuun (int8) tai 4-bittisiin kokonaislukuun, voi merkittävästi vähentää muistikäyttöä vähäisellä tarkkuuden heikkenemisellä inferenssitehtävissä kuten tekstin generoinnissa.

Tarkastellaan muistin säästöjä 8-bittisestä ja 4-bittisestä kvantisaatiosta OctoCode-mallissa:

&amp;lt;/div&amp;gt;
# 8-bittinen kvantisaatio
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;, load_in_8bit=True,
pad_token_id=0)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]
bytes_to_gigabytes(torch.cuda.max_memory_allocated())&lt;/pre&gt;
Tuloste:
15.219234466552734
# 4-bittinen kvantisaatio
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;, load_in_4bit=True,
low_cpu_mem_usage=True, pad_token_id=0)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]
bytes_to_gigabytes(torch.cuda.max_memory_allocated())

Tuloste:

9.543574333190918

8-bittisellä kvantisaatiolla muistin vaatimus laskee 31 GB:sta 15 GB:iin, kun taas 4-bittinen kvantisaatio laskee sen edelleen 9,5 GB:iin! Tämä mahdollistaa 15 miljardin parametrin OctoCode-mallin suorittamisen kuluttajien GPU:illa kuten RTX 3090 (24 GB VRAM).

Hienosäätömuistin Arvioiminen

Kvantisaatio on pääasiassa käytetty tehokkaasti inferenssissä, mutta tekniikat kuten tensorin rinnakkaisuus ja mallin rinnakkaisuus ovat ratkaisevia suurten kielimallien koulutuksen tai hienosäätö muistin hallinnassa.

Hienosäätössä huippumuistin kulutus on tyypillisesti 3-4 kertaa suurempi kuin inferenssissä johtuen lisämuistin tarpeista:

  • Gradientit
  • Optimointitilat
  • Aktivaatiot eteenpäin suoritettavasta takaisin suoritettavaksi

Konservatiivinen arvio on, että hienosäätö LLM:llä, jossa on X miljardia parametreja, vaatii noin 4 * (2X) = 8X GB VRAM:ia bfloat16-tarkkuudessa.

Esimerkiksi hienosäätö 7 miljardin parametrin LLaMA-mallilla vaatisi noin 7 * 8 = 56 GB VRAM:ia GPU:lla bfloat16-tarkkuudessa. Tämä ylittää nykyisten GPU:iden muistikapasiteetin, mikä edellyttää hienosäätötekniikoita.

Hienosäätötekniikat

Useita hienosäätömenetelmiä on ehdotettu ylittämään GPU:n muistirajoitukset suurten mallien koulutuksessa:

  1. Data-rinnakkaisuus: Perinteinen data-rinnakkaisuusmenetelmä replikoi koko mallin useille GPU:ille ja jakaa ja jakaa koulutusdata-erät. Tämä vähentää koulutusaikaa lineaarisesti GPU:n määrän mukaan, mutta ei vähennä huippumuistin vaatimusta kussakin GPU:ssa.
  2. ZeRO Stage 3: Edistynyt data-rinnakkaisuusmenetelmä, joka jakaa mallin parametreja, gradientteja ja optimointitiloja GPU:ille. Se vähentää muistia verrattuna perinteiseen data-rinnakkaisuuteen pitämällä ainoastaan vaadittuja jaettuja tietoja kussakin GPU:ssa koulutuksen eri vaiheissa.
  3. Tensorin rinnakkaisuus: Sen sijaan, että malli replikoidaan, tensorin rinnakkaisuus jakaa mallin parametreja riveihin tai sarakkeisiin ja jakaa ne GPU:ille. Kunkin GPU:n toimii jaettujen parametrien, gradienttien ja optimointitilojen osalla, mikä johtaa merkittäviin muistisäästöihin.
  4. Pipeline-rinnakkaisuus: Tämä tekniikka jakaa mallin kerrokset eri GPU:ille/työntekijöille, joissa kunkin laite suorittaa osan kerroksista. Aktivaatiot siirretään työntekijöiden välillä, vähentäen huippumuistia, mutta lisäten viestintäkuormitusta.

Hienosäätömuistin arvioiminen näillä jakautumismenetelmillä on monimutkaista, koska parametreiden, gradienttien, aktivaatioiden ja optimointitilojen jakautuminen vaihtelee menetelmien mukaan. Lisäksi eri komponentit, kuten transformer-runko ja kielen mallintamisen pää, voivat osoittaa erilaisia muistin varauskäyttäytymisiä.

LLMem-ratkaisu

Tutkijat ovat ehdottaneet LLMem-ratkaisua, joka arvioi tarkasti GPU:n muistikäytön, kun sovelletaan hienosäätömenetelmiä LLM:lle useille GPU:ille.

Arviointi GPU:n Muistin Käytölle Hienosäätössä

Arviointi GPU:n Muistin Käytölle Hienosäätössä

LLMem ottaa huomioon tekijät, kuten parametreiden uudelleenyhdistäminen ennen laskentaa (ZeRO Stage 3), tulosteen kerääminen taaksepäin suoritettaessa (tensorin rinnakkaisuus) ja eri muistin varausstrategiat transformer-rungolle ja kielen mallintamisen päälle.

Kokeelliset tulokset osoittavat, että LLMem voi arvioida huippu-GPU-muistin käytön yhdellä GPU:lla hienosäätössä virheellisyydellä jopa 1,6 %, joka ylittää DNNMem:n keskimääräisen virheellisyyden 42,6 %. Kun sovelletaan hienosäätömenetelmiä LLM:lle, jolla on yli miljardi parametreja useille GPU:ille, LLMem saavuttaa vaikuttavan keskimääräisen virheellisyyden 3,0 %.

Tarkka muistin arvioiminen etukäteen mahdollistaa LLMem:lle avaimen valita tehokkain hienosäätömenetelmä, joka välttää muistin loppumisen ja vähentää koulutusaikaa.

Uudet Tekniikat

Kvantisaatio, tensorin rinnakkaisuus ja mallin rinnakkaisuus ovat vakiintuneita tekniikoita, mutta tutkijat jatkavat uusien menetelmien kehittämistä tehokkaan LLM-koulutuksen ja käyttöönoton edistämiseksi.

  1. LoRA ja QLoRA: Nämä tekniikat sisältävät pienemmän residual-adapterimallin kouluttamisen päivittämään esikoulutettua LLM:ää uudella tiedolla sen sijaan, että suoraan hienosäätöä suorittaa massiivisen määrän parametreja. Tämä voi johtaa merkittäviin muistisäästöihin säilyttäen suurimman osan mallin suorituskyvystä.
  2. FlashAttention: Itsehuomio-mekanismi on muisti- ja laskentakynnys transformer-malleissa. FlashAttention approksimoi standardi- huomiota lineaarisella kompleksisuudella, vähentäen muistin vaatimusta toisesta potenssista lineaariseen syötejonon pituuteen.
  3. Mixture-of-Experts: Tämä lähestymistapa reitittää kunkin syötedatan dynaamisesti erikoismalliin sen sijaan, että se prosessoidaan koko mallin läpi. Tämä dynaaminen harvautus voi säästää muistia aktivoimalla ainoastaan osan asiantuntijoista kussakin näytteessä.
  4. Reversed Model Surgery: Tutkijat ovat tutkineet kirurgista mallin pakkausta poistamalla vähemmän tärkeitä komponentteja, kuten huomio-päitä, vaihtamalla muisti/nopeuden tarkkuuden.
  5. Offloading: Lopulta, tekniikat, jotka siirtävät parametreja, optimointitiloja tai aktivaatioita CPU:n muistiin tai levyyn, voivat täydentää rajoitettua GPU-muistia suurten mallien koulutuksessa.

Nämä edistykselliset menetelmät osoittavat elinvoimaisen tutkimusympäristön, joka on keskittynyt tehokkaan LLM-koulutuksen ja käyttöönoton demokratisoimiseen erilaisilla laitteistoilla.

Johtopäätös

Iset suurten kielimallien muistin vaatimukset asettavat merkittäviä haasteita niiden laajamittaiselle soveltamiselle todellisissa sovelluksissa. Ymmärtämällä muistin arviointitekniikoita ja hyödyntämällä kvantisaatiota, jakautumisstrategioita ja uusia innovaatioita, voimme optimoida LLM-käyttöönoton resurssirajoitettujen laitteiden kanssa.

Työkalut kuten LLMem avaavat tien tarkalle muistin arvioimiselle, mahdollistaen käyttäjien valita paras hienosäätökonfiguraatio. Kun laitteisto kehittyy ja tutkimus etenee, voimme odottaa tehokkaampaa LLM-koulutusta ja inferenssiä, joka edistää kehitystä luonnollisen kielen prosessoinnissa ja tekoälyssä.

Oikean mallikapasiteetin, tarkkuuden ja resurssien käytön tasapainottaminen on ratkaisevaa isojen kielimallien täydellisen potentiaalin avaamisessa erilaisilla aloilla ja sovelluksissa. Omaksumalla muistin optimointitekniikoita, liikumme lähemmäs tulevaisuutta, jossa huipputason kieli-ai on saatavilla, skaalautuva ja kestävä.

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.