Navýšení výkonu Llama 2 70B pomocí NVIDIA H100

Cesta akcelerované inference LLM

The journey of accelerated LLM inference

Snaha o maximální výkon v odpovědním systému Perplexity nás vede k využívání nejnovějších technologií, které NVIDIA a AWS nabízejí. V tomto blogu s radostí sdílíme výsledky našich nejnovějších experimentů: srovnání inference modelu Llama 2 70B napříč různými hardwarovými a softwarovými nastaveními.

Naše platforma pro inferenci LLM, pplx-api, je postavena na špičkovém technologickém stacku poháněném open-source knihovnami. Od spuštění veřejné betaverze pplx-api v říjnu řešíme výzvy spojené škálováním a učíme se, jak nejlépe vyladit naši konfiguraci pro dosažení masivního měřítka. To nás vedlo k provedení experimentů s následujícími hlavními otázkami:

Jaké je přímé zvýšení výkonu při přechodu našich GPU z NVIDIA A100 na NVIDIA H100, přičemž všechna ostatní nastavení zůstanou stejná?

Jaká je efektivita kvantování v 8bitové plovoucí řádové čárce (fp8), pro kterou H100 přidává nativní podporu? Jaká je přesnostní daň za toto kvantování?

Jak tenzorový paralelismus a velikost dávky ovlivňují latenci a propustnost tokenů?

S ohledem na výše uvedené, která konfigurace přináší nejlépe škálovatelnou rovnováhu mezi výkonem a nákladovou efektivitou?

Experimentální nastavení

Následující experiment jsme provedli jako sérii lokálních benchmarků, abychom se vyhnuli síťové latenci.

Klíčové metriky:

Latence: Celková doba, kterou inferenční server potřebuje k vygenerování úplné odpovědi.

Propustnost: Počet výstupních tokenů za sekundu na jedno GPU, které dokáže inferenční server vygenerovat napříč všemi uživateli a požadavky.

Konstanty:

Následující faktory by ovlivnily klíčové metriky, proto jsme je zachovali konzistentní napříč různými pokusy experimentu.

Model AI

Výkon roste s velikostí LLM. Více parametrů vyžaduje více výpočtů, což vede k pomalejší inferenci. Například Llama 2 13B je rychlejší než Llama 2 70B, pokud jsou ostatní nastavení stejná. V tomto experimentu se držíme modelu Llama 2 70B, protože chceme optimalizovat obsluhu těch nejschopnějších open-source modelů.

Datová sada vstupních a výstupních tokenů

Množství vstupních a výstupních tokenů v každém páru požadavku a odpovědi může ovlivnit měření výkonu. Generování výstupních tokenů obecně dominuje celkové době odpovědi. Když vzorkování dat vyvolává u LLM pouze odpovědi typu „ano/ne“, odpověď je rychlejší ve srovnání se vzorky, které po LLM vyžadují psaní esejů. Naše datová sada se skládá ze syntetických požadavků s 1024 vstupními tokeny a 512 výstupními tokeny. Tato distribuce byla zvolena tak, aby odpovídala pozorované distribuci provozu na našem veřejném nasazení modelu Llama 2 70B.

Verze softwaru

NVIDIA TensorRT-LLM (verze v0.5.0) je open-source knihovna pro optimalizaci inference LLM. Byla vydána koncem roku 2023, kombinuje četné optimalizace inference od společnosti NVIDIA a poskytuje flexibilní vrstvu přizpůsobení pro klíčové parametry tohoto experimentu: velikost dávky, kvantování a tenzorový paralelismus.

Proměnné

Experimentovali jsme ve 4 oblastech konfigurace: tenzorový paralelismus, architektura GPU, kvantování a maximální velikost dávky. Tyto oblasti jsou vzájemně propojené, protože každá z nich představuje kompromis ohledně kritického úzkého hrdla – paměti GPU.

Architektura GPU

