Prompt engineering

urychlování inferenci velkých jazykových modelů: Techniky pro efektivní nasazení

mm
Přidejte Unite.AI mezi své preferované zdroje na Google
LLM Inference Speed up

Velké jazykové modely (LLM) jako GPT-4, LLaMA a PaLM rozšiřují hranice toho, co je možné s přírodním jazykovým zpracováním. Nicméně, nasazení těchto masivních modelů do produkčních prostředí představuje významné výzvy z hlediska výpočetních požadavků, využití paměti, latence a nákladů. Jak LLM dále rostou a stávají se schopnějšími, optimalizace jejich inferenčních výkonů je kritická pro reálné aplikace.

V tomto technickém hlubokém pohledu prozkoumáme nejnovější techniky pro urychlování inferenci LLM, umožňující rychlejší časy odpovědí, vyšší propustnost a efektivnější využití hardwarových zdrojů. Prozkoumáme metody sahající od technik numerické přesnosti a novátorských mechanismů pozornosti až po architektonické inovace speciálně navržené pro efektivní generování textu.

Začneme tím, že pochopíme, proč je inferenční proces LLM tak náročný ve srovnání s tradičními modely NLP.

Výzva inferenčního procesu s velkými jazykovými modely

Před příchodem LLM se přírodní jazykové zpracování spoléhalo na menší modely zaměřené na specifické úkoly, jako je klasifikace textu, rozpoznávání jmenovaných entit a analýza sentimentu. Zatímco stále výpočetně náročné, tyto modely mohly být nasazeny na skromném hardwaru a následovaly relativně přímočarý inferenční proces.

LLM, na druhé straně, představují paradigmatický posun. Tyto modely jsou trénovány na rozsáhlých datech pomocí miliard parametrů, umožňujících jim provádět širokou škálu jazykových úkonů s pozoruhodnou dovedností. Nicméně, tato síla má cenu – dramaticky zvýšené výpočetní nároky během trénování i inferenčního procesu.

Jednou z hlavních výzev je autoregresivní povaha generování textu s LLM. Pro produkci lidsky podobného textu tyto modely předpovídají jeden token (slovo nebo pod-slovo) najednou, přičemž každý nový token závisí na předchozí generované výstupu. Tato sekvenční závislost brání efektivní paralelizaci a vede k výpočetním požadavkům, které se zvyšují polynomialně se délkou sekvence.

Kromě toho LLM často vyžadují dlouhé vstupní sekvence (podněty), aby bylo možné nastavit nezbytný kontext pro kvalitní generování textu. Delší vstupní délky vyžadují více paměti pro uložení mezistupňových stavů a matic pozornosti, což dále zatěžuje hardwarové zdroje.

S těmito jedinečnými výzvami tradiční optimalizační techniky, jako je kvantizace a statické výpočetní grafy, mohou být nedostatečné, protože se potýkají s udržením výkonu LLM při poskytování významných urychlení. Ponořme se do některých z hlavních strategií speciálně navržených pro urychlování inferenčního procesu LLM.

Techniky numerické přesnosti

From 32-Bit to 16-Bit Precision

From 32-Bit to 16-Bit Precision

Jedna z cest pro urychlování inferenčního procesu LLM spočívá v využití snížené numerické přesnosti pro modelové váhy a aktivační funkce. Moderní hluboké učení frameworky, jako PyTorch a TensorFlow, obvykle používají 32bitovou přesnost s plovoucí desetinnou čárkou (FP32) jako výchozí hodnotu. Nicméně, výzkum ukázal, že LLM mohou často udržet vysokou přesnost i při nižších přesnostech, jako je 16bitová (FP16), 8bitová celá čísla (INT8) nebo dokonce 4bitová celá čísla (INT4).

Snížení numerické přesnosti nabízí několik výhod:

  • Snížená stopa paměti: Nižší přesnostní reprezentace vyžadují méně paměti, umožňující větší modely nebo dávkové velikosti, aby se vešly do stejných hardwarových omezení.
  • Rychlejší výpočet: Mnoho moderních CPU a GPU poskytuje specializované instrukce a hardwarové urychlení pro aritmetiku s nižší přesností, umožňující významná urychlení.
  • Vylepšená energetická efektivita: S menším požadavkem na paměť a rychlejším výpočtem může inferenční proces s nižší přesností přeložit do snížené spotřeby energie – zásadní výhody pro nasazení na okraji a mobilních zařízeních.

