vLLMクイックスタート: 2026年の高性能LLMサービング

OpenAI API を使用した高速なLLM推論

目次

vLLM は、UC BerkeleyのSky Computing Labが開発した、大規模言語モデル(LLM)向けの高スループットでメモリ効率の良い推論およびサービングエンジンです。

革新的なPagedAttentionアルゴリズムにより、vLLMは伝統的なサービング方法と比較して14〜24倍のスループットを達成し、生産環境でのLLMデプロイメントに最適な選択肢となっています。

vllm logo

vLLMとは?

vLLM(バーチャルLLM)は、2023年にリリースされた、高速なLLM推論およびサービング用のオープンソースライブラリです。これは、PagedAttentionという画期的なメモリ管理技術を導入し、サービング効率を劇的に向上させたことで、生産環境デプロイメントの業界標準となっています。

主な特徴

高スループット性能:同じハードウェアを使用して、HuggingFace Transformersと比較して14〜24倍のスループットを実現します。この大きな性能向上は、連続バッチ処理、最適化されたCUDAカーネル、そしてメモリフラグメンテーションを排除するPagedAttentionアルゴリズムから得られます。

OpenAI APIとの互換性:vLLMには、OpenAIのフォーマットと完全に互換性のある組み込みAPIサーバーが搭載されています。これにより、OpenAIからセルフホストインフラへの移行が、アプリケーションコードを変更することなくスムーズに行えます。単にOpenAIのクライアントをvLLMのエンドポイントに接続するだけで、透明に動作します。

PagedAttentionアルゴリズム:vLLMの性能のコア的な革新は、PagedAttentionであり、これは注意機構に仮想メモリページングの概念を適用します。KVキャッシュ(これはフラグメンテーションを引き起こす)のために連続的なメモリブロックを割り当てる代わりに、PagedAttentionは固定サイズのブロックに分割し、必要に応じてオンデマンドで割り当てます。これにより、メモリの無駄を最大で4倍まで削減し、はるかに大きなバッチサイズを実現します。

連続バッチ処理:静的バッチ処理では、すべてのシーケンスが完了するのを待つ必要がありますが、vLLMは連続(ローリング)バッチ処理を使用します。1つのシーケンスが完了すると、すぐに新しいシーケンスをバッチに追加できます。これにより、GPU利用率が最大化され、入力リクエストのレイテンシーが最小限に抑えられます。

マルチGPUサポート:vLLMは、大規模なモデルを複数のGPUにわたって分散処理するために、テンソル並列性とパイプライン並列性をサポートしています。これは、単一GPUのメモリに収まらないモデルを効率的にサービスし、2〜8以上のGPU構成をサポートしています。

広範なモデルサポート:LLaMA、Mistral、Mixtral、Qwen、Phi、Gemma、およびその他の多くの人気のあるモデルアーキテクチャと互換性があります。HuggingFace Hubからのインストラクション調整済みモデルとベースモデルの両方をサポートしています。

vLLMを使用するべきシナリオ

vLLMは、特定のシナリオでその強みが際立つため、以下のようなケースに最適です:

生産APIサービス:多くの同時ユーザーにLLMをAPI経由で提供する必要がある場合、vLLMの高スループットと効率的なバッチ処理により、最適な選択肢です。チャットボット、コードアシスタント、コンテンツ生成サービスを運営する会社は、秒単位で数百のリクエストを処理する能力を活かすことができます。

高同時性ワークロード:アプリケーションに多くの同時ユーザーがリクエストを送信している場合、vLLMの連続バッチ処理とPagedAttentionにより、同じハードウェアでより多くのユーザーをサービスできます。

コスト最適化:GPUコストが懸念される場合、vLLMの優れたスループットにより、同じトラフィックを処理するために必要なGPU数を減らすことができ、インフラコストを直接削減できます。PagedAttentionによる4倍のメモリ効率により、より小さな、安価なGPUインスタンスを使用できます。

Kubernetesデプロイメント:vLLMのステートレス設計とコンテナフレンドリなアーキテクチャにより、Kubernetesクラスタに最適です。負荷下での一貫したパフォーマンスとシンプルなリソース管理により、クラウドネイティブインフラと統合しやすくなります。

vLLMを使用しないべきシナリオ:ローカル開発、実験、または単一ユーザーのシナリオでは、Ollamaなどのツールが、シンプルなセットアップでより良いユーザー体験を提供します。vLLMの複雑さは、生産ワークロードでその性能の利点が必要な場合に正当化されます。

vLLMのインストール方法

事前条件

