Llama 2 70B spartinimas su NVIDIA H100

Paspartintos LLM išvesties kelionė

The journey of accelerated LLM inference

Perplexity atsakymų variklio našumo siekis skatina mus taikyti naujausias technologijas, kurias siūlo NVIDIA ir AWS. Šiame tinklaraštyje džiaugiamės galėdami pasidalinti naujausių mūsų eksperimentų rezultatais: Llama 2 70B išvesties palyginimu naudojant įvairias aparatūros ir programinės įrangos parinktis.

Mūsų didelių kalbos modelių (LLM) išvesties platforma pplx-api, sukurta naudojant pažangiausią technologijų rinkinį, paremtą atvirojo kodo bibliotekomis. Nuo pat to laiko, kai spalio mėnesį prasidėjo viešoji pplx-api beta versija, sprendžiame mastelio keitimo iššūkius ir mokomės, kaip geriausiai pritaikyti savo konfigūraciją, kad pasiektume milžinišką mastą. Tai paskatino mus atlikti eksperimentus su šiais pagrindiniais klausimais:

Koks yra tiesioginis našumo prieaugis perjungiant mūsų GPU iš NVIDIA A100 į NVIDIA H100, kai visi kiti nustatymai lieka nepakeisti?

Koks yra 8 bitų slankiojo kablelio (fp8) kvantavimo, kuriam H100 prideda vietinį palaikymą, efektyvumo prieaugis? Kokia yra šio kvantavimo tikslumo kaina?

Kaip tenzoriaus paralelizavimas ir paketo dydis veikia vėlavimą ir žetonų pralaidumą?

Atsižvelgiant į visa tai, kuri konfigūracija užtikrina mastelio požiūriu optimaliausią našumo ir sąnaudų efektyvumo balansą?

Eksperimento sąranka

Atlikome šį eksperimentą kaip vietinių spartos testų seriją, kad išvengtume tinklo vėlavimo.

Pagrindiniai rodikliai:

Vėlavimas: Bendras laikas, per kurį išvesties serveris sugeneruoja visą atsakymą.

Praeinamumas: Išvesties žetonų skaičius per sekundę vienam GPU, kurį išvesties serveris gali sugeneruoti visiems vartotojams ir užklausoms.

Konstantos:

Šie veiksniai turėtų įtakos pagrindiniams rodikliams, todėl išlaikėme juos pastovius atlikdami skirtingus eksperimento bandymus.

AI modelis

Našumas didėja didėjant LLM dydžiui. Didesnis parametrų skaičius reikalauja daugiau skaičiavimų, todėl sumažėja išvesties greitis. Pavyzdžiui, Llama 2 13B veikia greičiau nei Llama 2 70B, kai kiti nustatymai yra lygūs. Šiame eksperimente naudojame Llama 2 70B, nes norime optimizuoti galingiausių atvirojo kodo modelių aptarnavimą.

Įvesties ir išvesties žetonų duomenų rinkinys

Įvesties ir išvesties žetonų kiekis kiekvienoje užklausos ir atsakymo poroje gali paveikti našumo matavimus. Apskritai išvesties žetonų generavimas lemia bendrą atsakymo laiką. Kai imant duomenis iš LLM gaunami tik „taip / ne“ atsakymai, atsakymas būna greitesnis, lyginant su pavyzdžiais, kuriuose LLM prašoma rašyti esė. Mūsų duomenų rinkinį sudaro sintetinės užklausos su 1024 įvesties žetonais, sukeliančiomis 512 išvesties žetonų. Šis pasiskirstymas buvo pasirinktas siekiant atitikti pastebėtą srauto pasiskirstymą mūsų viešai veikiančioje Llama2 70B versijoje.

Programinės įrangos versija

