vLLMとは
vLLMはUCバークレーが開発した高速LLM推論・サービングライブラリで、2023年6月にオープンソースとして公開されました。HuggingFace Transformersと比べて最大24倍の推論スループット(単位時間あたりに処理できるトークン数)を達成するとの報告があり、本番環境でのLLMサービングのデファクトスタンダードになりつつあります。
なぜHuggingFace Transformersでは遅いのか
vLLMの高速化を理解するには、まずKVキャッシュとメモリの問題を知る必要があります。
LLMが文章を生成するとき、過去のすべてのトークンのKey・Value(KV)ベクトルを保持しておく必要があります。これをKVキャッシュと呼びます。コンテキストが長くなるほどKVキャッシュは大きくなります。
HuggingFace Transformersでは、各リクエストのKVキャッシュを事前に最大長分の連続したメモリ領域として確保します。たとえば最大コンテキスト2048トークンのモデルで100トークンしか生成しない場合でも、2048トークン分のメモリを占有します。これにより実際のGPUメモリの60〜80%が無駄になるという分析があります。
PagedAttentionの仕組み
PagedAttentionはOSのページングメモリ管理からヒントを得た仕組みです。
OSでは物理メモリを固定サイズの「ページ」に分割し、必要なページだけプロセスに割り当てます。不連続な物理メモリ上に論理的に連続したメモリ空間を作れるため、無駄を最小化できます。
PagedAttentionはこれをKVキャッシュに適用します。KVキャッシュをブロック(たとえば16トークン分)に分割し、使用する分だけ動的に確保します。メモリ断片化が抑えられるため、同じGPUメモリでより多くの並列リクエストを処理できます。
連続バッチ処理(Continuous Batching)
vLLMのもう一つの特徴が連続バッチ処理です。従来のバッチ推論では、バッチ内の全リクエストが完了するまで次のリクエストを受け付けませんでした。vLLMでは生成が終わったリクエストをリアルタイムでバッチから外し、新しいリクエストを挿入します。GPUの稼働率が上がり、平均的なレイテンシが低下します。
HuggingFace Transformersとの比較
両者の使い分けを整理します。
HuggingFace Transformers
研究・プロトタイプ向けに優れています。モデルの読み込み・ファインチューニング・評価がPythonで直感的に書けます。推論速度よりも柔軟性を優先する場合の選択です。
vLLM
本番サービング向けです。スループット重視の環境、多数の並列リクエストを処理するAPIサーバーの用途に向いています。OpenAI互換APIを標準搭載しており、既存コードの移行が楽です。
vLLMのデプロイ方法
OpenAI互換のAPIサーバーとして起動する基本的な方法です。
pip install vllm
# OpenAI互換サーバーとして起動
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3.1-8B-Instruct \
--port 8000 \
--max-model-len 8192
Pythonからの呼び出しはOpenAI SDKがそのまま使えます。
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="dummy"
)
response = client.chat.completions.create(
model="meta-llama/Llama-3.1-8B-Instruct",
messages=[{"role": "user", "content": "こんにちは"}]
)
print(response.choices[0].message.content)
テンソル並列処理でマルチGPU対応
大きなモデルを複数のGPUに分割して実行するテンソル並列処理もサポートしています。
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3.1-70B-Instruct \
--tensor-parallel-size 4 # 4枚のGPUに分割
70BモデルをA100 4枚で動かす、といった構成が比較的簡単に設定できます。
対応モデルの範囲
vLLMはLlama系だけでなく、Mistral・Qwen・Phi・Gemma・Falcon・MistralMoE(Mixtral)など主要なオープンウェイトモデルを幅広くサポートしています。特にHuggingFace Hubに登録されているモデルであればそのまま指定できます。
ビジョン(マルチモーダル)モデルへの対応も進んでおり、Llava・InternVLといった画像入力モデルも利用可能です。
まとめ
vLLMのPagedAttentionはOSのページングメモリ管理の発想をKVキャッシュに適用し、GPUメモリの利用効率を劇的に改善しました。連続バッチ処理との組み合わせで、HuggingFace Transformersに比べて大幅なスループット向上を実現しています。本番環境でLLMをAPIとして提供したい場合の第一候補として検討する価値があるツールです。