Devátá generace architektury GPU Hopper (H100-HBM3-80GB / p5.48xlarge) přináší oproti svému předchůdci Ampere (A100-SXM4-80GB / p4de.24xlarge) obrovské množství funkcí, včetně 2× až 6× vyšší výpočetní rychlosti a téměř dvojnásobné šířky pásma paměti GPU. Šířka pásma paměti GPU je pro inferenci klíčovou metrikou, protože jedním z hlavních úzkých hrdel latence u maticového násobení při inferenci je načítání gigabytů dat modelu z paměti GPU do výpočetních registrů. Na základě těchto statistik jsme předpokládali, že přímé srovnání NVIDIA H100 a A100 vykáže dvojnásobné zlepšení v latenci i propustnosti.

Dalším klíčovým rozdílem mezi NVIDIA H100 a A100 je, že jádra tensor core v H100 nativně podporují instrukce v 8bitové plovoucí řádové čárce (fp8), což otevírá dveře k dalším optimalizacím popsaným níže. Proto pro H100 používáme specificky fp8 a fp16.

Abychom v tomto experimentu udrželi paměť na jedno GPU konzistentní, drželi jsme se pro naše NVIDIA A100 a H100 uzlů s 8× 80GB pamětí GPU. Kromě umožnění větších velikostí dávek je paměť GPU důležitá proto, že parametry modelu se během spouštění serveru načítají do paměti GPU pro rychlý přístup. Pokud je například každý ze 70 miliard parametrů v našem modelu 16bitové číslo s plovoucí řádovou čárkou, velikost modelu je přibližně 140 GB, což se na jediné GPU nevejde. Odtud plyne potřeba tenzorového paralelismu, který vysvětlujeme níže.

Tenzorový paralelismus

Tenzorový paralelismus označuje počet zařízení GPU využitých ke spuštění inferenčního serveru. Když alokujeme určitý počet GPU, TensorRT-LLM sdruží jejich prostředky, což nám pomáhá dosáhnout minimálního požadovaného rozpočtu paměti pro spuštění modelu Llama 2 70B. Naše hypotéza je taková, že nižší tenzorový paralelismus povede k vyšší latenci (kvůli menšímu množství prostředků spotřebovaných na vyřízení každé dávky), ale k vyšší propustnosti na jedno GPU (kvůli lepšímu využití) ve srovnání s vyšším tenzorovým paralelismem.

Kvantování

Kvantování je snížení přesnosti vah a aktivačních funkcí používaných v neuronech sítích. Tuto techniku používáme k polovičnímu snížení spotřeby paměti GPU při přechodu z fp16 na fp8. Díky tomu je možné spustit stejný model s nižší celkovou spotřebou paměti GPU, což umožňuje nižší tenzorový paralelismus, který zvyšuje propustnost.

Implementace kvantování mohou snížit přesnost. Proto jsme vyhodnotili přesnost pro různé úrovně přesnosti porovnáním jejich statistiky perplexity (míry toho, jak dobře LLM předpovídá každý další token ve větě) na korpusu WikiText. V případě 8bitové plovoucí řádové čárky a 8bitové váhy s 8bitovou aktivací a SmoothQuant (w8a8 SQ) nedošlo k žádné významné změně perplexity (< 1 %) ve srovnání s fp16 na WikiTextu, takže jsme mohli s důvěrou pokračovat. Nicméně w4a16 vykazovalo podstatnou změnu perplexity o 7 %, což lze potenciálně přičíst ještě nižší přesnosti a nutným dynamickým převodům mezi int4 a fp16.

Velikost dávky

Paralelismus prostřednictvím dávkování je klasická strategie pro získání maximálního výkonu ze systému omezeného zdroji. Zpracováním více požadavků v každém dopředném průchodu neuronovou sítí dávkování prokazatelně zvyšuje propustnost za cenu určité latence. Dávkování s sebou nese také vyšší spotřebu paměti GPU, protože velikost mezipaměti KV, která spravuje mechanismus pozornosti, roste lineárně s velikostí dávky.

V případě Llama 2 70B (která má 80 vrstev), fp16 s velikostí dávky 32 pro kontext o velikosti 4096, dosahuje velikost mezipaměti KV úctyhodných 40 GB. To nakonec brání tomu, aby se Llama 2 70B fp16, jejíž samotné váhy zabírají 140 GB, pohodlně vešla do 160 GB paměti GPU dostupné při tenzorovém paralelismu 2 (TP-2).

Výsledky

Prošli jsme kompatibilní kombinace 4 proměnných experimentu a níže prezentujeme ty nejzajímavější trendy.