NVIDIA TensorRT-LLM (v0.5.0 išleidimas) yra atvirojo kodo biblioteka, skirta LLM išvestiai optimizuoti. Išleista 2023 m. pabaigoje, ji apjungia daugelį NVIDIA išvesties optimizavimų ir suteikia lankstų pritaikymo sluoksnį pagrindiniams šio eksperimento parametrams: paketo dydžiui, kvantavimui ir tenzoriaus paralelizavimui.

Kintamieji

Eksperimentavome taikydami 4 konfigūracijos ašis: tenzoriaus paralelizavimą, GPU architektūrą, kvantavimą ir maksimalų paketo dydį. Šios ašys yra tarpusavyje susijusios, nes kiekviena iš jų reiškia kompromisą, susijusį su kritiniu ribojančiu resursu – GPU atmintimi.

GPU architektūra

Devintosios kartos Hopper (H100-HBM3-80GB / p5.48xlarge) GPU architektūra turi didžiulį sąrašą funkcijų, lyginant su pirmtake Ampere (A100-SXM4-80GB / p4de.24xlarge), įskaitant 2–6 kartus didesnį skaičiavimo greitį ir beveik dvigubai didesnį GPU atminties pralaidumą. GPU atminties pralaidumas yra esminis išvesties rodiklis, nes pagrindinė išvesties matricos daugybos vėlavimo kliūtis kyla dėl gigabaitų modelio duomenų įkėlimo iš GPU atminties į skaičiavimo registrus. Remdamiesi šia statistika, iškėlėme hipotezę, kad tiesioginis NVIDIA H100 ir A100 palyginimas parodys dvigubą pagerėjimą tiek vėlavimo, tiek pralaidumo srityje.

Kitas pagrindinis skirtumas tarp NVIDIA H100 ir A100 yra tas, kad H100 tenzoriaus branduolys iš prigimties palaiko 8 bitų slankiojo kablelio (fp8) instrukcijas, o tai atveria kelią tolimesniam optimizavimui, aprašytam toliau. Štai kodėl fp8 ir fp16 naudojame būtent H100 atveju.

Kad šiame eksperimente atminties kiekis vienam GPU išliktų pastovus, tiek NVIDIA A100, tiek H100 atveju naudojome mazgus su 8x80GB GPU atmintimi. Be didesnių paketo dydžių palaikymo, GPU atmintis yra svarbi todėl, kad norint užtikrinti greitą prieigą, serverio paleidimo metu modelio parametrai yra įkeliami į GPU atmintį. Pavyzdžiui, jei kiekvienas iš 70 milijardų mūsų modelio parametrų yra 16 bitų slankiojo kablelio skaičius, modelio dydis yra apie 140 GB, todėl jis netelpa viename GPU. Iš čia ir kyla tenzoriaus paralelizavimo poreikis, kurį paaiškiname toliau.

Tenzoriaus paralelizavimas

Tenzoriaus paralelizavimas reiškia naudojamų GPU įrenginių skaičių išvesties serveriui paleisti. Kai paskiriame tam tikrą GPU skaičių, „TensorRT-LLM“ apjungia jų išteklius, kad padėtų mums pasiekti mažiausią reikalingą atminties biudžetą Llama2 70B paleisti. Mūsų hipotezė yra tokia, kad mažesnis tenzoriaus paralelizavimas lems didesnį vėlavimą (dėl mažesnių išteklių, sunaudojamų kiekvienam paketui įvykdyti), bet didesnį pralaidumą vienam GPU (dėl geresnio išteklių panaudojimo), lyginant su didesniu tenzoriaus paralelizavimu.

Kvantavimas

Kvantavimas – tai neuroninių tinklų naudojamų svorių ir aktyvavimų tikslumo sumažinimas. Šį metodą naudojame tam, kad perjungus iš fp16 į fp8 perpus sumažintume GPU atminties suvartojimą. Tai leidžia paleisti tą patį modelį su mažesniu bendru GPU atminties sunaudojimu, o tai įgalina mažesnį tenzoriaus paralelizavimą ir padidina pralaidumą.