vLLMをインストールする前に、システムが以下の要件を満たしていることを確認してください:

  • GPU:NVIDIA GPUで、コンピュート能力7.0以上(V100、T4、A10、A100、H100、RTX 20/30/40シリーズ)
  • CUDA:バージョン11.8以上
  • Python:3.8から3.11
  • VRAM:7Bモデルには最低16GB、13Bモデルには24GB以上、より大きいモデルには40GB以上
  • ドライバ:NVIDIAドライバ450.80.02以上

pipによるインストール

最も簡単なインストール方法はpipを使用することです。CUDA 11.8以上が動作するシステムで使用できます:

# バーチャル環境の作成(推奨)
python3 -m venv vllm-env
source vllm-env/bin/activate

# vLLMのインストール
pip install vllm

# インストールの確認
python -c "import vllm; print(vllm.__version__)"

異なるCUDAバージョンのシステムでは、適切なホイールをインストールしてください:

# CUDA 12.1の場合
pip install vllm==0.4.2+cu121 -f https://github.com/vllm-project/vllm/releases

# CUDA 11.8の場合
pip install vllm==0.4.2+cu118 -f https://github.com/vllm-project/vllm/releases

Dockerによるインストール

Dockerは、特に生産環境において最も信頼性の高いデプロイメント方法です:

# 公式vLLMイメージのプル
docker pull vllm/vllm-openai:latest

# GPUサポート付きでvLLMを実行
docker run --runtime nvidia --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    -p 8000:8000 \
    --ipc=host \
    vllm/vllm-openai:latest \
    --model mistralai/Mistral-7B-Instruct-v0.2

--ipc=hostフラグは、マルチGPU構成で必要な適切なプロセス間通信を可能にします。

ソースからビルド

最新の機能やカスタム変更が必要な場合は、ソースからビルドしてください:

git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .

vLLMのクイックスタートガイド

最初のモデルの実行

コマンドラインインターフェースを使用してvLLMを起動し、モデルを実行します:

# OpenAI互換APIを使用してMistral-7Bをダウンロードしてサービス
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --port 8000

vLLMは、キャッシュされていない場合、HuggingFace Hubからモデルを自動的にダウンロードし、サーバーを起動します。サーバーが準備完了したことを示す出力が表示されます:

INFO:     Started server process [12345]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000

APIリクエストの送信

サーバーが起動していると、OpenAI Pythonクライアントやcurlを使用してリクエストを送信できます:

curlを使用する場合

curl http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mistralai/Mistral-7B-Instruct-v0.2",
        "prompt": "Explain what vLLM is in one sentence:",
        "max_tokens": 100,
        "temperature": 0.7
    }'

OpenAI Pythonクライアントを使用する場合

from openai import OpenAI

# vLLMサーバーに接続
client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"  # vLLMではデフォルトで認証は不要
)

response = client.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    prompt="Explain what vLLM is in one sentence:",
    max_tokens=100,
    temperature=0.7
)

print(response.choices[0].text)

チャット補完API

response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is PagedAttention?"}
    ],
    max_tokens=200
)

print(response.choices[0].message.content)

高度な設定

vLLMはパフォーマンス最適化のために多くのパラメータを提供しています:

python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --port 8000 \
    --gpu-memory-utilization 0.95 \  # 95%のGPUメモリを使用
    --max-model-len 8192 \            # 最大シーケンス長
    --tensor-parallel-size 2 \        # 2つのGPUでテンソル並列性を使用
    --dtype float16 \                 # FP16精度を使用
    --max-num-seqs 256                # 最大バッチサイズ

重要なパラメータの説明

  • --gpu-memory-utilization:GPUメモリの使用率(0.90 = 90%)。値が高いほどより大きなバッチを処理できますが、メモリの急激な増加には余裕が少なくなります。
  • --max-model-len:最大コンテキスト長。これを減らすと、より大きなバッチを処理するためにメモリが節約されます。
  • --tensor-parallel-size:モデルを分割するためのGPU数。
  • --dtype:重みのデータタイプ(float16、bfloat16、またはfloat32)。FP16が通常最適です。
  • --max-num-seqs:バッチで処理するシーケンス数の最大値。

vLLMとOllamaの比較

vLLMとOllamaは、ローカルLLMホスティングのためのポピュラーな選択肢ですが、異なるユースケースをターゲットにしています。それぞれのツールの使用タイミングを理解することで、プロジェクトの成功に大きく影響します。

パフォーマンスとスループット