Zatímco silné, techniky numerické přesnosti zavedou一些 ztráty přesnosti ve srovnání s operacemi FP32. Klíčem je pečlivé vyhodnocení tohoto kompromisu mezi výpočetními zisky a potenciálním poklesem výkonu pro váš konkrétní případ použití.

Existují dvě hlavní přístupy ke kvantizaci LLM:

Post-trénovací kvantizace (PTQ): V této metodě je LLM nejprve trénován pomocí standardní přesnosti FP32. Po trénování jsou modelové váhy kvantizovány (přepnuty) do nižší přesnosti formátu, jako je INT8 nebo INT4. PTQ je přímočaré k implementaci, ale může vést k většímu poklesu přesnosti.

Kvantizace-vědomý trénink (QAT): S QAT je proces kvantizace simulován během trénovací fáze samotné. To umožňuje modelu naučit se kompenzovat kvantizační chyby, minimalizovat pokles přesnosti, když je konečná kvantizovaná model nasazen.

Pro praktické použití můžete využít před-kvantizované modely dostupné na platformách, jako je Hugging Face, které hostí řadu modelů optimalizovaných pomocí různých kvantizačních metod. Například, pokud je požadován model kvantizovaný pomocí Auto-GPTQ, uživatelé jej mohou snadno načíst pomocí knihovny transformátorů Hugging Face. Kromě toho, pro kvantizaci modelu, můžete použít nástroje, jako je AutoGPTQ, které se integrují se stávajícími knihovnami pro efektivní kompresi modelu.

Here is an example of loading a pre-quantized Llama-2-7b model using the Hugging Face transformers library:

from transformers import AutoModelForCausalLM, AutoTokenizer

<p>model_id = &quot;TheBloke/Llama-2-7b-Chat-GPTQ&quot;
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
And for custom quantization, you might follow these steps using the AutoGPTQ toolkit:</p>

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

<p>model_id = &quot;llama-2-7b-original&quot;
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset=&quot;your-dataset&quot;, tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)</p>

Pamatujte, že kvantizace může vyžadovat post-kvantizační jemné ladění nebo inženýrství podnětů, aby se zachovala kvalita modelu. Pro novou kvantizaci můžete přispět zpět do komunity tím, že budete své kvantizované modely zveřejňovat na platformách, jako je Hugging Face.

Vždy zajistěte, aby byl vyvážen model velikosti, výpočetních požadavků a výkonu při výběru kvantizační strategie pro váš konkrétní případ použití.

 

Algoritmus Flash Attention

Mechanizmus multi-head pozornosti je klíčovou součástí transformátorových LLM, umožňující modelu zachytit dlouhodobé závislosti a kontextualizované reprezentace. Nicméně, tato operace pozornosti je výpočetně neefektivní pro autoregresivní generování textu, protože vyžaduje přepočet mnoha stejných hodnot pro každý nový token.

Algoritmus Flash Attention, představený v článku FlashAttention, poskytuje více paměťově efektivní a paralelizační přístup k operaci pozornosti. Místo přepočtu hodnot pozornosti pro každý token, Flash Attention cachuje a opakovaně využívá mezistupňové klíčové/hodnotové matice, vyhýbaje se redundatním výpočtům.

Tato optimalizace nejen snižuje výpočetní nároky, ale také zlepšuje vzorce přístupu k paměti, vedoucí k lepšímu využití paměťové šířky GPU a paralelismu.

Zatímco detaily Flash Attention jsou poměrně složité, základní myšlenka spočívá v rozdělení operace pozornosti do dvou fází:

  1. Prefix Sum Embedding: Tato fáze počítá a cachuje klíčové/hodnotové vložené reprezentace pro všechny vstupní tokeny, umožňující efektivní opakované použití během generování.
  2. Kauzální pozornost: Samotná operace pozornosti, nyní optimalizovaná pro využití cachovaných klíčových/hodnotových vložených reprezentací z první fáze.

