Hermes Agent Wiki 非公式・日本語wiki
この skill をそのまま使う: GitHub で原文を見る

英語原文・frontmatter 込みで、Hermes が読み込む実体そのままです(このページの本文は日本語版)。

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:8000

TTFT(最初のトークンが返るまでの時間)が < 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

症状: スループットが伸びない(&lt;50 req/sec)

同時に扱うシーケンス数を増やします:

vllm serve MODEL --max-num-seqs 512

nvidia-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