vLLMは、マルチユーザーのシナリオで最大のスループットを実現するために設計されています。PagedAttentionと連続バッチ処理により、数百の同時リクエストを効率的に処理できます。ベンチマークでは、vLLMが標準実装と比較して14〜24倍のスループットを達成し、高同時性下ではOllamaよりも2〜4倍のスループットを実現しています。

Ollamaは、単一ユーザーのインタラクティブな使用を最適化し、個々のリクエストの低レイテンシーに注力しています。vLLMのマルチユーザーのスループットには及びませんが、開発および個人使用において優れたパフォーマンスを提供し、より速い冷起動時間とアイドル時のリソース消費量が低いです。

使用の容易さ

Ollamaは、シンプルさにおいて圧倒的に優れています。インストールは単一のコマンド(curl | sh)で完了し、モデルの実行はollama run llama2と非常に簡単です。これは、クォンタイズされたバージョンで最適化されたモデルライブラリを含んでおり、Dockerに似た使い方(プル、実行、完了)が可能です。

vLLMは、Python環境管理、CUDAインストール、サービングパラメータの理解、モデルの手動指定が必要です。学習曲線はより急ですが、ハードウェアから最大限のパフォーマンスを引き出すための細かな制御が可能です。この複雑さは、生産デプロイメントが必要な場合に正当化されます。

APIと統合

vLLMは、OpenAIとの互換性のあるREST APIを標準搭載しており、既存アプリケーションでOpenAIのAPIを置き換えるためのドロップインソリューションとなっています。これは、クラウドプロバイダーからセルフホストインフラへの生産サービスの移行において、コード変更なしで重要です。

Ollamaは、シンプルなREST APIと専用のPython/JavaScriptライブラリを提供しています。機能はありますが、OpenAIとの互換性はなく、アプリケーションがOpenAIのフォーマットを期待している場合にコード変更が必要です。しかし、Ollama-OpenAIアダプタなどのコミュニティプロジェクトにより、このギャップを埋めることができます。

メモリ管理

vLLMのPagedAttentionアルゴリズムは、同時リクエストに対する優れたメモリ効率を提供します。これは、ナイーブな実装と比較して、同じVRAMで2〜4倍多くの同時ユーザーをサービスできます。これは、生産デプロイメントにおいて直接コスト削減につながります。

Ollamaは、単一ユーザーのシナリオに適したシンプルなメモリ管理を使用しています。これは、アクティビティに基づいてモデルのロード/アンロードを自動管理するため、開発には便利ですが、高同時性の生産使用には最適ではありません。

マルチGPUサポート

vLLMは、ネイティブのテンソル並列性とパイプライン並列性により、2〜8以上のGPUにわたってモデルを効率的に分散処理できます。これは、70BパラメータのLLMなどの非常に大きなモデルを1つのGPUに収まらない場合に必要です。

Ollamaは現在、マルチGPUサポートが限定的で、主に1つのGPUで動作するのが最適です。これは、分散推論が必要な非常に大きなモデルには不向きです。

ユースケースの推奨

vLLMを選択する場合

  • 多くの同時ユーザーにLLMをAPIで提供する必要があるとき
  • クラウドデプロイメントでリクエストごとのコストを最適化するとき
  • Kubernetesやコンテナオーケストレーションプラットフォームで実行するとき
  • 既存アプリケーションでOpenAI APIとの互換性が必要なとき
  • 多GPUサポートが必要な大きなモデルをサービスするとき
  • パフォーマンスとスループットが重要な要件のとき

Ollamaを選択する場合

  • ローカル開発と実験
  • 単一ユーザーのインタラクティブな使用(パーソナルアシスタント、チャットボット)
  • クイックなプロトタイピングとモデル評価
  • LLMについて学ぶためにインフラの複雑さが不要なとき
  • パーソナルワークステーションやノートPCで実行するとき
  • 簡単さと使用の容易さが優先されるとき

多くのチームは両方を使用します:Ollamaで開発と実験を行い、vLLMで生産デプロイメントを行うことで、開発者の生産性を維持しながら生産性能を確保します。

vLLMとDockerモデルランナーの比較

Dockerは最近、モデルランナー(以前はGenAI Stack)を公式のローカルAIモデルデプロイメントソリューションとして導入しました。これはvLLMとどのように比較されるのでしょうか?

アーキテクチャの哲学

Dockerモデルランナーは、「AI用のDocker」として設計されており、コンテナを実行するのと同じように簡単にローカルでAIモデルを実行できる標準化された方法を提供します。これは、さまざまなモデルやフレームワークに対して一貫したインターフェースを提供します。