Rozdělením těchto fází může Flash Attention využít vysoce paralelních GPU operací, významně urychlující bottleneck pozornosti v inferenčním procesu LLM.

Zde je stručné, konceptuální ilustrace implementace Flash Attention s LLM:

from transformers import AutoModelForCausalLM
import torch
from flash_attention import flash_attention

<p># Načtení LLM, jako je OctoCoder
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;)</p>

<p># Ukázkový systémový podnět, který vede model k tomu, aby se stal lepším pomocníkem pro kódování
system_prompt = &quot;&quot;&quot;... (system prompt details) ...&quot;&quot;&quot;</p>

<p># Příprava delšího vstupu se systémem podnětu
long_prompt = system_prompt + &quot;Question: Please write a function in Python that transforms bytes to Gigabytes.&quot;</p>

<p># Přepnutí modelu pro optimalizaci Flash Attention
model.to_bettertransformer()</p>

<p># Spuštění modelu s 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&quot;Generated in {time.time() - start_time} seconds.&quot;)

Zatímco Flash Attention nabízí působivé výkony, funguje v rámci stávající transformátorové architektury. Abychom plně využili potenciál urychleného inferenčního procesu LLM, musíme prozkoumat architektonické inovace speciálně navržené pro tuto úlohu.

Řezání LLM

Řezání LLM je technika pro snížení velikosti modelu, zatímco zachování funkcionality. Používá se estimační metoda závislou na datech pro důležitost váhy založenou na aproximacích Hessianovy matice. Při řezání jsou méně důležité skupiny váhy odstraněny a poté je model jemně laděn pro obnovu přesnosti. Balíček LLM-Pruner nabízí skripty pro řezání s různými strategiemi, které jsou podporovány. Řezání zahrnuje objevování závislostí, odhad příspěvků skupin a fázi zotavení zahrnující krátké post-tréninkové fáze.

Zde je zjednodušený příklad kódu pro použití LLM-Pruner pro model LLaMa:

from transformers import AutoModelForSequenceClassification
from pruning import LLMPruner

<p># Načtení před-trénovaného modelu LLaMa
model = AutoModelForSequenceClassification.from_pretrained(&quot;llama-base&quot;)</p>

<p># Inicializace prunera s požadovanou konfigurací
pruner = LLMPruner(
model,
pruning_ratio=0.25,
block_mlp_layers=(4, 30),
block_attention_layers=(4, 30),
pruner_type=&#039;taylor&#039;
)</p>

<p># Provedení řezání
pruned_model = pruner.prune()</p>

<p># Jemné ladění prunovaného modelu
pruned_model.fine_tune(training_data)

Tento kódový náčrt reprezentuje načtení před-trénovaného modelu LLaMa, nastavení prunera s konkrétními konfiguracemi (jako které vrstvy řezat a typ prunera), provedení procesu řezání a poté jemné ladění prunovaného modelu.

Architektonické inovace pro efektivní generování textu

Transformátorová architektura, ačkoli vysoce efektivní pro úkoly jazykového modelování, byla navržena jako obecný sekvenční model. Při nasazení LLM pro úkoly generování textu s dlouhými vstupními kontexty, výzkumníci zjistili, že specializovanější architektury mohou významně zlepšit efektivitu inferenčního procesu bez obětování kvality.

Zde jsou některé z hlavních architektonických inovací, které umožňují rychlejší inferenční proces LLM:

Alibi: Architektura Alibi, představená v článku PAL-Instruction, odděluje modelování dlouhého vstupního kontextu od procesu generování textu samotného. Používá komprimovanou reprezentaci vstupního kontextu („alibi“), aby inicializoval proces generování, vyhýbaje se potřebě zpracovávat plnou vstupní sekvenci opakovaně během autoregresivního generování.

Rotary Embeddings: Místo použití standardních positionálních vložených reprezentací, technika rotary embedding využívá rotační matice pro efektivní kódování positionální informace. Tento přístup byl prokázán jako zlepšení výkonu a umožnění zpracování delších vstupních sekvencí.

