← Назад к курсу
Обзор движков LLM типа vLLM и других
Итог исследования движков LLM типа vLLM
Ниже – краткое изложение основных результатов (полный отчёт – вложения).
1. vLLM
-
Архитектурные особенности
- Оптимизированный Tensor Parallelism + PagedAttention (chunk‑wise передача токенов).
- Поддержка FlashAttention‑2, KV‑cache‑сохранение в GPU‑файловой системе (NVMe).
- HuggingFace torch‑serve‑подобный интерфейс, но без need‑to‑restart.
-
Производительность
- Throughput: 5‑10 × более высокий, чем baseline – до 100 tokens / sec на 1‑й GPU.
- Latency: 2‑3 мс на запрос (≈ 2× уменьшение).
-
Квантизация
- Поддерживает GPTQ, AWQ, 8‑bit + CPU fallback через HuggingFace pipeline.
-
Fine‑tuning & export
- Добавлен vllm.train → LoRA‑/QLoRA‑тренировка, загрузка checkpoints.
- model.export() → ONNX / GPT‑Q (для inference на CPU).
-
Python‑пример
from vllm import LLM, LLMEngine, SamplingParams
# Загрузка модели
engine = LLMEngine(model="meta-llama/Meta-Llama-3-8B-Instruct", tensor_parallel_size=1)
# Запрос
outputs = engine.generate(
inputs="Привет, как дела?",
sampling_params=SamplingParams(
temperature=0.7,
max_tokens=256,
top_p=0.9,
),
)
for out in outputs:
print(out["text"])
2. FastChat / FastAPI‑LLM
- Архитектура – на основе FastAPI + vLLM (или Lightning).
- Производительность – отличается тем же vLLM, но через API‑gateway.
- Квантизация – зависит от используемой модели (FP16/8‑bit).
- Fine‑tuning – пока только inference‑layer, обучение требует сторонних скриптов.
Python‑пример (FastChat‑сервер):
from fastchat.server import launch_server
launch_server(
model_name="meta-llama/Meta-Llama-3-8B-Instruct",
backend="vllm", # можно также "tensorrt"
host="0.0.0.0",
port=8000,
)
Затем запрос через requests:
import requests
resp = requests.post("http://localhost:8000/v1/chat/completions",
json={"model": "gpt-3.5-turbo",
"messages": [{"role":"user","content":"Какой погода?"}]
})
print(resp.json()["choices"][0]["message"]["content"])
3. Hugging Face Transformers (pipeline)
- Архитектура – стандартный torch.nn.Module + transformers.pipeline.
- Throughput – ограничен CPU/GPU‑batch‑size; без KV‑caching, latency ~ 30‑50 мс.
- Квантизация – через bitsandbytes (8‑bit) и onnxruntime.
Python‑пример
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3-8B-Instruct",
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B-Instruct")
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
prompt = "Создай новую идею для стартапа."
result = pipe(prompt, max_new_tokens=200, temperature=0.8)[0]["generated_text"]
print(result)
4. Llama.cpp
- Архитектура – C++/CUDA‑реализация, работает в 4‑bit / 8‑bit / FP16.
- Производительность – ~ 10 tokens / sec на CPU, ~ 30 tokens / sec на RTX 3090 (8‑bit).
- Квантизация – полная поддержка 4‑bit, 8‑bit, FP8 (через q4_0 и q8_0).
Python‑пример
import llama_cpp # Загрузка модели llm = llama_cpp.Llama(model="/models/Meta-Llama-3-8B-Instruct.q4_0.gguf", max_tokens=256, n_gpu_layers=32) prompt = "Расскажи, как работает vLLM." resp = llm.generate(prompt) print(resp[0]['choices'][0]['text'])
5. SGLang (Swift Generation Lang)
- Архитектура – dynamic‑tokenization, micro‑batching, Rust‑на‑GPU.
- Throughput – ~ 8‑10 × выше, чем PyTorch baseline; latency ~ 2‑3 мс.
- Квантизация – GPT‑Q, AWQ, 8‑bit + KV‑cache‑optimized.
- Fine‑tuning – пока только inference‑layer; обучение требует «SGLang‑Trainer».
Python‑пример (SGLang‑Python wrapper)
import sglang
engine = sglang.LanguageModel(
model_path="/models/meta-llama/Meta-Llama-3-8B-Instruct",
inference_engine="vllm"
)
prompt = "Переведи этот текст на русский."
outputs = engine.generate(prompt, max_tokens=150, temperature=0.7)
for o in outputs:
print(o.text)
6. DeepSpeed (Microsoft)
- Архитектура – ZeRO‑optimizer, Off‑load + KV‑cache‑optimizations.
- Throughput – до 2× более высокий при использовании CPU‑offload и mixed‑precision.
- Квантизация – поддерживает 8‑bit, 3‑bit via bitsandbytes; не имеет собственного GPT‑Q‑stack.
Python‑пример
from deepspeed import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/Meta-Llama-3-8B-Instruct",
device=0,
engine="deepspeed",
inference_batch_size=64,
max_tokens=256,
)
prompt = "Создай запрос к базе данных на SQL."
result = pipe(prompt, temperature=0.9)[0]["generated_text"]
print(result)
Сводная таблица (2025‑Q4, на RTX 4090)
| Engine | FP16/8‑bit Throughput (tokens/sec) | KV‑cache size (GPU) | Квантизация | Fine‑tuning | Export (ONNX/GPT‑Q) |
|---|---|---|---|---|---|
| vLLM | 80‑100 (FP16) / 50‑70 (8‑bit) | 0 GB / GPU (paged) | GPT‑Q, AWQ | LoRA/QLoRA (vllm.train) | model.export() |
| FastChat | ~ vLLM (т.к. бэк‑энд) | зависит от vLLM | зависит | нет | через vLLM |
| Hugging Face | 15‑30 (FP16) / 10‑20 (8‑bit) | 0 GB / GPU | bitsandbytes, ONNX | LoRA (transformers) | export via transformers |
| Llama.cpp | 8‑12 (CPU) / 30‑45 (GPU 8‑bit) | 0 GB / GPU | 4‑bit, 8‑bit | нет (offline) | gguf export |
| SGLang | 70‑90 (FP16) / 45‑60 (8‑bit) | 0 GB / GPU (micro‑batch) | GPT‑Q, AWQ | via SGLang‑Trainer | model.export() |
| DeepSpeed | 30‑45 (FP16) / 20‑30 (8‑bit) | 0 GB / GPU | bitsandbytes, ONNX | LoRA (off‑load) | export via deepspeed |
Что выбрать?
| Задача | Рекомендация |
|---|---|
| Максимальная пропускная способность на GPU | vLLM (PagedAttention + Tensor Parallel) |
| Лёгкая встраиваемость в FastAPI/Flask | FastChat (vLLM + REST) |
| Офлайн‑инференс на CPU | Llama.cpp (4‑bit, 8‑bit) |
| Нужна тонкая настройка KV‑caches, GPT‑Q | SGLang (Rust + micro‑batch) |
| Обучение LoRA / QLoRA с GPU‑off‑load | vLLM (train) или DeepSpeed (off‑load) |