Kvantavimo realizacijos gali pabloginti tikslumą. Todėl įvertinome skirtingų tikslumų įtaką tikslumui, palygindami jų perkliškumo (angl. perplexity) statistiką – rodiklį, parodantį, kaip gerai LLM prognozuoja kiekvieną kitą sakinio žetoną – „WikiText“ korpuse. 8 bitų slankiojo kablelio, 8 bitų svorio su 8 bitų aktyvavimu ir „SmoothQuant“ (w8a8 SQ) atveju reikšmingo perkliškumo pokyčio (< 1%), lyginant su fp16 „WikiText“ aplinkoje, nebuvo, todėl jautėmės užtikrinti ir tęsėme darbą. Tačiau w4a16 parodė žymų 7% perkliškumo pokyčio, kas tikriausiai priskirtina dar mažesniam tikslumui ir būtinoms dinaminėms konversijoms tarp int4 ir fp16.

Paketo dydis

Paralelizavimas naudojant paketavimą yra klasikinė strategija našumui išspausti iš išteklių ribojamos sistemos. Apdorojant kelias užklausas kiekvieno tiesioginio perdavimo per neuroninį tinklą metu, paketavimas padidina pralaidumą tam tikro vėlavimo kaina. Paketavimas taip pat lemia didesnį GPU atminties suvartojimą, nes KV spartiosios atminties, valdančios dėmesio mechanizmą, dydis auga tiesiškai kartu su paketo dydžiu.

Llama 2 70B atveju (turinčio 80 sluoksnių), naudojant fp16 su 32 paketo dydžiu ir 4096 konteksto dydžiu, KV spartiosios atminties dydis sudaro net 40 GB. Dėl to Llama 2 70B fp16, kurio vien svoriai užima 140 GB, negali patogiai tilpti į 160 GB GPU atmintį, prieinamą esant 2 tenzoriaus paralelizavimui (TP-2).

Rezultatai

Peržiūrėjome suderinamus 4 eksperimento kintamųjų derinius ir toliau pateikiame įžvalgiausias tendencijas.

1 pav. Užklausų su įvairiais paketo dydžiais vėlavimas penkiose skirtingose konfigūracijose, visose taikant 8 tenzoriaus paralelizavimą, kuris užtikrina geriausią vėlavimą turint 8 pasiekiamus GPU. Kiekvienoje konfigūracijoje vėlavimas iš esmės padvigubėja paketo dydį padidinus nuo 1 iki 32, ir vėl padvigubėja nuo 32 iki 128. Esant pakankamai dideliems paketo dydžiams, H100 sumažina vėlavimą maždaug per pusę, lyginant su A100. A100 naudoja mišrų tikslumą, nes architektūra iš prigimties nepalaiko fp8. w8a8 su „SmoothQuant“ (SQ) yra skirta imituoti fp8.

Kvantavimo vėlavimo pagerėjimas siekia apie 10%, lyginant H100 fp16 → fp8 ir A100 fp16 → w8a8 su „SmoothQuant“. Tačiau mišraus tikslumo w4a16 iš tikrųjų veikia geriau esant mažam paketo dydžiui ir prasčiau esant didesniam paketo dydžiui, lyginant su fp16. Tai gali lemti keletas veiksnių, įskaitant mažiau optimizuotus skaičiavimo branduolius, duomenų tipų keitimo laiką tarp int4 ir fp16 bei tai, kad w4a16 aktyvavimams vis dar naudoja 16 bitų slankiojo kablelio skaičius, todėl KV spartiosios atminties matmenys nesutaupomi. Kadangi w4a16 taip pat parodė mažesnį tikslumą, darome išvadą, kad A100 turėtume naudoti w8a8 SQ, o H100 – fp8.