vLLMは、LLMサービングに特化した高性能な推論エンジンであり、より低いレベルのツールです。これは、Dockerでコンテナ化する必要がありますが、完全なプラットフォームではありません。

設定と開始

DockerモデルランナーのインストールはDockerユーザーにとって簡単です:

docker model pull llama3:8b
docker model run llama3:8b

このDockerイメージワークフローとの類似性により、コンテナを使用している開発者にとってすぐに親しみやすくなります。

vLLMは、Python、CUDA、依存関係の初期設定や、事前に構築されたDockerイメージを使用する必要があります:

docker pull vllm/vllm-openai:latest
docker run --runtime nvidia --gpus all vllm/vllm-openai:latest --model <model-name>

パフォーマンス特性

vLLMは、PagedAttentionと連続バッチ処理により、マルチユーザーのシナリオで優れたスループットを実現します。生産APIサービスで1秒間に数百のリクエストを処理する必要がある場合、vLLMの最適化により、汎用的なサービングアプローチよりも2〜5倍のスループットを提供します。

Dockerモデルランナーは、使いやすさを重視しており、最大のパフォーマンスではなく、ローカル開発、テスト、中規模ワークロードには適していますが、vLLMがスケールで優れている高度な最適化は実装していません。

モデルサポート

Dockerモデルランナーは、人気のあるモデルにワンコマンドでアクセスできるカレントモデルライブラリを提供し、Stable Diffusion、Whisper、その他のAIモデルを含む複数のフレームワークをサポートしています。これは、さまざまなAIワークロードに適しています。

vLLMは、Transformerベースの言語モデルに深くサポートされているLLM推論に特化しています。これは、HuggingFace互換のLLMをサポートしていますが、画像生成や音声認識などの他のAIモデルタイプには拡張されていません。

生産デプロイメント

vLLMは、Anthropic、Replicate、および多くのその他の企業が毎日数十億トークンを処理している生産環境で実証済みです。そのパフォーマンス特性と高負荷下での安定性により、生産LLMサービングの事実上の標準となっています。

Dockerモデルランナーは、より新しく、開発およびローカルテストのシナリオに位置づけられています。生産トラフィックを処理するには、生産デプロイメントに必要な実績とパフォーマンス最適化が欠如しています。

統合エコシステム

vLLMは、生産インフラツールと統合しています:Kubernetesオペレーター、Prometheusメトリクス、Rayによる分散サービング、および既存アプリケーション用のOpenAI APIとの広範な互換性。

Dockerモデルランナーは、DockerのエコシステムとDocker Desktopと自然に統合します。Dockerに標準化しているチームにとっては、この統合により一貫した体験が提供されますが、専用LLMサービング機能は少なくなります。

各ツールを使用するべきとき

vLLMを使用するべきとき

  • 生産LLM APIサービス
  • 高スループット、マルチユーザーのデプロイメント
  • クラウドデプロイメントでコストを最適化する必要があるとき
  • Kubernetesやクラウドネイティブ環境
  • スケーラビリティとパフォーマンスが必要なとき

Dockerモデルランナーを使用するべきとき

  • ローカル開発とテスト
  • 各種AIモデル(LLMだけでなく)を実行する
  • Dockerエコシステムに深く投資しているチーム
  • インフラ設定なしでクイックな実験
  • 学習や教育目的

ハイブリッドアプローチ:多くのチームは、ローカルでDockerモデルランナーを使用して便利さを活かし、生産ではvLLMを使用してパフォーマンスを確保します。Dockerモデルランナーのイメージは、vLLMコンテナを実行するためにも使用できます。

生産デプロイメントのベストプラクティス

Dockerデプロイメント

生産用のDocker Compose設定を作成します:

version: '3.8'

services:
  vllm:
    image: vllm/vllm-openai:latest
    runtime: nvidia
    environment:
      - CUDA_VISIBLE_DEVICES=0,1
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ./logs:/logs
    ports:
      - "8000:8000"
    command: >
      --model mistralai/Mistral-7B-Instruct-v0.2
      --tensor-parallel-size 2
      --gpu-memory-utilization 0.90
      --max-num-seqs 256
      --max-model-len 8192
    restart: unless-stopped
    shm_size: '16gb'
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 2
              capabilities: [gpu]

Kubernetesデプロイメント

