- AI ⚙️
vLLMとは|使い方・インストール・OpenAI互換APIとOllamaとの違い
結論
vLLMは、LLMをGPUで速く動かし、OpenAI互換のAPIとして配るオープンソースの推論サーバーです。多くの人が同時に使う場面に強い作りです。
この記事でわかること
- vllm serve の起動と主なオプション14個の早見表
- OpenAI SDK・curl が送るリクエストと401・404の実物
- エラー原文10種の直し方とKVキャッシュの計算
アプリは OpenAI の API と同じ形で vLLM に頼み、vLLM が多くの依頼をまとめて GPU で処理します。
flowchart TD
A[アプリ<br>OpenAI SDK・curl] -->|/v1/chat/completions| S[vllm serve<br>OpenAI互換API :8000]
S --> Q[スケジューラー<br>連続バッチング]
Q --> G[GPU<br>モデルの重み]
Q --> K[KVキャッシュ<br>PagedAttention]
よく使うコマンドと設定を先にまとめます。
| やりたいこと | コマンド・設定 | 補足 |
|---|---|---|
| 入れる | uv pip install vllm --torch-backend=auto |
Linux と NVIDIA GPU が基本 |
| APIサーバーを起動する | vllm serve Qwen/Qwen2.5-1.5B-Instruct |
既定のポートは 8000 |
| Python から呼ぶ | OpenAI(base_url="http://localhost:8000/v1") |
OpenAI SDK をそのまま使う |
| APIキーを付ける | --api-key token-abc123 |
/v1 などの道だけに効く |
| メモリ不足を避ける | --max-model-len 8192 |
文脈の長さを縮める |
| GPU を使う割合を変える | --gpu-memory-utilization 0.85 |
既定は 0.92 |
| GPU 2枚に分けて載せる | --tensor-parallel-size 2 |
1枚に入らないモデル向け |
| Docker で動かす | vllm/vllm-openai:latest |
--ipc=host を付ける |
確認環境:Ubuntu 24.04.4・Python 3.11.15・openai(Python SDK)3.24.0・curl 8.5.0・Starlette 1.0.0・uvicorn 0.46.0。vLLM は 0.32.0(PyPI で 2026年10月18日公開)を対象に、GitHub の v0.32.0 タグのソースと同梱ドキュメント、docs.vllm.ai で、要件・オプションの既定値・エラー文の原文を確かめました。OpenAI 互換 API の呼び方は、vLLM 0.32.0 の認証ミドルウェア(authenticate.py)をそのまま組み込んだ擬似サーバーを立て、OpenAI SDK と curl から実際に送られたリクエストを記録しています。PagedAttention・連続バッチング・KV キャッシュの量は、Python で書いた小さな計算で確かめました。Ollama・llama.cpp・TGI の値は各公式ドキュメントで確認しました(確認日 2026年10月22日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「vLLMとは|使い方・インストール・OpenAI互換APIとOllamaとの違い」
vLLMとは:LLMを速く配るための推論サーバー
この節では、vLLM が何をするソフトで、誰が作り、何に使うのかが分かります。
vLLM(ブイエルエルエム)は、大規模言語モデル(LLM)の推論(文章の生成)とサービングを、速く・少ないメモリで行うための Python のライブラリ兼サーバーです。 GitHub の README は "a fast and easy-to-use library for LLM inference and serving" と説明しています。カリフォルニア大学バークレー校の Sky Computing Lab で生まれ、今は2,000人を超える貢献者がいるオープンソースのプロジェクトです。ライセンスは Apache License 2.0 で、vLLM 自体は無料で使えます(動かすモデルのライセンスは別に確かめます)。
中心の仕組みは、OS の仮想メモリの考え方を LLM のメモリ管理に持ち込んだ PagedAttention です(後の節で詳しく見ます)。
1速い・たくさんさばける
PagedAttention と連続バッチングで、同時に多くの依頼を処理します。公式ブログ(2023年6月20日)は Hugging Face Transformers の最大24倍のスループットと報告しています。
2OpenAI 互換の API
vllm serve で /v1/chat/completions などが立ち上がります。OpenAI の SDK は base_url を変えるだけで使えます。
3Hugging Face のモデルをそのまま
README によれば200を超えるモデルの構造に対応し、Llama・Qwen・Gemma・Mistral などをモデル名だけで読み込みます。
vLLMでできること・使う場面
| 場面 | vLLM でやること | 使う機能 |
|---|---|---|
| 社内向けのチャット・RAG の土台 | 自社の GPU で LLM を API として配る | vllm serve・OpenAI 互換 API |
| 機密データを外に出したくない | 外部の API を使わず、社内でモデルを動かす | オープンウェイトのモデル |
| 大量の文書を一度に処理する | 数万件の要約・分類をまとめて流す | LLM クラス(オフライン推論) |
| 同時に多くの人が使うサービス | 依頼を詰めて処理し、待ち時間を減らす | 連続バッチング・プレフィックスキャッシュ |
| 大きなモデルを動かす | 複数の GPU に分けて載せる | --tensor-parallel-size |
Red Hat の解説は、vLLM が Hugging Face・LangChain・LlamaIndex・Docker・Kubernetes・KServe などと組み合わせて使えると紹介しています。OpenAI 互換の API なので、OpenAI 用に書かれたライブラリの多くは接続先を変えるだけでつながります。
読み方と、似た名前との見分け
「vLLM」は「ブイ・エル・エル・エム」と読みます。似た名前のものと混ざりやすいので、何を指すかを分けておきます。
| 名前 | 何か | vLLM との関係 |
|---|---|---|
| vLLM | LLM の推論・サービング用のエンジン | この記事の主題 |
| LLM | 大規模言語モデル(モデルそのもの) | vLLM が動かす対象 |
| VLM | 画像も扱える視覚言語モデル | vLLM が動かせるモデルの種類の1つ |
| vLLM-Metal | Apple シリコンの Mac 向けのプラグイン | 公式ドキュメントが案内する Mac 用の入口 |
vLLMが速い理由:PagedAttentionと連続バッチング
この節では、vLLM が他の作り方より多くの依頼をさばける2つの仕組みが分かります。
LLM は文章を1トークン(単語のかけら)ずつ作ります。そのたびに、それまでのトークンの計算結果(Key と Value)を KV キャッシュとして GPU のメモリに置いておき、次の計算で使い回します。LLM のサーバーの速さは、この KV キャッシュを GPU のメモリにどれだけ無駄なく詰められるかで大きく変わります。
PagedAttention:KVキャッシュをページに分けて置く
PagedAttention は、KV キャッシュを決まった大きさの「ブロック」に分け、ばらばらの場所に置けるようにする仕組みです。 公式ブログは "one can think of blocks as pages, tokens as bytes, and sequences as processes"(ブロックをページ、トークンをバイト、文章の列をプロセスと考える)と、OS の仮想メモリにたとえています。vLLM 0.32.0 のソースでは、ブロックの既定の大きさ(DEFAULT_BLOCK_SIZE)は16トークンです。
57トークンの依頼は、ブロック表を通して、空いている物理ブロック7・2・9・4にばらばらに置かれます(「16/16」は16トークン中いくつ使っているか)。
flowchart LR
R[依頼<br>57トークン] --> T[ブロック表]
T --> B1[物理7<br>16/16]
T --> B2[物理2<br>16/16]
T --> B3[物理9<br>16/16]
T --> B4[物理4<br>9/16]
従来のやり方は、依頼ごとに「最大でこれだけ使うかもしれない」長さを先に連続で確保していました。公式ブログは、従来のシステムは断片化と確保しすぎでメモリの60〜80%を無駄にしていて、PagedAttention では無駄が4%未満になったと報告しています。
考え方を確かめるため、Python で小さな計算をしました(GPU は使わない仮の数字です)。KV キャッシュに置ける量を16,384トークン分とし、入力100〜800・出力30〜600トークンの依頼を、出力の上限1,024トークンで順に載せています。
import math, random
random.seed(300)
BLOCK = 16 # vLLM の既定のブロックサイズ(トークン数)
CAPACITY = 16384 # KV キャッシュに置けるトークン数(仮の値)
MAX_TOKENS = 1024 # 1リクエストが出してよい最大のトークン数
reqs = [(random.randint(100, 800), random.randint(30, 600)) for _ in range(200)]
def fit(reserve):
used = n = 0
for p, o in reqs:
r = reserve(p, o)
if used + r > CAPACITY:
break
used += r; n += 1
real = sum(p + o for p, o in reqs[:n])
return n, used, real
for name, f in [
("最大長を先に連続で確保", lambda p, o: p + MAX_TOKENS),
("16トークンのブロックを必要な分だけ", lambda p, o: math.ceil((p + o) / BLOCK) * BLOCK),
]:
n, used, real = fit(f)
print(f"{name}: 同時 {n} 件 / 確保 {used:,} / 実際に使用 {real:,} / 無駄 {1-real/used:.1%}")
最大長を先に連続で確保: 同時 10 件 / 確保 15,553 / 実際に使用 8,304 / 無駄 46.6%
16トークンのブロックを必要な分だけ: 同時 22 件 / 確保 16,352 / 実際に使用 16,156 / 無駄 1.2%
同じメモリに載る依頼の数が増えると、1回の GPU の計算でまとめて処理できる数が増え、スループット(時間あたりの処理量)が上がります。 ブロック単位にすると、同じ文章で始まる依頼どうしでブロックを共有することもできます。vLLM ではこれがプレフィックスキャッシュ(enable_prefix_caching。0.32.0 の既定は有効)として使われ、同じシステムプロンプトを毎回送る使い方で計算を省けます。
連続バッチング:空いた席にすぐ次を入れる
連続バッチング(continuous batching)は、1トークン作るたびに、終わった依頼を外して待っている依頼を入れるやり方です。 静的なバッチングは、まとめた依頼が全部終わるまで次を入れません。Red Hat の解説は、各反復で終わった文章を新しい依頼に入れ替えることで、スループット・待ち時間・GPU の使用率がよくなると説明しています。
出力の長さが 120・15・30・200・25・40・10・60 トークンの8件を、同時に4件まで処理する条件で数えました(1ステップで各依頼が1トークン進む仮定)。
| やり方 | 全部終わるまで | 終わるまでの平均 | 10トークンの依頼(7件目)が終わる時刻 |
|---|---|---|---|
| 静的バッチング | 260 ステップ | 162.5 ステップ | 210 ステップ目 |
| 連続バッチング | 200 ステップ | 79.4 ステップ | 50 ステップ目 |
短い依頼が長い依頼の後ろで待たされるか
8件・同時4件の条件で数えた結果。平均の終わる時刻は162.5から79.4ステップに縮んだ
vLLM では、1回にまとめる依頼の数を --max-num-seqs、1回に処理するトークンの数を --max-num-batched-tokens で決めます。0.32.0 のソースでは、OpenAI 互換サーバーの既定は、メモリ70GiB未満の GPU で max_num_seqs 256・max_num_batched_tokens 2,048 でした。H100 のような70GiB以上の GPU(A100 を除く)では 1,024・8,192 に上がります。
論文(Kwon ほか「Efficient Memory Management for Large Language Model Serving with PagedAttention」、SOSP 2023)が元になっていて、README でも PagedAttention と連続バッチング・チャンク化したプレフィル・プレフィックスキャッシュが速さの理由として挙がっています。
vLLMの動作環境:GPU・OS・Pythonの要件
この節では、自分のパソコンやサーバーで vLLM が動くかどうかが分かります。
vLLM は Linux と GPU で動かすのが基本です。Windows はそのままでは動かず、WSL を使います。 vLLM 0.32.0 の同梱ドキュメントと PyPI の情報で確かめた要件です(2026年10月22日時点)。
| 項目 | 要件 | 補足 |
|---|---|---|
| OS | Linux | Windows は WSL。Mac は vLLM-Metal |
| Python | 3.11〜3.14 | PyPI の requires-python は >=3.11,<3.15 |
| NVIDIA GPU | Compute Capability 7.5 以上 | T4・RTX 20xx・A100・L4・H100・B200 など |
| CUDA | 既定のビルドは CUDA 12.9 | 12.8・13.0 向けも提供。Blackwell は 12.8 以上 |
| AMD GPU | ROCm 7.0 と Python 3.12 | MI200・MI300・Radeon RX 7900 など |
| CPU だけ | x86(AVX512 推奨・AVX2 は機能が限られる)・ARM | 0.17.0 から x86 用の CPU 版の wheel がある |
| Google TPU | vllm-tpu パッケージ |
別のドキュメントで案内 |
| Apple シリコン | vLLM-Metal(MLX を使うプラグイン) | macOS Sonoma 以降 |
GPU の Compute Capability(世代を表す番号)は、NVIDIA の一覧か nvidia-smi --query-gpu=name,compute_cap --format=csv で調べられます。
Windows・Mac・CPUだけで使えるか
| 環境 | 使えるか | 方法 |
|---|---|---|
| Windows | そのままでは動かない | WSL2 の Ubuntu に入れる。公式は "vLLM does not support Windows natively" と書いている |
| Mac(Apple シリコン) | プラグインで使える | vLLM-Metal。モデルは mlx-community の MLX 用のものを使う |
| Mac(CPU 版) | 使える | ドキュメントの CPU の「Apple silicon」の手順 |
| GPU の無い Linux | 使えるが遅い | CPU 版の wheel。FP32・FP16・BF16 に対応 |
| T4 の GPU(クラウドで多い) | 使える | T4 は Compute Capability 7.5 で要件を満たす。bfloat16 は使えない |
GPU が無いパソコンで手軽に試すなら、llama.cpp や Ollama のほうが向いています。 違いは後の「Ollama・llama.cpp・TGIとの違い」の節で比べます。
vLLMのインストール(uv・pip・Docker)
この節では、vLLM を入れて、動くことを確かめるまでの手順が分かります。
GPU とドライバーを確かめる
nvidia-smi で GPU の名前・メモリ・ドライバーの版が出ることを確かめます。出なければ、先に NVIDIA のドライバーを入れます。
Python の仮想環境を作る
公式ドキュメントは uv を勧めています。uv venv --python 3.12 --seed で作り、source .venv/bin/activate で有効にします。
vLLM を入れる
uv pip install vllm --torch-backend=auto で、ドライバーに合う PyTorch も一緒に選ばれます。PyPI の 0.32.0 の wheel は x86_64 用で約326MB あり、PyTorch などの依存も加わります。
カーネルを先に入れておく
vllm download-kernels で FlashInfer のビルド済みカーネルを入れます。入れないと、起動時にダウンロードとコンパイルが走り、Hopper 以降の GPU では数分かかると書かれています。
小さなモデルで起動して確かめる
vllm serve Qwen/Qwen2.5-1.5B-Instruct で起動し、別の端末から curl http://localhost:8000/v1/models を呼びます。
コマンドをまとめると次のとおりです(公式のクイックスタートのとおり)。
# uv で入れる(推奨)
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto
vllm download-kernels
# pip で入れる場合
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu129
vllm download-kernels
--torch-backend=auto は、uv が入っている CUDA ドライバーの版を見て、合う PyTorch の配布元を選ぶ指定です。cu126 のように決め打ちもできます。環境を作らずに一度だけ試すなら uv run --with vllm vllm --help も使えます。
Dockerで動かす
公式の Docker イメージは vllm/vllm-openai です。ホストに NVIDIA Container Toolkit が要ります。
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HF_TOKEN=$HF_TOKEN" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model Qwen/Qwen3-0.6B
| 指定 | 意味 |
|---|---|
--gpus all |
ホストの GPU をコンテナに渡す |
-v ~/.cache/huggingface:... |
ダウンロードしたモデルを残し、次の起動で使い回す |
--env "HF_TOKEN=$HF_TOKEN" |
利用の承認が要るモデル(Llama など)を取るためのトークン |
--ipc=host |
共有メモリを使えるようにする。代わりに --shm-size でもよい |
| イメージ名の後ろ | vllm serve に渡すオプションをそのまま書く |
vllm serveの使い方:OpenAI互換APIサーバーを起動する
この節では、vLLM をサーバーとして起動し、どの URL で何が呼べるかが分かります。
vllm serve モデル名 で、OpenAI の API と同じ形のサーバーが http://localhost:8000 に立ち上がります。 モデル名は Hugging Face のリポジトリ名(Qwen/Qwen2.5-1.5B-Instruct など)か、手元のフォルダのパスです。
vllm serve Qwen/Qwen2.5-1.5B-Instruct \
--api-key token-abc123 \
--max-model-len 8192 \
--gpu-memory-utilization 0.85
起動したら、モデルの一覧で動いていることを確かめます。
curl http://localhost:8000/v1/models -H "Authorization: Bearer token-abc123"
使えるエンドポイント
0.32.0 の同梱ドキュメントに載っている主な道(エンドポイント)です。
| 道 | 何をするか | 使えるモデル |
|---|---|---|
/v1/chat/completions |
チャット形式で文章を作る | チャットテンプレートを持つ生成モデル |
/v1/completions |
続きの文章を作る | 生成モデル(suffix は使えない) |
/v1/responses |
OpenAI の Responses API と同じ形 | 生成モデル |
/v1/models |
配っているモデルの一覧 | すべて |
/v1/embeddings |
文章をベクトルにする | 埋め込みモデル |
/v1/messages |
Anthropic の Messages API と同じ形 | 生成モデル |
/v1/audio/transcriptions |
音声を文字にする | 音声認識モデル |
/health |
サーバーが動いているかを返す | すべて |
1つのサーバーが配るモデルは1つです。 公式の FAQ は、複数のモデルを1つのポートで配ることは今はできないので、モデルごとにサーバーを立て、前に振り分けの層を置くと答えています。
vllmのサブコマンド
| コマンド | 何をするか |
|---|---|
vllm serve |
OpenAI 互換の API サーバーを起動する |
vllm chat |
起動中のサーバーと端末で会話する(--quick "hi" で1回だけ) |
vllm complete |
起動中のサーバーで文章の続きを作る |
vllm bench |
速さを測る |
vllm run-batch |
ファイルにまとめた依頼を一括で処理する |
vllm collect-env |
環境の情報を集める(不具合の報告に使う) |
vllm download-kernels |
ビルド済みのカーネルを入れる |
オプションの説明は vllm serve --help=max-num-seqs のように1つずつ、--help=max のように言葉で探す、--help=all で全部、の3通りで見られます。
OpenAI互換APIの呼び方:curl・Python・ストリーミング
この節では、アプリから vLLM を呼ぶコードと、そのとき実際に送られる中身が分かります。
OpenAI の SDK は、base_url を vLLM のサーバーに向け、model に vLLM で起動したモデル名を書けば、そのまま使えます。 vLLM を --api-key なしで起動した場合、公式の例のように api_key="EMPTY" のような任意の文字列で通ります。
curl で呼ぶ
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer token-abc123" \
-d '{
"model": "Qwen/Qwen2.5-1.5B-Instruct",
"messages": [{"role": "user", "content": "vLLMとは?"}],
"max_tokens": 64,
"temperature": 0.7
}'
Python(OpenAI SDK)で呼ぶ
from openai import OpenAI, NotFoundError, AuthenticationError
client = OpenAI(base_url="http://127.0.0.1:30001/v1", api_key="token-abc123")
# 1. 普通に呼ぶ
r = client.chat.completions.create(
model="Qwen/Qwen2.5-1.5B-Instruct",
messages=[{"role": "system", "content": "日本語で短く答える。"},
{"role": "user", "content": "vLLMとは?"}],
max_tokens=128, temperature=0.7,
extra_body={"top_k": 20, "repetition_penalty": 1.05}, # vLLM 独自の引数
extra_headers={"X-Request-Id": "faq-0001"},
)
print(r.choices[0].message.content, r.usage.total_tokens)
# 2. ストリーミング
for chunk in client.chat.completions.create(
model="Qwen/Qwen2.5-1.5B-Instruct",
messages=[{"role": "user", "content": "こんにちは"}], stream=True):
print(repr(chunk.choices[0].delta.content), end=" ")
print()
# 3. モデル名の間違い・キーの間違い
try:
client.chat.completions.create(model="qwen2.5", messages=[{"role": "user", "content": "hi"}])
except NotFoundError as e:
print("NotFoundError:", e)
try:
OpenAI(base_url="http://127.0.0.1:30001/v1", api_key="EMPTY").models.list()
except AuthenticationError as e:
print("AuthenticationError:", e)
top_k や repetition_penalty は OpenAI の API には無い、vLLM 独自の引数です。SDK では extra_body に入れます。X-Request-Id ヘッダーは、vLLM を --enable-request-id-headers 付きで起動すると使えます。
実際に送られたリクエスト(擬似サーバーで記録)
上のコードを、ポート 30001 で待つ擬似サーバーに向けて実行しました。擬似サーバーは推論をせず固定の文を返しますが、認証の部分は vLLM 0.32.0 の authenticate.py をそのまま組み込み、届いたリクエストを記録しています。
(擬似サーバーの固定の返事) 29
'' '(擬似サーバーの固定の返事)' None
NotFoundError: Error code: 404 - {'error': {'message': 'The model `qwen2.5` does not exist. Valid aliases: Qwen/Qwen2.5-1.5B-Instruct.', 'type': 'NotFoundError', 'param': 'model', 'code': 404}}
AuthenticationError: Error code: 401 - {'error': 'Unauthorized'}
1つ目の呼び出しで、サーバーに届いた中身です。
{
"method": "POST",
"path": "/v1/chat/completions",
"headers": {
"authorization": "Bearer token-abc123",
"accept": "application/json",
"content-type": "application/json",
"user-agent": "OpenAI/Python 3.24.0",
"x-stainless-lang": "python",
"x-stainless-package-version": "3.24.0",
"x-request-id": "faq-0001"
},
"body": {
"model": "Qwen/Qwen2.5-1.5B-Instruct",
"messages": [
{"role": "system", "content": "日本語で短く答える。"},
{"role": "user", "content": "vLLMとは?"}
],
"max_tokens": 128,
"temperature": 0.7,
"top_k": 20,
"repetition_penalty": 1.05
}
}
記録から分かったことです。
extra_bodyの中身は、JSON の一番上の階層にそのまま混ざって送られます。top_kとrepetition_penaltyがmodelと同じ並びに入っています。vLLM はこれを独自の引数として受け取ります。- APIキーは
Authorization: Bearer token-abc123として送られます。OpenAI 本家に送るときと同じ形です。 - ストリーミング(
stream=True)では、本文に"stream": trueが足されるだけで、道は同じ/v1/chat/completionsでした。 - キーが違う呼び出しは、401 を返した認証の層で止まり、アプリ側の記録には残りませんでした。 擬似サーバーが記録したのは3件(普通・ストリーミング・モデル名の間違い)だけです。
ストリーミングの応答の形
curl に -N を付けて、"stream": true で呼んだときの擬似サーバーの応答です。Server-Sent Events(data: で始まる行)で少しずつ届き、最後に data: [DONE] が来ます。
data: {"id": "chatcmpl-a55132a3612445f3", "object": "chat.completion.chunk", "created": 1792661715, "model": "Qwen/Qwen2.5-1.5B-Instruct", "choices": [{"index": 0, "delta": {"role": "assistant", "content": ""}, "finish_reason": null}]}
data: {"id": "chatcmpl-a55132a3612445f3", "object": "chat.completion.chunk", "created": 1792661715, "model": "Qwen/Qwen2.5-1.5B-Instruct", "choices": [{"index": 0, "delta": {"content": "(擬似サーバーの固定の返事)"}, "finish_reason": null}]}
data: {"id": "chatcmpl-a55132a3612445f3", "object": "chat.completion.chunk", "created": 1792661715, "model": "Qwen/Qwen2.5-1.5B-Instruct", "choices": [{"index": 0, "delta": {}, "finish_reason": "stop"}]}
data: [DONE]
認証の動き(vLLM 0.32.0 の認証ミドルウェア)
--api-key を付けて起動したときの動きを、curl で確かめました。
$ curl -i http://127.0.0.1:30001/health
HTTP/1.1 200 OK
$ curl -i http://127.0.0.1:30001/v1/models
HTTP/1.1 401 Unauthorized
content-length: 24
content-type: application/json
{"error":"Unauthorized"}
| 呼び方 | 結果 |
|---|---|
/health をキーなしで |
200(認証の対象外) |
/v1/models をキーなしで |
401 {"error":"Unauthorized"} |
/v1/models に Bearer wrong |
401 {"error":"Unauthorized"} |
/v1/models に正しいキー |
200 とモデルの一覧 |
ソースでは、キーを確かめる道は /v1・/v2・/inference・/cohere で始まるものだけ(GUARDED_PREFIX)で、OPTIONS のリクエストも通します。キーはハッシュにしてから比べています。--api-key は「一部の道の入口の鍵」で、サーバー全体の守りではありません。 公開するときの守り方は「vLLMを安全に公開する」の節で扱います。
モデル名を合わせる:--served-model-name
model に書く名前は、vllm serve に渡した名前と一字一句同じにします。違うと、上の 404(The model ... does not exist. Valid aliases: ...)になります。長いリポジトリ名を短くしたいときは --served-model-name qwen を付けると、"model": "qwen" で呼べます。
既存のアプリが OpenAI のモデル名を決め打ちしている場合も、--served-model-name で同じ名前を付ければ、アプリのコードを変えずに向け先だけを vLLM に変えられます。
OpenAI の SDK の使い方は、関連記事「OpenAI API Python入門|Responses APIのコピペ集」で扱っています。外部の多くのモデルを1つの API キーで切り替える使い方は、関連記事「OpenRouterとは|使い方・APIキー・無料モデル・料金とコード例」で扱っています。
vllm serveの主なオプション早見表
この節では、起動するときに指定することが多いオプションと、0.32.0 での既定値が分かります。
既定値は v0.32.0 のソース(vllm/config/ と vllm/engine/arg_utils.py、vllm/entrypoints/launchers/cli_args.py)で確かめた値です。
| オプション | 何を決めるか | 既定値 | 変えるとき |
|---|---|---|---|
--host・--port |
待ち受けるアドレスとポート | 指定なし・8000 | 他のサービスとぶつかる |
--api-key |
求める API キー(複数可) | なし | 社内に公開する |
--served-model-name |
API で使うモデルの名前 | モデルのパス | 名前を短くする |
--max-model-len |
1件の入力+出力の最大トークン数 | モデルの config.json から | メモリが足りない |
--gpu-memory-utilization |
GPU メモリのうち vLLM が使う割合 | 0.92 | 他のプロセスと GPU を分ける |
--tensor-parallel-size |
モデルを分けて載せる GPU の数 | 1 | 1枚に入らない |
--pipeline-parallel-size |
層ごとに分ける段数(ノードをまたぐ) | 1 | 複数のサーバーで動かす |
--max-num-seqs |
1回にまとめる依頼の最大数 | GPU のメモリで変わる(256 など) | メモリ不足・遅延を抑える |
--max-num-batched-tokens |
1回に処理するトークンの最大数 | GPU のメモリで変わる(2048 など) | スループットと遅延の調整 |
--dtype |
重みと計算の型 | auto | bfloat16 に対応しない GPU(T4 など)で half にする |
--quantization |
量子化の方式 | なし(モデルから判断) | 量子化モデルを使う |
--kv-cache-dtype |
KV キャッシュの型 | auto | fp8 で KV キャッシュを減らす |
--enforce-eager |
CUDA グラフを使わない | 無効 | メモリを減らす・エラーの切り分け |
--enable-auto-tool-choice |
ツール呼び出しを有効にする | 無効 | Function Calling を使う(--tool-call-parser と組で使う) |
そのほか、よく使うものです。
--generation-config vllm:既定では、モデルのgeneration_config.jsonにある推奨値(temperature など)が使われます。vLLM の中立な既定値に戻すときに付けます。v0.8.0 で既定の出どころが変わりました。--chat-template:モデルのトークナイザーに入っていないチャットテンプレートを、ファイルで渡します。--trust-remote-code:モデルのリポジトリにある Python のコードを実行して読み込みます。中身を確かめたモデルだけに付けます。--download-dir:モデルを置く場所。既定では Hugging Face のキャッシュ(~/.cache/huggingface)です。--enable-lora:LoRA(追加学習した差分)を読み込めるようにします。
--max-model-len などの整数には 8k・32K のような書き方が使えます。 ドキュメントでは、小文字の k は1,000倍(8k=8,000)、大文字の K は1,024倍(32K=32,768)です。0.32.0 のソースでは --max-model-len auto(または -1)で、GPU のメモリに入る最大の長さを自動で選びます。
vLLMに必要なGPUメモリ:KVキャッシュの計算
この節では、あるモデルを動かすのに GPU のメモリがどれだけ要るかを、自分で見積もる方法が分かります。
GPU のメモリは「モデルの重み」と「KV キャッシュ」でほとんどが埋まります。 重みは、16ビット(bfloat16)なら「パラメーター数×2バイト」です。KV キャッシュは、1トークンあたり「2(Key と Value)×層の数×KV ヘッドの数×ヘッドの次元×2バイト」で、文脈が長いほど、同時の依頼が多いほど増えます。
モデルの config.json の値から計算しました。
GiB = 1024 ** 3
def kv_per_token(layers, kv_heads, head_dim, dtype_bytes=2):
return 2 * layers * kv_heads * head_dim * dtype_bytes # 2 = Key と Value
models = {
# 名前: (層の数, KVヘッド数, head_dim, パラメーター数, 既定の max_model_len)
"Qwen2.5-1.5B-Instruct": (28, 2, 1536 // 12, 1.54e9, 32768),
"Qwen3-8B": (36, 8, 128, 8.2e9, 40960),
}
for name, (L, H, D, P, ctx) in models.items():
t = kv_per_token(L, H, D)
print(f"[{name}]")
print(f" KV/トークン : {t:,} バイト ({t/1024:.0f} KiB)")
for n in sorted({2048, 8192, 32768, ctx}):
print(f" 1リクエスト {n:>6,} トークン: {t*n/GiB:6.3f} GiB")
print(f" 重み(bf16) : {P*2/GiB:6.2f} GiB")
print("\n[Qwen3-8B を 24 GiB の GPU 1枚で動かす目安]")
L, H, D, P, ctx = models["Qwen3-8B"]
t = kv_per_token(L, H, D)
for util in (0.92, 0.85):
budget = 24 * GiB * util
kv = budget - P * 2
print(f" util={util}: 使える {budget/GiB:5.2f} GiB - 重み {P*2/GiB:5.2f} = 残り {kv/GiB:4.2f} GiB"
f" → {kv//t:,.0f} トークン分(40,960トークンの会話 {kv/(t*ctx):.2f} 本分)")
[Qwen2.5-1.5B-Instruct]
KV/トークン : 28,672 バイト (28 KiB)
1リクエスト 2,048 トークン: 0.055 GiB
1リクエスト 8,192 トークン: 0.219 GiB
1リクエスト 32,768 トークン: 0.875 GiB
重み(bf16) : 2.87 GiB
[Qwen3-8B]
KV/トークン : 147,456 バイト (144 KiB)
1リクエスト 2,048 トークン: 0.281 GiB
1リクエスト 8,192 トークン: 1.125 GiB
1リクエスト 32,768 トークン: 4.500 GiB
1リクエスト 40,960 トークン: 5.625 GiB
重み(bf16) : 15.27 GiB
[Qwen3-8B を 24 GiB の GPU 1枚で動かす目安]
util=0.92: 使える 22.08 GiB - 重み 15.27 = 残り 6.81 GiB → 49,562 トークン分(40,960トークンの会話 1.21 本分)
util=0.85: 使える 20.40 GiB - 重み 15.27 = 残り 5.13 GiB → 37,328 トークン分(40,960トークンの会話 0.91 本分)
層の数・KV ヘッドの数・ヘッドの次元は、各モデルの config.json(Qwen2.5-1.5B-Instruct は 28・2・128、Qwen3-8B は 36・8・128)、パラメーター数はモデルカード(1.54B・8.2B)の値です。実際には、計算の途中の値や CUDA グラフにもメモリを使うので、残りはこの計算より少なくなります。
読み取れることです。
- Qwen3-8B は、config.json の
max_position_embeddingsが 40,960 なので、何も指定しないと1件で 5.625 GiB の KV キャッシュを前提にします。 24 GiB の GPU で--gpu-memory-utilization 0.85にすると、計算上1件分も入りません。これが後で見る「To serve at least one request with the model's max seq len」のエラーです。 --max-model-len 8192にすると、1件分は 1.125 GiB で、残りの 6.81 GiB に6件分が入ります。長い文脈が要らない用途なら、--max-model-lenを縮めるのがいちばん効きます。- KV ヘッドが少ないモデル(Qwen2.5-1.5B は2個)は、1トークンあたりの KV キャッシュが小さくなります(GQA という作り)。
モデルの大きさとGPUの目安
重み(16ビット)の大きさを「パラメーター数×2バイト」で計算した表です。KV キャッシュ用に、これより余裕のある GPU が要ります。
| モデルの大きさ | 重み(16ビット) | 重み(4ビット量子化の目安) | 構成の例 |
|---|---|---|---|
| 1.5B | 約2.8 GiB | 約0.7 GiB | 8GB の GPU 1枚 |
| 8B | 約14.9 GiB | 約3.7 GiB | 24GB の GPU 1枚 |
| 14B | 約26.1 GiB | 約6.5 GiB | 40GB 以上の GPU、または 24GB×2枚で --tensor-parallel-size 2 |
| 32B | 約59.6 GiB | 約14.9 GiB | 80GB の GPU 1枚、または複数枚 |
| 70B | 約130.4 GiB | 約32.6 GiB | 80GB×2枚以上で --tensor-parallel-size |
4ビットの列は「パラメーター数×0.5バイト」で計算した重みだけの目安で、量子化の方式によって増えます。vLLM の量子化のドキュメントには、AWQ・GPTQ・bitsandbytes・FP8(W8A8)・INT4(W4A16)などが並んでいます。GGUF も読めますが、ドキュメントでは "highly experimental and under-optimized" とされています。
vLLMのよくあるエラーと直し方
この節では、vLLM を起動・利用したときに出るエラーの原文から、原因と直し方を引けます。
原文は v0.32.0 のソースのメッセージの書き方そのままで、数値の部分は状況によって変わります(〈 〉 の部分)。
| エラーの原文(要部) | 原因 | 直し方 |
|---|---|---|
torch.OutOfMemoryError: CUDA out of memory. Tried to allocate 96.00 MiB. |
動いている途中で GPU のメモリが足りなくなった | --max-model-len・--max-num-seqs を下げる、量子化モデル、--enforce-eager、GPU を増やす |
Free memory on device 〈〉 on startup is less than desired GPU memory utilization (0.92, 〈〉 GiB). |
起動時に、他のプロセスが GPU を使っていて空きが足りない | nvidia-smi で他のプロセスを止める、--gpu-memory-utilization を下げる |
To serve at least one request with the model's max seq len (40960), (〈〉 GiB KV cache is needed, which is larger than the available KV cache memory |
最大長の依頼1件分の KV キャッシュが入らない | --max-model-len を下げる(エラー文に入る長さの目安が出る)、--gpu-memory-utilization を上げる |
No available memory for the cache blocks. Try increasing gpu_memory_utilization |
重みを載せたら KV キャッシュの場所が残らない | --gpu-memory-utilization を上げる、量子化、--tensor-parallel-size |
User-specified max_model_len (〈〉) is greater than the derived max_model_len |
モデルが対応する長さより長い --max-model-len を指定した |
モデルの長さ以下にする。超える設定は VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 が要り、注意書きがある |
This model's maximum context length is 〈〉 tokens. However, your prompt contains 〈〉 input tokens |
送った入力が --max-model-len を超えた(HTTP 400) |
入力を短くする、--max-model-len を上げる |
The model 〈名前〉 does not exist. Valid aliases: 〈〉. |
model の名前が起動した名前と違う(HTTP 404) |
Valid aliases の名前にそろえる、--served-model-name |
{"error":"Unauthorized"} |
キーが無い・違う(HTTP 401) | Authorization: Bearer キー を付ける |
RuntimeError: Failed to infer device type |
GPU などの装置を見つけられない | ドライバーと nvidia-smi を確かめる、VLLM_LOGGING_LEVEL=DEBUG で詳しく見る |
RuntimeError: Cannot re-initialize CUDA in forked subprocess |
vLLM を作る前に CUDA を触った | 使う GPU は CUDA_VISIBLE_DEVICES で指定する |
1行目の原文は、vLLM のフォーラムに投稿された例の一部("GPU 0 has a total capacity of 15.47 GiB of which 52.94 MiB is free." と続く)です。
CUDA out of memoryの直し方の順番
GPU のメモリ不足は、効きやすく副作用の小さいものから順に試します。公式ドキュメント「Conserving Memory」とソースの既定値をもとにした順番です。
他に GPU を使っているプロセスを止める
nvidia-smi で、前に起動した vLLM や Jupyter が残っていないかを見ます。
--max-model-len を用途に合わせて縮める
Qwen3-8B では 40,960 から 8,192 にすると、1件の KV キャッシュが 5.625 GiB から 1.125 GiB になります。
--max-num-seqs を下げる
同時にまとめる数を減らし、ピークのメモリを抑えます。
量子化モデル・--kv-cache-dtype fp8 を使う
重みや KV キャッシュの1つあたりのバイト数を減らします。精度とのかね合いを確かめます。
--enforce-eager で CUDA グラフを止める
速さは落ちますが、CUDA グラフの分のメモリが空きます。
GPU を増やして --tensor-parallel-size
モデルを複数の GPU に分けて載せます。
起動・ダウンロードで止まるとき
| 症状 | 原因 | 直し方 |
|---|---|---|
| モデルのダウンロードで止まる | 回線の速さ、承認が要るモデル | hf コマンドで先にダウンロードし、手元のパスを渡す。承認が要るモデルは HF_TOKEN |
| ディスクから読み込むところで止まる | ネットワーク上のディスクが遅い、CPU のメモリ不足 | ローカルのディスクに置く。--load-format dummy で読み込みを省いて切り分ける |
| 起動のたびに数分かかる | カーネルのダウンロードとコンパイル | vllm download-kernels を実行しておく |
| 生成の質が前の版と変わった | v0.8.0 から既定の生成パラメーターがモデルの推奨値に | --generation-config vllm で比べる |
| 同じ入力でも出力が少し変わる | バッチの組み方で計算の順番が変わる | seed を指定する、float32 にする(FAQ の対策) |
さらに詳しく調べるときは、VLLM_LOGGING_LEVEL=DEBUG でログを増やし、vllm collect-env で環境の情報を集めます。
外部の LLM API で 429 などが返ったときの再試行の書き方は、関連記事「LLM APIの429・529エラー対処|リトライ実装とエラー一覧」で扱っています。
vLLMを安全に公開する
この節では、vLLM のサーバーを社内やインターネットに公開するときに確かめることが分かります。
--api-key は /v1 などの一部の道だけを守ります。 vLLM のセキュリティのドキュメントは、--api-key だけに頼らず、リバースプロキシで公開する道を絞るよう勧めています。また、分散処理で使う torch.distributed は既定ですべてのネットワークの口で待ち受けるため、API サーバーのポート以外をファイアウォールで閉じるよう書かれています。
vLLM をチームに公開する
公式のセキュリティのドキュメント(API Key Authentication Limitations)の推奨に沿った形
- 1vLLM のポートを直接インターネットに開けていないリバースプロキシの内側に置き、外から届くのはプロキシだけにする
- 2プロキシで、使う道(/v1/chat/completions など)だけを通しているドキュメントは、キーで守られない道があると明記している
- 3API キーを付け、ソースや設定ファイルに直接書いていない環境変数 VLLM_API_KEY でも渡せる
- 4分散処理の通信用のポートを、信頼できる相手だけに絞っているtorch.distributed は既定で全部の口で待ち受ける
- 5本番で VLLM_SERVER_DEV_MODE=1 を設定していない開発用の操作の道が開く。ドキュメントは本番で使わないよう強く書いている
- 6--trust-remote-code は中身を確かめたモデルだけに付けているモデルのリポジトリの Python コードが実行される
nginx を前に置く設定は、関連記事「Nginxリバースプロキシ設定|proxy_passの書き方と502/504対処」で扱っています。生成に時間がかかる API では、nginx の proxy_read_timeout(既定60秒)とストリーミングの扱いも確かめます。
vLLMとOllama・llama.cpp・TGIの違い
この節では、似た目的のツールとの違いと、どれを選ぶかが分かります。
各公式ドキュメント・README の記載をもとにした比較です(2026年10月22日時点)。
| 項目 | vLLM | Ollama | llama.cpp(llama-server) | TGI |
|---|---|---|---|---|
| 主な目的 | 多くの依頼を GPU で速くさばく | 手元で手軽に LLM を動かす | 少ない準備で、さまざまな機械で動かす | Hugging Face の推論サーバー |
| モデルの形式 | Hugging Face の形式(Safetensors)。GGUF は試験的 | ライブラリから ollama pull。GGUF・Safetensors を取り込める |
GGUF | Hugging Face の形式 |
| 主に動く場所 | Linux+GPU(NVIDIA・AMD・Intel・TPU など) | Windows・Mac・Linux(CPU・GPU) | CPU・CUDA・Metal・Vulkan など | Linux+GPU |
| 同時の依頼 | 連続バッチング。既定でまとめる上限 256 など | OLLAMA_NUM_PARALLEL の既定は1、待ち行列は512 |
連続バッチングが既定で有効、スロット数は自動 | 連続バッチング |
| OpenAI 互換 API | あり(既定 :8000) | あり(http://localhost:11434/v1/) |
あり(既定 :8080) | あり(Messages API、1.4.0 から) |
| 状態 | 活発に開発中 | 活発に開発中 | 活発に開発中 | 保守モード(公式の告知) |
TGI(text-generation-inference)のドキュメントには、"text-generation-inference is now in maintenance mode" とあり、今後は vLLM・SGLang、手元向けには llama.cpp や MLX を勧めると書かれています。
どれを選ぶかの判断表
| 状況 | 選ぶもの | 理由 |
|---|---|---|
| 自分のパソコンで試したい・GPU が無い | Ollama か llama.cpp | CPU や Mac でそのまま動き、量子化モデルが揃っている |
| 社内の何十人が同時に使う API にしたい | vLLM | 連続バッチングと PagedAttention で同時の依頼に強い |
| 大量の文書をまとめて処理したい | vLLM の LLM クラス |
サーバーを立てずに、まとめて流せる |
| 1枚の GPU に入らない大きなモデル | vLLM(テンソル並列) | --tensor-parallel-size で複数の GPU に分けられる |
| 組み込み・小さな機械で動かしたい | llama.cpp | C/C++ だけで動き、依存が少ない |
| Windows でそのまま使いたい | Ollama・llama.cpp(vLLM は WSL) | vLLM は Windows を直接はサポートしない |
vLLM が向く
Linux と GPU のサーバーがある
同時に多くの人やバッチが使う
Hugging Face のモデルをそのまま配りたい
Ollama・llama.cpp が向く
ノートパソコンや Mac で1人で使う
GPU が無い、またはメモリが小さい
コマンド1つで試したい
どれも OpenAI 互換の API を持つので、アプリ側は base_url とモデル名を変えるだけで行き来できます。 手元では Ollama で作り、本番は vLLM で配る、という組み合わせも取れます。Ollama のコマンドと API は、関連記事「Ollamaの使い方|ローカルLLMのコマンド一覧とAPIの呼び方」で扱っています。
Pythonから直接使う:オフライン推論(LLMクラス)
この節では、サーバーを立てずに、Python のプログラムの中で vLLM を使う書き方が分かります。
大量の文章をまとめて処理するだけなら、vllm serve を立てずに LLM クラスを使えます。 公式のクイックスタートの例です。
from vllm import LLM, SamplingParams
prompts = [
"Hello, my name is",
"The capital of France is",
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
if __name__ == "__main__":
llm = LLM(model="facebook/opt-125m")
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Prompt: {output.prompt!r}, Generated text: {output.outputs[0].text!r}")
| 書き方 | 使う場面 | 注意 |
|---|---|---|
llm.generate(prompts, ...) |
文章の続きを作る | チャットテンプレートは自動で付かない |
llm.chat(messages_list, ...) |
チャット形式のモデル | OpenAI の messages と同じ形で渡す |
LLM(..., tensor_parallel_size=2) |
複数の GPU | GPU の指定は CUDA_VISIBLE_DEVICES |
LLM(..., max_model_len=2048, max_num_seqs=2) |
メモリを減らす | オプション名は vllm serve と同じ(ハイフンがアンダースコアになる) |
if __name__ == "__main__": の中で LLM を作ります。 トラブルシューティングのドキュメントによれば、そうしないと、子プロセスの起動の方式(spawn)によって RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase. が出ることがあります。
vLLM を RAG(検索で集めた文書を LLM に渡す仕組み)の土台に使う作り方は、関連記事「RAGの作り方|Pythonで動かす最小構成と精度の上げ方」で扱っています。base_url を vLLM に向ければ、OpenAI の SDK を使う部分はそのまま動きます。
よくある質問
Q. vLLMとは何ですか?
A. LLM の推論とサービングを、速く・少ないメモリで行うオープンソースのエンジンです。vllm serve で OpenAI 互換の API サーバーになります。仕組みは「vLLMが速い理由:PagedAttentionと連続バッチング」の節にあります。
Q. vLLMの使い方を一言でいうと?
A. uv pip install vllm --torch-backend=auto で入れ、vllm serve モデル名 で起動し、OpenAI の SDK の base_url を http://localhost:8000/v1 にして呼びます。
Q. vLLMはGPUなしで動きますか? A. CPU 版があり、x86(AVX512 推奨)・ARM・Apple シリコンで動きます。ただし本来の強みは GPU での同時処理で、手元で手軽に試すなら Ollama や llama.cpp が向いています。
Q. vLLMはWindowsで使えますか? A. 公式は Windows をそのままではサポートしていません。ドキュメントは WSL(Windows 上の Linux)に入れる方法を案内しています。
Q. vLLMとOllamaの違いは何ですか?
A. vLLM は Linux と GPU のサーバーで多くの依頼を同時にさばく作り、Ollama は手元のパソコンで手軽に動かす作りです。Ollama の OLLAMA_NUM_PARALLEL の既定は1です。どちらも OpenAI 互換の API を持ちます。
Q. vLLMはOllamaより速いですか?
A. 同時の依頼が多いほど差が出やすい作りです。Ollama の既定の並列数は1、vLLM は連続バッチングで既定256件(70GiB未満の GPU のサーバー)までまとめます。1件ずつの速さはモデル・量子化・GPU で変わるため、vllm bench などで自分の環境で測ります。
Q. Ollamaとllama.cppの違いは何ですか?
A. llama.cpp は C/C++ で書かれた推論のエンジンと llama-server です。Ollama の README は対応するバックエンドとして llama.cpp を挙げていて、そのうえにモデルのライブラリ(ollama pull)や常駐のサーバーを持ちます。
Q. PagedAttentionとは何ですか? A. KV キャッシュを16トークンなどのブロックに分け、OS の仮想メモリのページのように、ばらばらの場所に必要な分だけ置く仕組みです。確保したのに使わない領域が減り、同じメモリに多くの依頼が載ります。
Q. CUDA out of memoryが出たらどうしますか?
A. 他に GPU を使うプロセスを止め、--max-model-len・--max-num-seqs を下げ、量子化モデルや --enforce-eager、--tensor-parallel-size を順に試します。「CUDA out of memoryの直し方の順番」にまとめています。
Q. gpu-memory-utilizationは何を決めますか? A. GPU のメモリのうち、その vLLM が使ってよい割合です。0.32.0 の既定は 0.92 で、モデルの重みを引いた残りが KV キャッシュになります。1枚の GPU で vLLM を2つ動かすなら、それぞれ 0.5 などにします。
Q. vLLMは商用利用できますか? A. vLLM のコードは Apache License 2.0 です。動かすモデルは、モデルごとのライセンス(商用利用の可否・条件)を別に確かめます。
Q. 複数のモデルを1つのvLLMで配れますか?
A. 公式の FAQ では、1つのサーバーが配るモデルは1つです。モデルごとにサーバーを立て、前に振り分けの層を置きます。LoRA の差分なら --enable-lora で1つのサーバーから配れます。
まとめ
- vLLM は、LLM を GPU で速く動かし、OpenAI 互換の API として配るオープンソースの推論サーバー。0.32.0 は Python 3.11〜3.14・Linux が基本。
- 速さの元は、KV キャッシュを16トークンのブロックで管理する PagedAttention と、空いた席にすぐ次の依頼を入れる連続バッチング。小さな計算でも、同じメモリに載る依頼が10件から22件に増えた。
vllm serve モデル名で:8000に API が立つ。OpenAI SDK はbase_urlを変えるだけで使え、vLLM 独自の引数はextra_bodyで JSON の一番上に混ざって送られる。--api-keyは/v1などの一部の道だけを守る。公開するときはリバースプロキシで道を絞る。- メモリ不足は、まず
--max-model-lenを用途に合わせて縮める。KV キャッシュは「2×層×KV ヘッド×次元×2バイト×トークン数」で見積もれる。 - 手元で手軽に試すなら Ollama・llama.cpp、同時に多くの依頼をさばくサーバーなら vLLM。どれも OpenAI 互換なので、アプリ側の変更は小さい。
参考・出典
確認日はいずれも 2026年10月22日です。
- vLLM「GitHub リポジトリ(v0.32.0 のソースと README)」:https://github.com/vllm-project/vllm
- PyPI「vllm」:https://pypi.org/project/vllm/
- vLLM ドキュメント「Quickstart」:https://docs.vllm.ai/en/stable/getting_started/quickstart/
- vLLM ドキュメント「GPU」(インストール):https://docs.vllm.ai/en/stable/getting_started/installation/gpu/
- vLLM ドキュメント「CPU」(インストール):https://docs.vllm.ai/en/stable/getting_started/installation/cpu/
- vLLM ドキュメント「OpenAI-Compatible Server」:https://docs.vllm.ai/en/stable/serving/openai_compatible_server/
- vLLM ドキュメント「vLLM CLI Guide」:https://docs.vllm.ai/en/stable/cli/
- vLLM ドキュメント「Conserving Memory」:https://docs.vllm.ai/en/stable/configuration/conserving_memory/
- vLLM ドキュメント「Troubleshooting」:https://docs.vllm.ai/en/stable/usage/troubleshooting/
- vLLM ドキュメント「Frequently Asked Questions」:https://docs.vllm.ai/en/stable/usage/faq/
- vLLM ドキュメント「Security」:https://docs.vllm.ai/en/stable/usage/security/
- vLLM ドキュメント「Quantization」:https://docs.vllm.ai/en/stable/features/quantization/
- vLLM ドキュメント「GGUF」:https://docs.vllm.ai/en/stable/features/quantization/gguf/
- vLLM Blog「vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention」(2023年6月20日):https://vllm.ai/blog/2023-06-20-vllm
- Woosuk Kwon ほか「Efficient Memory Management for Large Language Model Serving with PagedAttention」(SOSP 2023):https://arxiv.org/abs/2309.06180
- Red Hat「Meet vLLM: For faster, more efficient LLM inference and serving」:https://www.redhat.com/ja/blog/meet-vllm-faster-more-efficient-llm-inference-and-serving
- vLLM Forums「torch.OutOfMemoryError: CUDA out of memory」:https://discuss.vllm.ai/t/torch-outofmemoryerror-cuda-out-of-memory/2420
- Hugging Face「Qwen/Qwen2.5-1.5B-Instruct」(モデルカードと config.json):https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct
- Hugging Face「Qwen/Qwen3-8B」(モデルカードと config.json):https://huggingface.co/Qwen/Qwen3-8B
- Hugging Face「Text Generation Inference」:https://huggingface.co/docs/text-generation-inference/index
- Ollama「FAQ」:https://docs.ollama.com/faq
- Ollama「OpenAI compatibility」:https://docs.ollama.com/api/openai-compatibility
- Ollama「Importing a Model」:https://docs.ollama.com/import
- llama.cpp「GitHub リポジトリ」:https://github.com/ggml-org/llama.cpp
- llama.cpp「LLaMA.cpp HTTP Server」:https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「vLLMとは|使い方・インストール・OpenAI互換APIとOllamaとの違い」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。