2 pav. Pralaidumas TP-8 konfigūracijose su skirtinga architektūra, kvantavimu ir paketo dydžiu. Kiekvienai architektūrai ir kvantavimui paketo dydis buvo pasirinktas kaip didžiausias, atitinkantis 25600 ms vėlavimo reikalavimą (20 žetonų per sekundę 512 žetonams), kad galėtume palyginti panašų vėlavimą turinčias konfigūracijas. Pagal šį reikalavimą, H100 su BS-128 pasiekia 228% pralaidumą, lyginant su A100 BS-64 naudojant tą patį kvantavimą (fp16), ir netgi turi mažesnį atsakymo vėlavimą nepaisant padvigubėjusio paketo dydžio. Kvantavimas su fp8 pagerina šį rodiklį iki 251%.

Pirmuosiuose dviejuose paveikslėliuose pateikiame tik TP-8 konfigūracijas. H100 pasiekia 54% vėlavimą ir 184% pralaidumą, lyginant su A100, kai abi naudoja fp16 / BS-128 / TP-8; šie rodikliai pagerėja iki 49% vėlavimo ir 202% pralaidumo, kai H100 naudojamas fp8. Šį našumo pagerėjimą galima priskirti skaičiavimo galios ir atminties pralaidumo padidėjimui tarp H100 ir A100. Verta paminėti, kad skirtumas yra mažiau pastebimas esant mažesniems paketo dydžiams, kai išteklių panaudojimas gali būti mažesnis.

Kurkite savo platformą norėdami užtikrinti tam tikrus vėlavimo reikalavimus savo vartotojams ir kartu maksimaliai padidinti pralaidumą. Todėl, vietoje to, kad lygintume A100 ir H100 esant tam pačiam paketo dydžiui, mums prasmingiau lyginti jų pralaidumą tik tokiomis konfigūracijomis, kuriomis jie atitinka vėlavimo reikalavimus. Nustatėmė 25600 ms vėlavimo ribą 512 išvesties žetonų užbaigimui ir nustatėme, kad H100 / TP-8 / fp8 / BS-128 suteikia 251% pralaidumą lyginant su A100 / TP-8 / fp16 / BS-64, nes jis gali apdoroti dvigubai didesnį paketą su mažesniu vėlavimu. Atsižvelgiant į tai, kad kvantavimas sutaupo GPU atminties, dabar turime įvertinti, kaip tenzoriaus paralelizavimas gali suteikti kitą optimizavimo sluoksnį.

3 pav. H100 fp8 vėlavimas esant įvairiems paketo dydžiams ir tenzoriaus paralelizavimui. Vėlavimas iš esmės padvigubėja paketo dydį padidinus nuo 1 iki 32, ir vėl padvigubėja nuo 32 iki 128. TP-2 yra maždaug du kartus lėtesnis už TP-8, kai paketo dydžiai yra lygūs. Padvigubinus tenzoriaus paralelizavimą ir padvigubinus paketo dydį, vėlavimas išlieka gana stabilus, nes vienam GPU apdorojamų paketų skaičius lieka lygus.

Kalbant apie kvantavimą ir architektūrą, čia yra aiškūs nugalėtojai: H100 dominuoja prieš A100, o sumažinto tikslumo kvantavimas pagerina atminties panaudojimą, vėlavimą ir pralaidumą. Tačiau paketo dydis ir tenzoriaus paralelizavimas sukuria kompromisą mūsų pagrindiniuose rodikliuose. Didesnis paketo dydis optimizuoja pralaidumą didesnio vėlavimo ir atminties suvartojimo sąskaita. Kita vertus, didesnis tenzoriaus paralelizavimas padidina bendrą pasiekiamos atminties kiekį ir optimizuoja vėlavimą, tačiau tam įtakos turi pralaidumo nuostoliai dėl paskirstytos matricos daugybos sinchronizavimo išlaidų ir dėl to, kad užimama daugiau GPU išteklių.