Kubernetesで生産規模のvLLMをデプロイします:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: vllm
  template:
    metadata:
      labels:
        app: vllm
    spec:
      containers:
      - name: vllm
        image: vllm/vllm-openai:latest
        args:
          - --model
          - mistralai/Mistral-7B-Instruct-v0.2
          - --tensor-parallel-size
          - "2"
          - --gpu-memory-utilization
          - "0.90"
        resources:
          limits:
            nvidia.com/gpu: 2
        ports:
        - containerPort: 8000
        volumeMounts:
        - name: cache
          mountPath: /root/.cache/huggingface
      volumes:
      - name: cache
        hostPath:
          path: /mnt/huggingface-cache
---
apiVersion: v1
kind: Service
metadata:
  name: vllm-service
spec:
  selector:
    app: vllm
  ports:
  - port: 80
    targetPort: 8000
  type: LoadBalancer

モニタリングと可視化

vLLMは、モニタリングのためにPrometheusメトリクスを公開します:

import requests

# メトリクスの取得
metrics = requests.get("http://localhost:8000/metrics").text
print(metrics)

監視するべき重要なメトリクス:

  • vllm:num_requests_running - アクティブなリクエスト
  • vllm:gpu_cache_usage_perc - KVキャッシュの利用率
  • vllm:time_to_first_token - レイテンシーのメトリクス
  • vllm:time_per_output_token - 生成速度

パフォーマンスチューニング

GPUメモリ利用率の最適化--gpu-memory-utilization 0.90から始め、観測された動作に基づいて調整してください。高い値はより大きなバッチを処理できますが、トラフィックピーク時にOOMエラーのリスクがあります。

最大シーケンス長の調整:使用ケースがフルコンテキスト長を必要としない場合は、--max-model-lenを減らしてください。これにより、より大きなバッチのためにメモリが解放されます。たとえば、4Kのコンテキストが必要な場合は、モデルの最大(通常8K〜32K)ではなく--max-model-len 4096に設定してください。

適切なクアンタイゼーションの選択:モデルがサポートしている場合は、クアンタイズされたバージョン(8ビット、4ビット)を使用してメモリを削減し、スループットを増やすことができます:

--quantization awq  # AWQクアンタイズモデルの場合
--quantization gptq # GPTQクアンタイズモデルの場合

プレフィックスキャッシュの有効化:システムメッセージを含むチャットボットなどのアプリケーションで、繰り返されるプロンプトがある場合に有効化してください:

--enable-prefix-caching

これにより、共通のプレフィックスのKV値がキャッシュされ、同じプロンプトプレフィックスを持つリクエストの計算が減少します。

一般的な問題のトラブルシューティング

メモリ不足エラー

症状:サーバーがCUDAメモリ不足エラーでクラッシュします。

解決策

  • --gpu-memory-utilizationを0.85または0.80に下げてください
  • 使用ケースが許容する場合は--max-model-lenを減らしてください
  • --max-num-seqsを減らしてバッチサイズを小さくしてください
  • クアンタイズされたモデルバージョンを使用してください
  • テンソル並列性を有効にして、より多くのGPUに分散してください

低スループット

症状:サーバーが予想より少ないリクエストを処理しています。

解決策

  • --max-num-seqsを増やしてより大きなバッチを処理できるようにしてください
  • ヘッドスペースがある場合は--gpu-memory-utilizationを上げてください
  • htopでCPUがボトルネックになっているか確認してください – より高速なCPUを検討してください
  • nvidia-smiでGPU利用率を確認してください – 95%以上でなければなりません
  • FP32を使用している場合はFP16に切り替えてください:--dtype float16

最初のトークンの時間が遅い

症状:生成が開始する前の高レイテンシー。

解決策

  • レイテンシーが重要なアプリケーションには、より小さなモデルを使用してください
  • 繰り返されるプロンプトに対してプレフィックスキャッシュを有効にしてください
  • --max-num-seqsを減らして、レイテンシーを優先してスループットを下げる
  • サポートされているモデルでは、スペキュレーションデコードを検討してください
  • テンソル並列性設定を最適化してください

モデルロードの失敗

症状:サーバーが起動できず、モデルをロードできません。

解決策

  • モデル名がHuggingFaceフォーマットと完全に一致していることを確認してください
  • HuggingFace Hubへのネットワーク接続を確認してください
  • ~/.cache/huggingfaceに十分なディスクスペースがあることを確認してください
  • ゲート付きモデルの場合はHF_TOKEN環境変数を設定してください
  • 手動でhuggingface-cli download <model>を使用してダウンロードしてみてください

高度な機能

スペキュレーションデコード

vLLMは、スモールなドラフトモデルがトークンを提案し、大きなターゲットモデルがそれを検証するスペキュレーションデコードをサポートしています。これにより、生成速度を1.5〜2倍加速できます:

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-70b-chat-hf \
    --speculative-model meta-llama/Llama-2-7b-chat-hf \
    --num-speculative-tokens 5