Obrázek 1 – Latence požadavků s různou velikostí dávky napříč pěti různými konfiguracemi, všechny s tenzorovým paralelismem 8, což přináší nejlepší latenci s 8 dostupnými GPU. V rámci každé konfigurace se latence při zvětšení velikosti dávky z 1 → 32 zhruba zdvojnásobí a z 32 → 128 se zdvojnásobí znovu. Při dostatečně velkých velikostech dávek H100 přibližně poloviční latenci ve srovnání s A100. A100 používá smíšenou přesnost, protože architektura postrádá nativní podporu pro fp8. w8a8 se SmoothQuant (SQ) má připomínat fp8.

Zlepšení latence díky kvantování se pohybuje kolem 10 % při srovnání H100 fp16 → fp8 a A100 fp16 → w8a8 se SmoothQuant. Nicméně smíšená přesnost w4a16 ve skutečnosti funguje lépe při nízkých velikostech dávek a hůře při vyšších velikostech dávek ve srovnání s fp16. To může být způsobeno řadou faktorů, včetně méně optimalizovaných výpočetních jader, času potřebného na převod mezi int4 a fp16 a tím faktorem, že w4a16 stále používá 16bitové plovoucí řádové čárky pro aktivační funkce, což nevede k žádným úsporám v rozměrech mezipaměti KV. Protože w4a16 rovněž prokázala nižší přesnost, dospěli jsme k závěru, že bychom se měli držet w8a8 SQ pro A100 a fp8 pro H100.

Obrázek 2 – Propustnost napříč konfiguracemi TP-8 s odlišnou architekturou, kvantováním a velikostí dávky. Pro každou architekturu a kvantování byla velikost dávky zvolena jako největší, která splňovala požadavek na latenci 25600 ms (20 tokenů za sekundu pro 512 tokenů), abychom porovnávali konfigurace s podobnou latencí. Za tohoto požadavku dosahuje H100 s BS-128 228% propustnosti ve srovnání s A100 BS-64 při použití stejného kvantování (fp16) a navíc má nižší latenci odpovědi navzdory zdvojnásobené velikosti dávky. Kvantování pomocí fp8 tento faktor zlepšuje na 251 %.

V našich prvních dvou obrázcích uvádíme pouze konfigurace TP-8. H100 dosahuje 54% latence a 184% propustnosti ve srovnání s A100, když oba používají fp16 / BS-128 / TP-8, což se zlepší na 49% latenci a 202% propustnost při použití fp8 na H100. Toto zlepšení výkonu lze přičíst nárůstu výpočetního výkonu a šířky pásma paměti mezi H100 a A100. Pozoruhodné je, že rozdíl je méně výrazný při nižších velikostech dávek, kde může být využití nižší.

Při budování naší platformy chceme pro naše uživatele dodržovat určité požadavky na latenci a zároveň maximalizovat propustnost. Proto namísto porovnávání A100 vs. H100 při stejné velikosti dávky dává pro nás větší smysl porovnávat jejich propustnost pouze v konfiguracích, kde splňují požadavek na latenci. Nastavili jsme hranici na latenci 25600 ms pro dokončení 512 výstupních tokenů a zjistili jsme, že H100 / TP-8 / fp8 / BS-128 poskytuje 251% propustnost ve srovnání s A100 / TP-8 / fp16 / BS-64, protože dokáže zpracovat dvojnásobnou velikost dávky při nižší latenci. Vzhledem k tomu, že kvantování přináší úsporu paměti GPU, musíme nyní vyhodnotit, jak může tenzorový paralelismus přidat další vrstvu optimalizace.

Obrázek 3 – Latence napříč různými velikostmi dávek a tenzorovým paralelismem pro H100 fp8. Latence se při zvětšení velikosti dávky z 1 → 32 zhruba zdvojnásobí a z 32 → 128 se zdvojnásobí znovu. TP-2 je trvale zhruba dvakrát pomalejší než TP-8, když jsou velikosti dávek stejné. Zdvojnásobení tenzorového paralelismu při současném zdvojnásobení velikosti dávky udržuje latenci relativně stabilní, protože počet dávek zpracovaných na jedno GPU zůstává vyrovnaný.

