Serving Llms Vllm
目次
vLLM による高スループットな LLM 配信、OpenAI API、量子化を扱う skill です。
skill の情報
| 提供元 | 追加インストール — hermes skills install official/mlops/serving-llms-vllm で入れます |
| パス | optional-skills/mlops/inference/serving-llms-vllm |
| バージョン | 1.0.1 |
| 作者 | Orchestra Research |
| ライセンス | MIT |
| 依存関係 | vllm, torch, transformers |
| 対応プラットフォーム | linux, macos |
| タグ | vLLM, Inference Serving, PagedAttention, Continuous Batching, High Throughput, Production, OpenAI API, Quantization, Tensor Parallelism |
参考: SKILL.md 全文
vLLM - 高性能な LLM 配信
使いどころ
本番用の LLM API を立てるとき、推論のレイテンシやスループットを詰めるとき、限られた GPU メモリでモデルを動かすときに使います。OpenAI 互換のエンドポイント、量子化(GPTQ/AWQ/FP8)、テンソル並列に対応しています。
使い始める
vLLM は PagedAttention(ブロック単位の KV キャッシュ)と継続的バッチ処理(prefill と decode のリクエストを混ぜて流す仕組み)によって、素の transformers の 24 倍のスループットを出します。
インストール:
pip install vllmオフライン推論の基本形:
from vllm import LLM, SamplingParams
llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct")
sampling = SamplingParams(temperature=0.7, max_tokens=256)
outputs = llm.generate(["Explain quantum computing"], sampling)
print(outputs[0].outputs[0].text)OpenAI 互換サーバー:
vllm serve meta-llama/Meta-Llama-3-8B-Instruct
# Query with OpenAI SDK
python -c "
from openai import OpenAI
client = OpenAI(base_url='http://localhost:8000/v1', api_key='EMPTY')
print(client.chat.completions.create(
model='meta-llama/Meta-Llama-3-8B-Instruct',
messages=[{'role': 'user', 'content': 'Hello!'}]
).choices[0].message.content)
"よくある進め方
進め方 1: 本番 API の配置
次のチェックリストを写して、進み具合を追ってください:
Deployment Progress:
- [ ] Step 1: Configure server settings
- [ ] Step 2: Test with limited traffic
- [ ] Step 3: Enable monitoring
- [ ] Step 4: Deploy to production
- [ ] Step 5: Verify performance metrics手順 1: サーバーの設定を決める
モデルの規模に合わせて設定を選びます:
# For 7B-13B models on single GPU
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
--gpu-memory-utilization 0.9 \
--max-model-len 8192 \
--port 8000
# For 30B-70B models with tensor parallelism
vllm serve meta-llama/Meta-Llama-3-70B-Instruct \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.9 \
--quantization awq \
--port 8000
# For production with caching (Prometheus metrics are exposed
# automatically at /metrics on the API port)
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching \
--port 8000 \
--host 0.0.0.0手順 2: 少ないトラフィックで試す
本番に出す前に負荷試験をします:
# Install load testing tool
pip install locust
# Create test_load.py with sample requests
# Run: locust -f test_load.py --host http://localhost:8000TTFT(最初のトークンが返るまでの時間)が < 500ms、スループットが 100 req/sec を超えていることを確かめます。
手順 3: 監視を有効にする
vLLM は API のポート(既定では 8000)の /metrics で Prometheus 用の指標を公開します:
curl http://localhost:8000/metrics | grep vllm見ておきたい主な指標:
vllm:time_to_first_token_seconds- レイテンシvllm:num_requests_running- 処理中のリクエスト数vllm:gpu_cache_usage_perc- KV キャッシュの使用率
手順 4: 本番へ配置する
環境差をなくすため Docker を使います:
# Run vLLM in Docker
docker run --gpus all -p 8000:8000 \
vllm/vllm-openai:latest \
--model meta-llama/Meta-Llama-3-8B-Instruct \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching手順 5: 性能の数値を確認する
配置したものが目標を満たしているか確かめます:
- TTFT が < 500ms(短いプロンプトの場合)
- スループットが目標の req/sec を超えている
- GPU 使用率が 80% を超えている
- ログに OOM のエラーが出ていない
進め方 2: オフラインのバッチ推論
サーバーを立てずに大きなデータセットを処理する場合の進め方です。
次のチェックリストを写してください:
Batch Processing:
- [ ] Step 1: Prepare input data
- [ ] Step 2: Configure LLM engine
- [ ] Step 3: Run batch inference
- [ ] Step 4: Process results手順 1: 入力データを用意する
# Load prompts from file
prompts = []
with open("prompts.txt") as f:
prompts = [line.strip() for line in f]
print(f"Loaded {len(prompts)} prompts")手順 2: LLM エンジンを設定する
from vllm import LLM, SamplingParams
llm = LLM(
model="meta-llama/Meta-Llama-3-8B-Instruct",
tensor_parallel_size=2, # Use 2 GPUs
gpu_memory_utilization=0.9,
max_model_len=4096
)
sampling = SamplingParams(
temperature=0.7,
top_p=0.95,
max_tokens=512,
stop=["</s>", "\n\n"]
)手順 3: バッチ推論を走らせる
vLLM は効率よく処理するため、リクエストを自動でまとめます:
# Process all prompts in one call
outputs = llm.generate(prompts, sampling)
# vLLM handles batching internally
# No need to manually chunk prompts手順 4: 結果を処理する
# Extract generated text
results = []
for output in outputs:
prompt = output.prompt
generated = output.outputs[0].text
results.append({
"prompt": prompt,
"generated": generated,
"tokens": len(output.outputs[0].token_ids)
})
# Save to file
with open("results.jsonl", "w") as f:
for result in results:
f.write(json.dumps(result) + "\n")
print(f"Processed {len(results)} prompts")進め方 3: 量子化したモデルの配信
限られた GPU メモリに大きなモデルを収めます。
Quantization Setup:
- [ ] Step 1: Choose quantization method
- [ ] Step 2: Find or create quantized model
- [ ] Step 3: Launch with quantization flag
- [ ] Step 4: Verify accuracy手順 1: 量子化の方式を選ぶ
- AWQ: 70B 級のモデルに向いていて、精度の低下がわずかです
- GPTQ: 対応モデルが広く、圧縮率も良好です
- FP8: H100 の GPU でいちばん速く動きます
手順 2: 量子化済みモデルを探すか、自分で作る
HuggingFace にある量子化済みのモデルを使います:
# Search for AWQ models
# Example: TheBloke/Llama-2-70B-AWQ手順 3: 量子化のフラグを付けて起動する
# Using pre-quantized model
vllm serve TheBloke/Llama-2-70B-AWQ \
--quantization awq \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.95
# Results: 70B model in ~40GB VRAM手順 4: 精度を確かめる
出力が期待どおりの品質かを試します:
# Compare quantized vs non-quantized responses
# Verify task-specific performance unchanged他の選択肢との使い分け
vLLM が向いている場面:
- 本番用の LLM API を立てる(100 req/sec 以上)
- OpenAI 互換のエンドポイントを提供する
- GPU メモリは限られているが、大きなモデルを使いたい
- 複数の利用者が同時に使うアプリ(チャットボット、アシスタント)
- 低レイテンシと高スループットを両立させたい
別のものを使ったほうがよい場面:
- llama.cpp: CPU や端末側での推論、利用者が一人の場合
- HuggingFace transformers: 研究、試作、一度きりの生成
- TensorRT-LLM: NVIDIA 限定で、性能を極限まで引き出したい場合
- Text-Generation-Inference: すでに HuggingFace のエコシステムを使っている場合
よくあるつまずき
症状: モデルの読み込み中にメモリが足りなくなる
メモリの使用量を下げます:
vllm serve MODEL \
--gpu-memory-utilization 0.7 \
--max-model-len 4096または量子化を使います:
vllm serve MODEL --quantization awq症状: 最初のトークンが遅い(TTFT が 1 秒超)
同じプロンプトが繰り返されるなら prefix キャッシュを有効にします:
vllm serve MODEL --enable-prefix-caching長いプロンプトを扱うなら、prefill の分割を有効にします:
vllm serve MODEL --enable-chunked-prefill症状: モデルが見つからないというエラーが出る
独自のモデルでは --trust-remote-code を付けます:
vllm serve MODEL --trust-remote-code症状: スループットが伸びない(<50 req/sec)
同時に扱うシーケンス数を増やします:
vllm serve MODEL --max-num-seqs 512nvidia-smi で GPU の使用率を確認します。80% を超えているのが望ましい状態です。
症状: 推論が思ったより遅い
テンソル並列で使う GPU の数が 2 のべき乗になっているか確かめます:
vllm serve MODEL --tensor-parallel-size 4 # Not 3生成を速くするなら投機的デコードを有効にします(設定は JSON で渡します。--speculative-model は廃止され、--speculative-config に置き換わりました):
vllm serve MODEL \
--speculative-config '{"model": "DRAFT_MODEL", "num_speculative_tokens": 5, "method": "draft_model"}'さらに踏み込む
サーバー配置のパターン: Docker、Kubernetes、負荷分散の設定は references/server-deployment.md を見てください。
性能の最適化: PagedAttention の調整、継続的バッチ処理の詳細、ベンチマーク結果は references/optimization.md を見てください。
量子化の手引き: AWQ/GPTQ/FP8 の設定、モデルの準備、精度の比較は references/quantization.md を見てください。
困ったとき: エラーメッセージの詳細、切り分けの手順、性能の診断は references/troubleshooting.md を見てください。
必要なハードウェア
- 小さめのモデル (7B-13B): A10 (24GB) 1 枚、または A100 (40GB) 1 枚
- 中くらいのモデル (30B-40B): A100 (40GB) 2 枚をテンソル並列で
- 大きなモデル (70B 以上): A100 (40GB) 4 枚、または A100 (80GB) 2 枚。AWQ/GPTQ を使います
対応プラットフォーム: NVIDIA(主軸)、AMD ROCm、Intel GPU、TPU
関連リンク
- 公式ドキュメント: https://docs.vllm.ai
- GitHub: https://github.com/vllm-project/vllm
- 論文: "Efficient Memory Management for Large Language Model Serving with PagedAttention" (SOSP 2023)
- コミュニティ: https://discuss.vllm.ai