LoRAアダプター

ベースモデルの上に複数のLoRAアダプターを提供し、複数のフルモデルをロードすることなく:

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-hf \
    --enable-lora \
    --lora-modules sql-lora=./path/to/sql-adapter \
                   code-lora=./path/to/code-adapter

その後、リクエストごとに使用するアダプターを指定します:

response = client.completions.create(
    model="sql-lora",  # SQLアダプターを使用
    prompt="Convert this to SQL: Show me all users created this month"
)

マルチLoRAサービング

vLLMのマルチLoRAサービングにより、数十のファインチューニングアダプターを最小限のメモリオーバーヘッドでホストできます。これは、顧客固有またはタスク固有のモデルバリアントをサービスするのに最適です:

# 特定のLoRAアダプターを使用したリクエスト
response = client.chat.completions.create(
    model="meta-llama/Llama-2-7b-hf",
    messages=[{"role": "user", "content": "Write SQL query"}],
    extra_body={"lora_name": "sql-lora"}
)

プレフィックスキャッシュ

繰り返されるプロンプトプレフィックスのKVキャッシュを再計算しないように自動的に有効化します:

--enable-prefix-caching

これは特に次のケースに効果的です:

  • 固定されたシステムプロンプトを持つチャットボット
  • 一貫したコンテキストテンプレートを持つRAGアプリケーション
  • 複数のリクエストにわたって繰り返されるファイナリショット学習プロンプト

プレフィックスキャッシュは、プロンプトプレフィックスを共有するリクエストの最初のトークンまでの時間を50〜80%削減できます。

統合例

LangChainの統合

from langchain.llms import VLLMOpenAI

llm = VLLMOpenAI(
    openai_api_key="EMPTY",
    openai_api_base="http://localhost:8000/v1",
    model_name="mistralai/Mistral-7B-Instruct-v0.2",
    max_tokens=512,
    temperature=0.7,
)

response = llm("Explain PagedAttention in simple terms")
print(response)

LlamaIndexの統合

from llama_index.llms import VLLMServer

llm = VLLMServer(
    api_url="http://localhost:8000/v1",
    model="mistralai/Mistral-7B-Instruct-v0.2",
    temperature=0.7,
    max_tokens=512
)

response = llm.complete("What is vLLM?")
print(response)

FastAPIアプリケーション

from fastapi import FastAPI
from openai import AsyncOpenAI

app = FastAPI()
client = AsyncOpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"
)

@app.post("/generate")
async def generate(prompt: str):
    response = await client.completions.create(
        model="mistralai/Mistral-7B-Instruct-v0.2",
        prompt=prompt,
        max_tokens=200
    )
    return {"result": response.choices[0].text}

パフォーマンスベンチマーク

現実世界のパフォーマンスデータは、vLLMの利点を示しています:

スループット比較(Mistral-7B、A100 GPU上):

  • vLLM:64の同時ユーザーで約3,500トークン/秒
  • HuggingFace Transformers:同じ同時ユーザー数で約250トークン/秒
  • Ollama:同じ同時ユーザー数で約1,200トークン/秒
  • 結果:vLLMは基本的な実装と比較して14倍の改善を提供しています

メモリ効率(LLaMA-2-13B):

  • 標準実装:24GB VRAM、32の同時シーケンス
  • vLLMとPagedAttention:24GB VRAM、128の同時シーケンス
  • 結果:同じメモリで4倍の同時リクエストを実現しています

負荷下のレイテンシー(Mixtral-8x7B、2xA100上):

  • vLLM:100 req/sでP50レイテンシー180ms、P99レイテンシー420ms
  • 標準サービング:100 req/sでP50レイテンシー650ms、P99レイテンシー3,200ms
  • 結果:vLLMは高負荷下でも一貫したレイテンシーを維持しています

これらのベンチマークにより、vLLMがパフォーマンスが重要な生産LLMサービングにおいて事実上の標準となった理由が示されています。

コスト分析

vLLMの選択によるコストの影響を理解しましょう:

シナリオ:1日あたり100万リクエストの処理

標準サービングの場合

  • 必要:8x A100 GPU(80GB)
  • AWSコスト:$32/時間 × 24 × 30 = $23,040/月
  • 100万トークンあたりのコスト:$0.75

vLLMの場合

  • 必要:2x A100 GPU(80GB)
  • AWSコスト:$8/時間 × 24 × 30 = $5,760/月
  • 100万トークンあたりのコスト:$0.19
  • 節約:$17,280/月(75%の削減)