Multi-Query Attention (MQA): V tradiční pozornosti se každá výstupní tokenová pozornost zaměřuje na celou vstupní sekvenci, vedoucí k redundatnímu výpočtu. MQA reformuluje operaci pozornosti pro sdílení výpočtů napříč několika výstupními tokeny, snižující celkovou složitost.

Multiquery attention

Multiquery attention

Grouped-Query-Attention (GQA): Budoucí na MQA, GQA seskupuje výstupní tokeny do klastrů a počítá pozornost společně pro každý klastr. Tento přístup dále snižuje výpočetní nároky, zatímco zachovává vysokou kvalitu generování textu.

Zatímco stále v aktivním výzkumu a vývoji, tyto architektonické inovace prokázaly působivé urychlení pro úkoly inferenčního procesu LLM, zejména když jsou kombinovány s technikami, jako je Flash Attention a optimalizace numerické přesnosti.

Reálné nasazení

Mimo jádrové algoritmy a architektury, existují několik praktických úvah a kompromisů, které je třeba navigovat při nasazení LLM do produkčních prostředí:

Hardwarové urychlení: Zatímco CPU mohou zpracovat inferenční proces LLM, GPU a další urychlovače, jako jsou Google (GOOGL ) TPUs, jsou nezbytné pro dosažení vysoké propustnosti a nízké latence. Výběr správného hardwaru a optimalizace využití paměti je zásadní.

Batching a paralelismus: Aby bylo možné plně využít hardwarové paralelismu, strategie, jako je dávkové zpracování (zpracování více vstupů současně) a modelový paralelismus (distribuce LLM napříč několika zařízeními), mohou významně zvýšit propustnost.

Kvantizace vs. kvalita kompromis: Stupeň kvantizace (8bit, 4bit, atd.) bude přímo ovlivňovat rychlost inferenčního procesu a využití paměti, ale také ovlivní kvalitu výstupu. Tento kompromis musí být pečlivě vyhodnocen pro každý případ použití.

Modelová destilace: Alternativou ke kvantizaci jsou techniky modelové destilace, které mohou komprimovat velké LLM do menších, efektivnějších studentů-modelů, zatímco zachování vysoké přesnosti.

Cachování a optimalizované runtime: Optimalizované hluboké učení runtime, jako je NVIDIA TensorRT, a frameworky navržené pro nasazení LLM (například MosaicML Composable Inference Suite), mohou poskytnout významné výkonnostní zvýšení prostřednictvím technik, jako je operátorová fúze, kernel optimalizace a inteligentní strategie cachování.

Cesta k optimálnímu nasazení LLM často zahrnuje kombinaci několika technik, zatímco pečlivě zvažuje konkrétní požadavky aplikace, omezení infrastruktury a cíle výkonu.

Závěr

Jak velké jazykové modely pokračují v rychlé evoluci, urychlování jejich inferenčního procesu se stává stále důležitějším pro umožnění reálných aplikací a demokratizaci přístupu k těmto silným AI schopnostem.

V tomto technickém průvodci prozkoumáme nejnovější techniky sahající od optimalizace numerické přesnosti a novátorských mechanismů pozornosti až po architektonické inovace speciálně navržené pro efektivní generování textu. Zatímco každá metoda nabízí své vlastní výhody, skutečná síla často spočívá v kombinaci několika strategií, zatímco naviguje složitou síť kompromisů mezi rychlostí, využitím paměti a kvalitou výstupu.

V budoucnu můžeme očekávat pokračující výzkum a vývoj v této oblasti, poháněný neukojitelnou poptávkou po stále schopnějších a přístupnějších LLM. Od hardwarového urychlení a komprese modelů až po zcela nové architektury, hledání efektivní inferenční procesu LLM zůstává vzrušujícím hraním v oblasti zpracování přirozeného jazyka a umělé inteligence.

Já pět let se ponořím do fascinujícího světa strojového učení a hlubokého učení. Mé vášně a odborné znalosti mě vedly k tomu, abych se podílel na více než 50 různých projektech softwarového inženýrství, se zvláštním zaměřením na AI/ML. Mé pokračující zvědavosti mě také přivedly k přirozenému jazykovému zpracování, oblasti, kterou jsem ochoten prozkoumat dále.