← Назад к курсу

Обзор движков 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)