このコストの利点は規模に伴って増加します。毎月数十億トークンを処理する組織は、vLLMの最適化されたサービングを使用することで、数十万ドルの節約が可能です。

セキュリティ上の考慮事項

認証

vLLMはデフォルトで認証を含んでいません。生産環境では、リバースプロキシレベルで認証を実装してください:

# Nginx設定
location /v1/ {
    auth_request /auth;
    proxy_pass http://vllm-backend:8000;
}

location /auth {
    proxy_pass http://auth-service:8080/verify;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

または、Kong、Traefik、またはAWS API Gatewayなどのエンタープライズグレードの認証とレート制限を提供するAPIゲートウェイを使用してください。

ネットワーク分離

vLLMはインターネットに直接公開されないプライベートネットワークで実行してください:

# Kubernetesネットワークポリシーの例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: vllm-access
spec:
  podSelector:
    matchLabels:
      app: vllm
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: api-gateway
    ports:
    - protocol: TCP
      port: 8000

レート制限

悪用を防ぐためにレート制限を実装してください:

# Redisを使用したレート制限の例
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import redis
from datetime import datetime, timedelta

app = FastAPI()
redis_client = redis.Redis(host='localhost', port=6379)

@app.middleware("http")
async def rate_limit_middleware(request, call_next):
    client_ip = request.client.host
    key = f"rate_limit:{client_ip}"
    
    requests = redis_client.incr(key)
    if requests == 1:
        redis_client.expire(key, 60)  # 60秒のウィンドウ
    
    if requests > 60:  # 1分間に60リクエスト
        raise HTTPException(status_code=429, detail="レート制限を超えました")
    
    return await call_next(request)

モデルアクセス制御

マルチテナントデプロイメントでは、どのユーザーがどのモデルにアクセスできるかを制御してください:

ALLOWED_MODELS = {
    "user_tier_1": ["mistralai/Mistral-7B-Instruct-v0.2"],
    "user_tier_2": ["mistralai/Mistral-7B-Instruct-v0.2", "meta-llama/Llama-2-13b-chat-hf"],
    "admin": ["*"]  # 全てのモデル
}

def verify_model_access(user_tier: str, model: str) -> bool:
    allowed = ALLOWED_MODELS.get(user_tier, [])
    return "*" in allowed or model in allowed

マイグレーションガイド

OpenAIからvLLMへのマイグレーション

OpenAIからセルフホストvLLMへの移行は、API互換性により簡単です:

移行前(OpenAI)

from openai import OpenAI

client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Hello"}]
)

移行後(vLLM)

from openai import OpenAI

client = OpenAI(
    base_url="https://your-vllm-server.com/v1",
    api_key="your-internal-key"  # 認証を追加した場合
)
response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    messages=[{"role": "user", "content": "Hello"}]
)

変更が必要なのは2点だけです:base_urlmodel名を更新してください。他のコードはすべて同じです。

OllamaからvLLMへのマイグレーション

Ollamaは異なるAPIフォーマットを使用しています。変換方法は以下の通りです:

Ollama API

import requests

response = requests.post('http://localhost:11434/api/generate',
    json={
        'model': 'llama2',
        'prompt': 'Why is the sky blue?'
    })

vLLM同等

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
response = client.completions.create(
    model="meta-llama/Llama-2-7b-chat-hf",
    prompt="Why is the sky blue?"
)

コードベース全体のAPI呼び出しを更新する必要がありますが、OpenAIクライアントライブラリはより良いエラーハンドリングと機能を提供します。

HuggingFace TransformersからvLLMへのマイグレーション

直接的なPython使用の移行:

HuggingFace

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")

inputs = tokenizer("Hello", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=100)
result = tokenizer.decode(outputs[0])

vLLM

from vllm import LLM, SamplingParams

llm = LLM(model="mistralai/Mistral-7B-Instruct-v0.2")
sampling_params = SamplingParams(max_tokens=100)

outputs = llm.generate("Hello", sampling_params)
result = outputs[0].outputs[0].text

vLLMのPython APIは、バッチ推論のためによりシンプルで、はるかに高速です。

vLLMの将来

vLLMは、今後の開発に向けた興味深い機能が計画されており、急速に発展しています:

分散されたサービング:プレフィル(プロンプト処理)とデコード(トークン生成)を異なるGPUに分離してリソース利用率を最適化します。プレフィルはコンピュートバウンドであり、デコードはメモリバウンドであるため、専用ハードウェアで実行することで効率が向上します。

