výhonek Accelerating Large Language Model Inference: Techniky pro efektivní nasazení – Unite.AI
Spojte se s námi

Prompt Engineering

Urychlení vyvozování velkého jazykového modelu: Techniky pro efektivní nasazení

mm

Zveřejněno

 on

LLM Inference zrychlit

Velké jazykové modely (LLM), jako je GPT-4, Lamaa PaLM posouvají hranice toho, co je možné se zpracováním přirozeného jazyka. Nasazení těchto masivních modelů do produkčních prostředí však představuje značné problémy, pokud jde o výpočetní požadavky, využití paměti, latenci a náklady. Vzhledem k tomu, že LLM se neustále rozrůstají a jsou schopnější, je optimalizace jejich inferenčního výkonu zásadní pro aplikace v reálném světě.

V tomto technickém hloubkovém ponoru prozkoumáme nejmodernější techniky pro urychlení LLM odvození, které umožní rychlejší odezvu, vyšší propustnost a efektivnější využití hardwarových zdrojů. Budeme pokrývat metody od numericky přesných technik a nových mechanismů pozornosti až po architektonické inovace šité přímo na míru pro efektivní generování textu.

Začněme pochopením, proč je odvození LLM tak náročné ve srovnání s tradičními modely NLP.

Inference Challenge s velkými jazykovými modely

Před příchodem LLM se zpracování přirozeného jazyka spoléhalo na menší modely zaměřené na specifické úkoly, jako je klasifikace textu, rozpoznávání pojmenovaných entit a analýza sentimentu. I když jsou tyto modely stále výpočetně náročné, mohly být nasazeny na skromném hardwaru a mohly by se řídit relativně přímočarými inferenčními procesy.

LLM na druhé straně představují změnu paradigmatu. Tyto modely jsou trénovány na rozsáhlých souborech dat pomocí miliard parametrů, což jim umožňuje provádět širokou škálu jazykových úkolů s pozoruhodnou odborností. Tento výkon však něco stojí – dramaticky se zvyšují výpočetní nároky během školení i vyvozování.

Jedním z klíčových problémů je autoregresivní povaha generování textu pomocí LLM. Aby se vytvořil text podobný člověku, tyto modely předpovídají vždy jeden token (slovo nebo podslovo), přičemž každý nový token závisí na dříve generovaném výstupu. Tato sekvenční závislost brání účinné paralelizaci a má za následek výpočetní požadavky, které se polynomiálně škálují s délkou sekvence.

Navíc LLM často vyžadují dlouhé vstupní sekvence (výzvy), aby vytvořily nezbytný kontext pro vysoce kvalitní generování textu. Delší vstupní délky vyžadují více paměti pro uložení přechodných stavů a ​​matic pozornosti, což dále zatěžuje hardwarové zdroje.

S těmito jedinečnými výzvami mohou tradiční optimalizační techniky, jako je kvantizace a statické výpočetní grafy, selhat, protože se potýkají s udržením výkonu LLM a zároveň poskytují smysluplné zrychlení. Pojďme se ponořit do některých klíčových strategií šitých přímo na míru pro urychlení vyvozování LLM.

Numerické přesné techniky

Od 32bitové do 16bitové přesnosti

Od 32bitové do 16bitové přesnosti

Jedna cesta ke zrychlení LLM inference spočívá ve využití snížené numerické přesnosti pro modelové hmotnosti a aktivace. Moderní rámce hlubokého učení, jako jsou PyTorch a TensorFlow, standardně používají 32bitovou přesnost s plovoucí desetinnou čárkou (FP32). Výzkum však ukázal, že LLM si často dokážou udržet vysokou přesnost, i když pracují s nižší přesností, jako jsou 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á paměťová stopa: Reprezentace s nižší přesností vyžadují méně paměti, což umožňuje, aby se větší modely nebo velikosti dávek vešly do stejných hardwarových omezení.
  • Rychlejší výpočet: Mnoho moderních CPU a GPU poskytuje specializované instrukce a hardwarovou akceleraci pro aritmetiku s nižší přesností, což umožňuje výrazné zrychlení.
  • Vyšší energetická účinnost: Díky menším požadavkům na paměť a rychlejším výpočtům se může nižší přesnost odvození promítnout do snížené spotřeby energie – zásadní výhoda pro nasazení na okrajích a mobilních zařízeních.

I když jsou výkonné techniky numerické přesnosti ve srovnání s provozem FP32 určité ztráty přesnosti. Klíčem je pečlivě vyhodnotit tento kompromis mezi výpočtovými zisky a potenciálním snížením výkonu pro váš konkrétní případ použití.

Existují dva hlavní přístupy ke kvantování pomocí LLM:

Kvantování po tréninku (PTQ): Při této metodě je LLM nejprve trénován pomocí standardní přesnosti FP32. Po tréninku jsou modelové váhy kvantovány (převedeny) do formátu s nižší přesností, jako je INT8 nebo INT4. PTQ se snadno implementuje, ale může vést k větším poklesům přesnosti.

