Modely a platformy AI
Optimalizace nasazení LLM: vLLM PagedAttention a budoucnost efektivní služby AI
Nasazení velkých jazykových modelů (LLM) v reálných aplikacích představuje jedinečné výzvy, zejména v oblasti výpočetních zdrojů, latence a nákladové efektivity. V tomto komplexním průvodci prozkoumáme oblast nasazení LLM, se zvláštním zaměřením na vLLM (vektorový jazykový model), řešení, které mění způsob, jakým nasazujeme a interagujeme s těmito mocnými modely.
Výzvy nasazení velkých jazykových modelů
Než se ponoříme do konkrétních řešení, prozkoumejme klíčové výzvy, které činí nasazení LLM složitým úkolem:
Výpočetní zdroje
LLM jsou proslulé svým enormním počtem parametrů, sahajícím od miliard do stovek miliard. Například GPT-3 má 175 miliard parametrů, zatímco novější modely, jako GPT-4, jsou odhadovány na ještě více. Tato velikost se překládá do významných výpočetních požadavků pro inferenci.
Příklad:
Zvažte relativně skromný LLM s 13 miliardami parametrů, jako je LLaMA-13B. I tento model vyžaduje:
– Přibližně 26 GB paměti pouze pro uložení modelových parametrů (při předpokladu 16bitové přesnosti)
– Další paměť pro aktivační funkce, mechanismy pozornosti a mezilehlé výpočty
– Významnou GPU výpočetní sílu pro reálnou inferenci
Latence
V mnoha aplikacích, jako jsou chatboty nebo generace obsahu v reálném čase, je nízká latence zásadní pro dobrý uživatelský zážitek. Nicméně, komplexita LLM může vést k významným časům zpracování, zejména pro delší sekvence.
Příklad:
Představte si chatbota zákaznické podpory poháněný LLM. Pokud každá odpověď trvá několik sekund na vygenerování, konverzace bude pro uživatele feel nepřirozená a frustrující.
Náklad
Hardwarový požadavky pro běh LLM v měřítku mohou být extrémně drahé. Vysokokapacitní GPU nebo TPU jsou často nezbytné, a spotřeba energie těchto systémů je podstatná.
Příklad:
Běh clusteru NVIDIA A100 GPU (často používaných pro inferenci LLM) může stát tisíce dolarů denně v cloudových výpočetních poplatcích.
Tradiční přístupy k nasazení LLM
Než prozkoumáme pokročilejší řešení, stručně zopakujme některé tradiční přístupy k nasazení LLM:
Jednoduché nasazení s Hugging Transformers
Knihovna Hugging Face Transformers poskytuje přímý způsob nasazení LLM, ale není optimalizována pro vysokovýkonné nasazení.
Příklad kódu:
“`python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_name = “meta-llama/Llama-2-13b-hf”
model = AutoModelForCausalLM.from_pretrained(model_name, device_map=”auto”)
tokenizer = AutoTokenizer.from_pretrained(model_name)
def generate_text(prompt, max_length=100):
inputs = tokenizer(prompt, return_tensors=”pt”).to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generate_text(“Budoucnost AI je”))
“`
Zatímco tento přístup funguje, není vhodný pro aplikace s vysokým provozem kvůli jeho neefektivnímu využití zdrojů a chybějícím optimalizacím pro nasazení.
Použití TorchServe nebo podobných frameworků
Frameworky, jako je TorchServe, poskytují robustnější nasazení, včetně vyrovnávání zátěže a verze modelu. Nicméně, tyto frameworky stále neřeší specifické výzvy nasazení LLM, jako je efektivní správa paměti pro velké modely.
Pochopení správy paměti v nasazení LLM
Efektivní správa paměti je kritická pro nasazení velkých jazykových modelů (LLM) kvůli rozsáhlým výpočetním zdrojům, které jsou vyžadovány. Následující obrázky ilustrují různé aspekty správy paměti, které jsou integrální pro optimalizaci výkonu LLM.
Segmentovaná vs. stránková paměť
Tyto dva diagramy porovnávají segmentovanou paměť a stránkovou paměť, běžně používané v operačních systémech (OS).
- Segmentovaná paměť: Tato technika rozděluje paměť do různých segmentů, každý odpovídající jinému programu nebo procesu. Například v kontextu nasazení LLM mohou být segmenty přiděleny různým komponentám modelu, jako je tokenizace, vkládání a mechanismy pozornosti. Každý segment může růst nebo se zmenšovat nezávisle, poskytující flexibilitu, ale potenciálně vedoucí k fragmentaci, pokud segmenty nejsou správně spravovány.
- Stránková paměť: Zde je paměť rozdělena do pevných velikostí stránek, které jsou mapovány na fyzickou paměť. Stránky lze vyměňovat, jak je třeba, umožňující efektivní využití paměti. V nasazení LLM může být toto zásadní pro správu velkých množství paměti vyžadovaných pro ukládání modelových vah a mezilehlých výpočtů.
Správa paměti v OS vs. vLLM
Tento obrázek kontrastuje tradiční správu paměti OS se spráavou paměti používanou ve vLLM.
- Správa paměti OS: V tradičních operačních systémech jsou procesy (například Proces A a Proces B) přiděleny stránky paměti (Stránka 0, Stránka 1, atd.) v fyzické paměti. Tento přidělování může vést k fragmentaci v průběhu času, jak procesy žádají a uvolňují paměť.
- Správa paměti vLLM: Framework vLLM používá Key-Value (KV) cache pro efektivní správu paměti. Žádosti (například Žádost A a Žádost B) jsou přiděleny bloky KV cache (KV Block 0, KV Block 1, atd.). Tento přístup pomáhá minimalizovat fragmentaci a optimalizuje využití paměti, umožňující rychlejší a efektivnější nasazení modelu.
Mechanismus pozornosti v LLM
Mechanismus pozornosti je základní komponentou transformerových modelů, které jsou běžně používány pro LLM. Tento diagram ilustruje vzorec pozornosti a jeho komponenty:
- Dotaz (Q): Nový token v dekodéračním kroku nebo poslední token, který model viděl.
- Klíč (K): Předchozí kontext, na který by se model měl zaměřit.
- Hodnota (V): Vážený součet nad předchozím kontextem.
Vzorec počítá skóre pozornosti tak, že bere skalární produkt dotazu s klíči, škáluje podle kořene z klíčové dimenze, aplikuje softmax funkci a nakonec bere skalární produkt s hodnotami. Tento proces umožňuje modelu soustředit se na relevantní části vstupní sekvence při generování každého tokenu.
Srovnání propustnosti
Tento obrázek představuje srovnání propustnosti mezi různými frameworky (HF, TGI a vLLM) pomocí modelů LLaMA na různých hardwarových konfiguracích.
- LLaMA-13B, A100-40GB: vLLM dosahuje 14x až 24x vyšší propustnosti než HuggingFace Transformers (HF) a 2,2x až 2,5x vyšší propustnosti než HuggingFace Text Generation Inference (TGI).
- LLaMA-7B, A10G: Podobné trendy jsou pozorovány, s vLLM, který výrazně překonává jak HF, tak TGI.
vLLM: Nová architektura nasazení LLM
vLLM, vyvinutý výzkumníky na UC Berkeley, představuje významný skok vpřed v technologii nasazení LLM. Prozkoumejme jeho klíčové funkce a inovace:
PagedAttention
V srdci vLLM leží PagedAttention, novela algoritmu pozornosti inspirovaná virtuální správou paměti v operačních systémech. Zde je, jak funguje:
– Partitionování Key-Value (KV) cache: Místo uložení celé KV cache kontinuálně v paměti, PagedAttention rozděluje ji do pevných velikostí bloků.
– Nekontinuální úložiště: Tyto bloky lze uložit nekontinuálně v paměti, umožňující flexibilnější správu paměti.
– Alokace na vyžádání: Bloky jsou přiděleny pouze tehdy, když jsou potřeba, snižují se tak plýtvání pamětí.
– Efektivní sdílení: Více sekvencí může sdílet bloky, umožňující optimalizace pro techniky, jako je paralelní vzorkování a beam search.
Ilustrace:
“`
Tradiční KV cache:
[Token 1 KV][Token 2 KV][Token 3 KV]…[Token N KV]
(Kontinuální alokace paměti)
PagedAttention KV cache:
[Block 1] -> Fyzická adresa A
[Block 2] -> Fyzická adresa C
[Block 3] -> Fyzická adresa B
…
(Nekontinuální alokace paměti)
“`
Tento přístup významně snižuje fragmentaci paměti a umožňuje mnohem efektivnější využití paměti GPU.
Kontinuální dávkování
vLLM implementuje kontinuální dávkování, které dynamicky zpracovává žádosti, jakmile dorazí, místo čekání na vytvoření pevných dávek. To vede k nižší latenci a vyšší propustnosti.
Příklad:
Představte si proud příchozích žádostí:
“`
Čas 0ms: Žádost A dorazí
Čas 10ms: Zahájení zpracování Žádosti A
Čas 15ms: Žádost B dorazí
Čas 20ms: Zahájení zpracování Žádosti B (paralelně s A)
Čas 25ms: Žádost C dorazí
…
“`
S kontinuálním dávkováním může vLLM začít zpracovávat každou žádost okamžitě, místo čekání na seskupení do předdefinovaných dávek.
Efektivní paralelní vzorkování
Pro aplikace, které vyžadují více výstupních vzorků na prompt (například kreativní asistenti pro psaní), vynikají schopnosti sdílení paměti vLLM. Může generovat více výstupů, zatímco sdílí KV cache pro společné prefixy.
Příklad kódu pomocí vLLM:
“`python
from vllm import LLM, SamplingParams
llm = LLM(model=”meta-llama/Llama-2-13b-hf”)
prompts = [“Budoucnost AI je”]
# Generujte 3 vzorky na prompt
sampling_params = SamplingParams(n=3, temperature=0.8, max_tokens=100)
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f”Prompt: {output.prompt}”)
for i, out in enumerate(output.outputs):
print(f”Vzorek {i + 1}: {out.text}”)
“`
Tento kód efektivně generuje více vzorků pro daný prompt, využívající optimalizací vLLM.
Testování výkonu vLLM
Abychom skutečně ocenili dopad vLLM, podívejme se na některé srovnání výkonu:
Srovnání propustnosti
Na základě poskytnutých informací vLLM výrazně překonává jiná řešení nasazení:
– Až 24x vyšší propustnost ve srovnání s Hugging Face Transformers
– 2,2x až 3,5x vyšší propustnost než Hugging Face Text Generation Inference (TGI)
Ilustrace:
“`
Propustnost (Tokeny za sekundu)
|
| ****
| ****
| ****
| **** ****
| **** **** ****
| **** **** ****
|————————
HF TGI vLLM
“`
Efektivní využití paměti
PagedAttention vLLM vede k téměř optimálnímu využití paměti:
– Pouze asi 4% plýtvání pamětí, ve srovnání s 60-80% v tradičních systémech
– Tato efektivita umožňuje nasazení větších modelů nebo zpracování více současných požadavků se stejným hardwarovým vybavením
Zahájení práce s vLLM
Teď, když jsme prozkoumali výhody vLLM, proberme proces nastavení a použití vLLM ve vašich projektech.
6.1 Instalace
Instalace vLLM je přímá pomocí pip:
“`python
!pip install vllm
“`
6.2 Základní použití pro offline inferenci
Zde je jednoduchý příklad použití vLLM pro offline generování textu:
“`python
from vllm import LLM, SamplingParams
# Inicializace modelu
llm = LLM(model=”meta-llama/Llama-2-13b-hf”)
# Příprava promptů
prompts = [
“Napište krátkou báseň o umělém inteligenci:”,
“Vysvětlete kvantové výpočty v jednoduchých termínech:”
]
# Nastavení parametrů vzorkování
sampling_params = SamplingParams(temperature=0.8, max_tokens=100)
# Generování odpovědí
outputs = llm.generate(prompts, sampling_params)
# Tisk výsledků
for output in outputs:
print(f”Prompt: {output.prompt}”)
print(f”Generovaný text: {output.outputs[0].text}\n”)
“`
Tento skript demonstruje, jak načíst model, nastavit parametry vzorkování a generovat text pro více promptů.
6.3 Nastavení serveru vLLM
Pro online nasazení poskytuje vLLM server kompatibilní s OpenAI API. Zde je, jak ho nastavit:
1. Spusťte server:
“`bash
python -m vllm.entrypoints.openai.api_server –model meta-llama/Llama-2-13b-hf
“`
2. Dotazujte server pomocí curl:
“`bash
curl http://localhost:8000/v1/completions \
-H “Content-Type: application/json” \
-d ‘{
“model”: “meta-llama/Llama-2-13b-hf”,
“prompt”: “Výhody umělé inteligence zahrnují:”,
“max_tokens”: 100,
“temperature”: 0.7
}’
“`
Toto nastavení umožňuje nasazení vašeho LLM se rozhraním kompatibilním s OpenAI API, což usnadňuje integraci do stávajících aplikací.
Pokročilá témata na vLLM
Zatímco vLLM nabízí významné zlepšení v nasazení LLM, existují další úvahy a pokročilá témata, která je třeba prozkoumat:
7.1 Kvantizace modelu
Pro ještě efektivnější nasazení, zejména na hardwaru s omezenou pamětí, lze použít techniky kvantizace. Zatímco vLLM samo o sobě nepodporuje kvantizaci, lze jej použít v kombinaci s kvantizovanými modely:
“`python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# Načtení kvantizovaného modelu
model_name = “meta-llama/Llama-2-13b-hf”
model = AutoModelForCausalLM.from_pretrained(model_name, device_map=”auto”, load_in_8bit=True)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# Použití kvantizovaného modelu s vLLM
from vllm import LLM
llm = LLM(model=model, tokenizer=tokenizer)
“`
7.2 Distribuované inferenci
Pro extrémně velké modely nebo aplikace s vysokým provozem může být nutné distribuované inferenci napříč více GPU nebo stroji. Zatímco vLLM samo o sobě nepodporuje distribuované inferenci, lze jej integrovat do distribuovaných systémů pomocí frameworků, jako je Ray:
“`python
import ray
from vllm import LLM
@ray.remote(num_gpus=1)
class DistributedLLM:
def __init__(self, model_name):
self.llm = LLM(model=model_name)
def generate(self, prompt, params):
return self.llm.generate(prompt, params)
# Inicializace distribuovaných LLM
llm1 = DistributedLLM.remote(“meta-llama/Llama-2-13b-hf”)
llm2 = DistributedLLM.remote(“meta-llama/Llama-2-13b-hf”)
# Použití v paralelním režimu
result1 = llm1.generate.remote(“Prompt 1”, sampling_params)
result2 = llm2.generate.remote(“Prompt 2”, sampling_params)
# Získání výsledků
print(ray.get([result1, result2]))
“`
7.3 Monitorování a sledovatelnost
Při nasazení LLM v produkčním prostředí je monitorování zásadní. Zatímco vLLM neposkytuje vestavěné monitorování, lze jej integrovat s nástroji, jako jsou Prometheus a Grafana:
“`python
from prometheus_client import start_http_server, Summary
from vllm import LLM
# Definice metrik
REQUEST_TIME = Summary(‘request_processing_seconds’, ‘Čas strávený zpracováním požadavku’)
# Inicializace vLLM
llm = LLM(model=”meta-llama/Llama-2-13b-hf”)
# Exponování metrik
start_http_server(8000)
# Použití modelu s monitorováním
@REQUEST_TIME.time()
def process_request(prompt):
return llm.generate(prompt)
# Váš serving loop zde
“`
Toto nastavení umožňuje sledovat metriky, jako je čas zpracování požadavku, které lze vizualizovat v dashboardu Grafana.
Závěr
Nasazení velkých jazykových modelů efektivně je složitý, ale zásadní úkol ve věku AI. vLLM, s jeho inovativním algoritmem PagedAttention a optimalizovanou implementací, představuje významný krok vpřed v tom, aby nasazení LLM bylo přístupnější a nákladově efektivní.
Snížením latence, zvýšením propustnosti a umožněním flexibilnějších možností nasazení otevírá vLLM nové možnosti pro integraci mocných jazykových modelů do širokého spektra aplikací. Bez ohledu na to, zda stavíte chatbota, systém generování obsahu nebo jakoukoli jinou aplikaci poháněnou NLP, pochopení a využití nástrojů, jako je vLLM, bude klíčem k úspěchu.
