マルチノード推論:非常に大きなモデル(100B以上のパラメータ)を複数のマシンにわたって分散処理し、単一ノードの設定では処理できないモデルをサービスできます。

強化されたクアンタイゼーション:llama.cppで使用されているGGUFなどの新しいクアンタイゼーションフォーマットをサポートし、AWQ/GPTQの統合を改善して、クアンタイズモデルのパフォーマンスを向上させます。

スペキュレーションデコードの改善:正確性の損失なしでより効率的なドラフトモデルと適応的なスペキュレーション戦略を実装して、より高速な加速を実現します。

注意の最適化:FlashAttention 3、非常に長いコンテキスト(100K以上のトークン)に適したリング注意、およびその他の最先端の注意メカニズムを導入します。

より広範なモデルサポート:マルチモーダルモデル(視覚言語モデル)、オーディオモデル、および専門的なアーキテクチャのサポートを拡張します。

vLLMプロジェクトは、UC Berkeley、Anyscale、およびオープンソースコミュニティからの積極的な開発を維持しています。LLMデプロイメントが生産システムにとってますます重要になるにつれて、vLLMの性能基準としての役割はさらに拡大しています。

有用なリンク

このサイトに関連する記事

  • ローカルLLMホスティング:2026年完全ガイド - Ollama, vLLM, LocalAI, Jan, LM Studio & More - Ollama、vLLM、LocalAI、Jan、LM Studioなど12以上のローカルLLMホスティングツールの包括的な比較。APIの成熟度、ツールコールサポート、GGUFの互換性、パフォーマンスベンチマークなどを含み、適切なソリューションの選択をサポートします。

  • Ollamaのショートカット集 - Ollamaのインストール、モデル管理、APIの使用、ローカルLLMデプロイのベストプラクティスをカバーする完全なOllamaコマンドリファレンスとショートカット集。Ollamaを使用してvLLMを併用または代替する開発者にとって必須です。

  • Docker Model Runner vs Ollama:どちらを選ぶべきか? - Docker Model RunnerとOllamaをローカルLLMデプロイに用いて、パフォーマンス、GPUサポート、APIの互換性、使用ケースを分析した詳細な比較。vLLMが競争する市場の概況を理解するのに役立ちます。

  • Docker Model Runnerのショートカット集:コマンドと例 - AIモデルのデプロイに役立つ実用的なDocker Model Runnerのショートカット集。DockerのアプローチとvLLMの専門的なLLM提供機能を比較するチームにとって有用です。

外部リソースとドキュメント

  • vLLM GitHubリポジトリ - vLLMの公式リポジトリで、ソースコード、包括的なドキュメント、インストールガイド、活発なコミュニティの議論が含まれています。最新の機能を把握し、問題のトラブルシューティングに役立つ必須のリソースです。

  • vLLMドキュメント - vLLMの基本的なセットアップから高度な設定までをカバーする公式ドキュメント。APIリファレンス、パフォーマンスチューニングガイド、デプロイのベストプラクティスが含まれています。

  • PagedAttention論文 - vLLMの効率性を支えるPagedAttentionアルゴリズムを紹介する学術論文。vLLMのパフォーマンスの優位性の背後にある技術的革新を理解するための必須読書です。

  • vLLMブログ - vLLMプロジェクトの公式ブログで、リリースのアナウンス、パフォーマンスベンチマーク、技術的な深掘り、および生産性デプロイのコミュニティケーススタディが掲載されています。

  • HuggingFaceモデルハブ - vLLMと互換性のあるオープンソースLLMの包括的なリポジトリ。サイズ、タスク、ライセンス、パフォーマンス特性でモデルを検索し、使用ケースに合ったモデルを見つけることができます。

  • Ray Serveドキュメント - スケーラブルで分散型のvLLMデプロイを構築するためのRay Serveフレームワークのドキュメント。Rayは、プロダクションシステムで使用するための自動スケーリング、マルチモデルの提供、リソース管理などの高度な機能を提供します。

  • NVIDIA TensorRT-LLM - NVIDIA GPU上で非常に最適化された推論を実行するNVIDIAのTensorRT-LLM。vLLMとは異なる最適化戦略を持つ代替ソリューションであり、比較および推論最適化の全体像の理解に役立ちます。

  • OpenAI APIリファレンス - vLLMのAPIが互換性を持つOpenAI APIの公式ドキュメント。OpenAIと自社ホストのvLLMエンドポイントを交換可能に使用するアプリケーションを開発する際に参考になります。