Co se týče kvantování a architektury, existují jasní vítězové: H100 dominuje nad A100 a kvantování s nižší přesností zlepšuje využití paměti, latenci i propustnost. Velikost dávky a tenzorový paralelismus však v našich klíčových metrikách představují kompromis. Větší velikost dávky optimalizuje propustnost za cenu zvýšené latence a spotřeby paměti. Na druhou stranu vyšší tenzorový paralelismus zvětšuje celkový fond dostupné paměti a optimalizuje latenci, ale představuje kompromis vůči propustnosti kvůli nákladům na synchronizaci při distribuovaném násobení matic a z důvodu vytížení většího množství prostředků GPU.

Obrázek 4 – Propustnost napříč různými velikostmi dávek a tenzorovým paralelismem pro H100 fp8. Nejvyšší propustnost pochází z TP-2 BS-128, a to 460 % ve srovnání se základní linií A100/TP-8/fp16/BS-64. TP-2 BS-128 je však zároveň nejpomalejším výsledkem na obrázku 3.

Konfigurace našeho experimentu maximalizující propustnost je H100 / fp8 / TP-2 / BS-128 s 767 výstupními tokeny za sekundu na jedno GPU. To představuje 460% zlepšení oproti A100 / fp16 / TP-8 / BS-64. To však je vykoupeno zdvojnásobením latence – blíže k 42000 ms pro 512 výstupních tokenů –, takže nemusí být vhodná jako produkční konfigurace. Výsledky TP-4 BS-128 (626 tok/s/gpu při době odezvy 26188 ms) a TP-2 BS-32 (435 tok/s/gpu při době odezvy 18821 ms) mohou představovat lepší kompromisy pro naše klíčové metriky.

Závěr

Naše výsledky ukazují, že:

Dosahujeme 54% latence a 184% propustnosti při použití H100 oproti A100 při stejné konfiguraci, což se zlepší na 49 %, respektive 202 %, když H100 využije svou nativní podporu pro fp8.

Při maximalizaci propustnosti za podmínky omezení latence dosahuje H100 / fp8 / TP-8 / BS-128 251% propustnosti ve srovnání s A100 / fp16 / TP-8 / BS-64, protože dokáže zpracovat dvojnásobnou dávku vyšší rychlostí.

Využitím H100 s TP-2 a fp8 můžeme dosáhnout 373% propustnosti A100 / fp16 / TP-8 / BS-128 s nárůstem latence menším než 10 %.

Velikost dávky a tenzorový paralelismus představují pro provozovatele inferenčního systému LLM kompromis mezi propustností a latencí.

Tyto výsledky nám dávají jistotu ohledně úplného přechodu na GPU H100 v našem hardwarovém stacku, který byl dříve poháněn A100. Jsme nadšeni, že můžeme potvrdit nárůst výkonu inzerovaný společností NVIDIA, a těšíme se na jejich další průlomy v oblasti akcelerovaného hardwaru.

Co bude následovat

Naší další hranicí pro optimalizaci je prozkoumat dopad strukturované řídkosti (structured sparsity) a přesnosti int4 na přesnost a výkon, což by mohlo výrazně snížit nároky modelu Llama 2 70B na paměť GPU a přinést až dvojnásobné zlepšení latence. Jsme nadšeni, že můžeme pokračovat na cestě bleskově rychlé inference a doufáme, že umožníme našim uživatelům vytvářet výkonné aplikace nad naší platformou.

V blízké budoucnosti bude pplx-api zvyšovat limity sazeb a nabízet více vlastních modelů Perplexity LLM, včetně LLM poháněného internetem s uzemněním pro fakta.

Zaregistrujte se k odběru Perplexity Pro na adrese perplexity.ai/pro. Získejte přístup k našemu špičkovému rozhraní pplx-api a využijte tyto pokročilé funkce ve svých projektech. Objevte více o pplx-api na našem blogu.

Máte zájem utvářet budoucnost AI? Hledáme nové posily! Staňte se součástí týmu, který pohání generativní infrastrukturu LLM v masivním měřítku. Prozkoumejte pracovní příležitosti na stránce Perplexity Careers.

Autoři:

Aarash Heydari, Grigorij Alekseev, Kevin Hu, Denis Yarats