4 pav. H100 fp8 pralaidumas esant įvairiems paketo dydžiams ir tenzoriaus paralelizavimui. Didžiausias pralaidumas gaunamas naudojant TP-2 BS-128 – jis siekia 460%, lyginant su A100/TP-8/fp16/BS-64 bazine linija. Tačiau TP-2 BS-128 taip pat yra lėčiausias rezultatas 3 paveiksle.

Mūsų eksperimento pralaidumą maksimizuojanti konfigūracija yra H100 / fp8 / TP-2 / BS-128, pasiekianti 767 išvesties žetonus per sekundę vienam GPU. Tai yra 460% pagerėjimas, lyginant su A100 / fp16 / TP-8 / BS-64. Tačiau tai pasiekiama padvigubėjusio vėlavimo kaina – beveik 42000 ms 512 išvesties žetonų atveju, – todėl ji gali netikti gamybinei konfigūracijai. TP-4 BS-128 (626 žetonų/sek./gpu prie 26188 ms atsakymo laiko) ir TP-2 BS-32 (435 žetonų/sek./gpu prie 18821 ms atsakymo laiko) rezultatai gali būti geresni kompromisai kalbant apie mūsų pagrindinius rodiklius.

Išvada

Mūsų rezultatai rodo, kad:

Pasiekiame 54% vėlavimą ir 184% pralaidumą naudodami H100, lyginant su A100 esant tai pačiai konfigūracijai, o tai pagerėja atitinkamai iki 49% ir 202%, kai H100 pasinaudoja savo gimtuoju fp8 palaikymu.

Kai pralaidumas maksimizuojamas taikant vėlavimo apribojimą, H100 / fp8 / TP-8 / BS-128 suteikia 251% pralaidumą lyginant su A100 / fp16 / TP-8 / BS-64, nes jis gali apdoroti dvigubą paketą didesniu greičiu.

Pasinaudodami H100 su TP-2 ir fp8, galime pasiekti 373% A100 / fp16 / TP-8 / BS-128 pralaidumo, kai vėlavimo padidėjimas yra mažesnis nei 10%.

Paketo dydis ir tenzoriaus paralelizavimas sudaro pralaidumo ir vėlavimo kompromisą LLM išvesties sistemos operatoriui.

Dėl šių rezultatų jaučiamės užtikrinti visiškai pereidami prie H100 GPU savo ankstesniame A100 pagrindu veikiančiame aparatūros rinkinyje. Džiaugiamės galėdami patvirtinti NVIDIA deklaruojamus našumo prieaugius ir laukiame jų naujų pasiekimų paspartintos aparatūros srityje.

Kas toliau

Mūsų kita optimizavimo riba yra ištirti struktūrizuoto retumo (angl. structured sparsity) ir int4 tikslumo tikslumą bei poveikį našumui, o tai galėtų žymiai sumažinti Llama 2 70B GPU atminties pėdsaką ir padidinti vėlavimą iki 2 kartų. Džiaugiamės galėdami tęsti itin greitos išvesties kelionę ir tikimės suteikti galimybę savo vartotojams kurti galingas programas mūsų platformoje.

Artimiausiu metu pplx-api panaikins srauto apribojimus ir pasiūlys daugiau pritaikytų Perplexity LLM, įskaitant internetinį LLM su faktų pagrindimu.

Užsiprenumeruokite Perplexity Pro adresu perplexity.ai/pro. Gaukite prieigą prie mūsų pažangiausios pplx-api ir išnaudokite šias pažangias galimybes savo projektuose. Sužinokite daugiau apie pplx-api mūsų tinklaraštyje.

Norite formuoti AI ateitį? Mes ieškome naujų darbuotojų! Tapkite milžiniško masto generacinių LLM infrastruktūrą kuriančios komandos dalimi. Peržiūrėkite galimybes Perplexity Careers.

Autoriai:

Aarash Heydari, Grigorii Alekseev, Kevin Hu, Denis Yarats