Quantization-Aware Training (QAT): S QAT je proces kvantování simulován během samotné trénovací fáze. To umožňuje modelu naučit se kompenzovat kvantizační chyby a minimalizovat degradaci přesnosti při nasazení konečného kvantovaného modelu. QAT je více zapojena, ale často přináší lepší výsledky ve srovnání s PTQ.

Pro praktickou aplikaci lze využít předem kvantované modely dostupné na platformách, jako je Objímání obličeje, který hostí řadu modelů optimalizovaných pomocí různých kvantizačních metod. Pokud je například požadován model kvantovaný pomocí Auto-GPTQ, uživatelé jej mohou snadno načíst pomocí knihovny transformátorů Hugging Face. Kromě toho lze ke kvantizaci modelu použít nástroje jako AutoGPTQ, které se hladce integrují s existujícími knihovnami a efektivně komprimují model.

Zde je příklad načtení předem kvantovaného modelu Llama-2-7b pomocí knihovny transformátorů Hugging Face:

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)

Pamatujte, že kvantizace může vyžadovat po kvantizaci jemné doladění nebo rychlé inženýrství pro udržení kvality modelu. Pro novou kvantizaci můžete přispět zpět do komunity tím, že své kvantované modely posunete na platformy, jako je Hugging Face.

Při výběru kvantizační strategie pro váš konkrétní případ použití vždy zajistěte rovnováhu mezi velikostí modelu, výpočetními požadavky a výkonem.

 

Algoritmus Flash Attention

Mechanismus pozornosti s více hlavami je základní složkou LLM založených na transformátoru a umožňuje modelu zachytit závislosti na dlouhé vzdálenosti a kontextualizované reprezentace. Tato operace pozornosti je však pro autoregresivní generování textu výpočetně neefektivní, protože vyžaduje přepočítání mnoha stejných hodnot pro každý nový token.

Projekt Algoritmus Flash Attention, představený v dokumentu FlashAttention, poskytuje paměťově efektivnější a paralelizaci vstřícnější přístup k operaci upozornění. Místo přepočítávání hodnot pozornosti pro každý token ukládá Flash Attention do mezipaměti a znovu používá mezilehlé matice klíč/hodnota, čímž se vyhne nadbytečným výpočtům.

Tato optimalizace nejen snižuje výpočetní režii, ale také zlepšuje vzorce přístupu k paměti, což vede k lepšímu využití šířky pásma paměti GPU a paralelismu.

Zatímco detaily Flash Attention jsou docela zapojené, hlavní myšlenkou je rozložit operaci pozornosti do dvou fází:

  1. Vkládání součtu předpony: Tato fáze počítá a ukládá do mezipaměti vložení klíč/hodnota pro všechny vstupní tokeny, což umožňuje efektivní opětovné použití během generování.
  2. Kauzální pozornost: Skutečná operace pozornosti, nyní optimalizovaná pro využití vložených klíčů/hodnot z mezipaměti z první fáze.

Oddělením těchto fází může Flash Attention využít výhod vysoce paralelních operací GPU, což výrazně urychlí zúžení pozornosti při vyvozování LLM.

Zde je stručná koncepční ilustrace implementace Flash Attention pomocí LLM:

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

Zatímco Flash Attention nabízí působivé zvýšení výkonu, funguje v rámci stávající architektury transformátoru. Abychom plně rozvinuli potenciál zrychleného vyvozování LLM, musíme prozkoumat architektonické inovace šité na míru právě pro tento úkol.

Prořezávání LLM

Prořezávání LLM je technika pro zmenšení velikosti modelu při zachování funkčnosti. Používá na datech závislý odhad důležitosti hmotnosti založený na aproximacích Hessovy matice. Při prořezávání jsou odstraněny méně důležité hmotnostní skupiny, poté je model doladěn, aby se obnovila přesnost. Balíček LLM-Pruner nabízí skripty pro prořezávání s různými podporovanými strategiemi. Prořezávání zahrnuje objevování závislostí, odhad skupinových příspěvků a fázi zotavení zahrnující krátké následné školení.

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

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)

Tento náčrt kódu představuje načtení předem trénovaného modelu LLaMa, nastavení prořezávače se specifickými konfiguracemi (jako které vrstvy se mají prořezávat a typ prořezávače), provedení procesu prořezávání a nakonec jemné doladění prořezávaného modelu.

Všimněte si, že pro skutečnou implementaci budete muset vyplnit podrobnosti, jako je název konkrétního modelu, cesty k datům a další parametry pro proces jemného ladění. Uvědomte si také, že tento kód je koncepční reprezentace a skutečná syntaxe se může lišit v závislosti na použité knihovně a verzích.

Architektonické inovace pro efektivní generování textu

Architektura transformátoru, i když je vysoce efektivní pro úlohy jazykového modelování, byla navržena jako univerzální model sekvencí sekvencí. Při nasazování LLM pro úlohy generování textu s dlouhými vstupními kontexty výzkumníci zjistili, že specializovanější architektury mohou výrazně zlepšit efektivitu odvození bez obětování kvality.

Zde jsou některé z klíčových architektonických inovací umožňující rychlejší vyvozování LLM:

alibi: Architektura Alibi, představená v dokumentu PAL-Instruction, odděluje modelování dlouhého vstupního kontextu od samotného procesu generování textu. K inicializaci procesu generování používá komprimovanou reprezentaci vstupního kontextu („alibi“), čímž se vyhne nutnosti zpracovávat celou vstupní sekvenci opakovaně během autoregresního generování.

Rotační vložky: Namísto použití standardních polohových vkládání využívá technika rotačního vkládání rotační matice k efektivnějšímu kódování pozičních informací. Ukázalo se, že tento přístup zlepšuje výkon a umožňuje zpracování delších vstupních sekvencí.

Multi-Query Attention (MQA): V tradiční pozornosti se každý výstupní token stará o celou vstupní sekvenci, což má za následek redundantní výpočty. MQA přeformuluje operaci pozornosti tak, aby sdílela výpočty napříč více výstupními tokeny, čímž snižuje celkovou složitost.

Vícedotazová pozornost

Vícedotazová pozornost

Grouped-Query-Attention (GQA): Na základě 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í požadavky při zachování vysoce kvalitního generování textu.

I když jsou tyto architektonické inovace stále v aktivním výzkumu a vývoji, prokázaly působivé zrychlení úloh LLM odvození, zejména v kombinaci s technikami, jako je Flash Attention a optimalizace s numerickou přesností.

Úvahy o nasazení v reálném světě

Kromě základních algoritmů a architektur existuje několik praktických úvah a kompromisů, kterými je třeba se orientovat při nasazování LLM do produkčního prostředí:

Hardwarová akcelerace: Zatímco CPU zvládnou vyvozování LLM, GPU a další akcelerátory, jako jsou TPU od Google, jsou nezbytné pro dosažení vysoké propustnosti a nízké latence. Rozhodující je výběr správného hardwaru a optimalizace využití paměti.

Dávkování a paralelismus: Pro plné využití hardwarového paralelismu mohou strategie jako dávkové vyvozování (zpracování více vstupů současně) a modelový paralelismus (distribuce LLM mezi více zařízení) výrazně zvýšit propustnost.

Kvantování vs. kompromis kvality: Stupeň kvantizace (8bitový, 4bitový atd.) přímo ovlivní rychlost odvození a využití paměti, ale také ovlivňuje kvalitu výstupu. Tento kompromis musí být pečlivě vyhodnocen pro každý případ použití.

Modelová destilace: Alternativa ke kvantizaci, modelové destilační techniky mohou komprimovat velké LLM na menší, efektivnější studentské modely při zachování vysoké přesnosti.

Ukládání do mezipaměti a optimalizované běhové prostředí: Optimalizované běhové prostředí pro hluboké učení, jako je TensorRT NVIDIA a rámce navržené pro poskytování LLM (např. sada MosaicML Composable Inference Suite), mohou poskytnout významné zvýšení výkonu pomocí technik, jako je fúze operátorů, optimalizace jádra a inteligentní strategie ukládání do mezipaměti.

Cesta k optimálnímu nasazení LLM často zahrnuje kombinaci více technik při pečlivém zvážení specifických požadavků vaší aplikace, omezení infrastruktury a výkonnostních cílů.

Proč investovat do čističky vzduchu?

Jak velké jazykové modely pokračují ve svém rychlém vývoji, zrychlení jejich inferenčního výkonu je stále důležitější pro umožnění aplikací v reálném světě a demokratizaci přístupu k těmto výkonným schopnostem umělé inteligence.

V této technické příručce jsme prozkoumali nejmodernější techniky zahrnující optimalizaci s numerickou přesností, nové algoritmy pozornosti, jako je Flash Attention, a architektonické inovace přizpůsobené pro efektivní generování textu. I když každý přístup nabízí své výhody, skutečná síla často spočívá v kombinování více strategií při procházení složitých kompromisů mezi rychlostí, využitím paměti a kvalitou výstupu.

Při pohledu do budoucna můžeme očekávat pokračující výzkum a vývoj v této oblasti, poháněný neukojitelnou poptávkou po schopnějších a dostupnějších LLM. Od hardwarové akcelerace a komprese modelu až po zcela nové architektury zůstává snaha o efektivní vyvozování LLM vzrušující hranicí ve světě zpracování přirozeného jazyka a umělé inteligence.

Posledních pět let jsem strávil ponořením se do fascinujícího světa strojového učení a hlubokého učení. Moje vášeň 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. Moje neustálá zvědavost mě také přivedla ke zpracování přirozeného jazyka, což je obor, který bych rád dále prozkoumal.