digital base
プロダクトドキュメントお知らせ会社概要

お問い合わせ

ご質問やご相談など、お気軽にお問い合わせください。

デジタルベース株式会社

〒106-0047
東京都港区南麻布3-20-1 5階

サイトメニュー

  • トップページ
  • プロダクト
  • ドキュメント
  • 最新ニュース
  • 記事一覧
  • 会社情報

お問い合わせ

  • info@digital-base.co.jp

NVIDIA Inception Program / Intel Partner ISV /
NTTPC Innovation LAB

© デジタルベース株式会社. All rights reserved.
記事一覧に戻る
2026.02.23AI

OllamaからvLLMへの移行設計|ローカルLLMで複数モデルを同時運用する構成

ローカルLLM推論エンジンとして広く使われるOllamaとvLLMを比較し、社内AI基盤を本番運用へ移行する設計指針を整理します。APIの変更点、Embeddingサーバーの分離、GPUメモリの割り当てと起動順序を解説します。

デジタルベース株式会社

OllamaからvLLMへの移行設計|ローカルLLMで複数モデルを同時運用する構成

社内AI基盤で複数モデルを同時運用する際は、API互換性、GPUメモリの割り当て、推論サーバーの管理を検討する必要があります。DigitalBaseでの構築知見をもとに、Ollama から vLLM へ移行する際の設計と手順を整理します。


アーキテクチャ比較

Ollamaのアーキテクチャ

Ollamaは、llama.cppをバックエンドに持つ統合型エンジンです。

┌─────────────────────────────────────────┐ │ Ollama Server │ │ ┌─────────────────────────────────┐ │ │ │ Model Manager │ │ │ │ (pull / run / list / ps) │ │ │ ├─────────────────────────────────┤ │ │ │ Inference Engine │ │ │ │ (llama.cpp / ggml) │ │ │ ├─────────────────────────────────┤ │ │ │ REST API │ │ │ │ /api/chat /api/generate │ │ │ │ /api/embed /api/tags │ │ │ └─────────────────────────────────┘ │ │ │ │ ・1プロセスで全機能を提供 │ │ ・モデルの自動ダウンロード・管理 │ │ ・GGUFフォーマット(量子化対応) │ │ ・単一モデルの逐次推論が基本 │ └─────────────────────────────────────────┘

特徴

  • シングルサーバー構成:1つの ollama serve が全リクエストを処理
  • 独自API:/api/chat、/api/generate、/api/embed など(別途 /v1 配下に OpenAI 互換エンドポイントも提供)
  • モデル管理の統合:ollama pull で自動ダウンロード、Modelfileでカスタマイズ
  • メモリ管理:モデルをロード/アンロードし、OLLAMA_NUM_PARALLEL で並列数を制御

vLLMのアーキテクチャ

vLLMは、GPUメモリ効率を重視するPython製の推論エンジンです。

┌───────────────────────────────────────────────────────┐ │ vLLM Architecture │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Chat Server │ │ Embed Server │ │Vision Server │ │ │ │ :8080 │ │ :8081 │ │ :8082 │ │ │ │ │ │ │ │ (optional) │ │ │ │ Qwen2.5 │ │ E5-large │ │ Qwen2-VL │ │ │ │ -1.5B-Inst │ │ -instruct │ │ │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ │ ┌──────┴─────────────────┴─────────────────┴───────┐ │ │ │ GPU Memory (PagedAttention) │ │ │ │ ┌─────────────┐ ┌──────────┐ ┌───────────────┐ │ │ │ │ │ Chat: 55% │ │Embed:35% │ │ Vision: 10% │ │ │ │ │ │ GPU VRAM │ │GPU VRAM │ │ GPU VRAM │ │ │ │ │ └─────────────┘ └──────────┘ └───────────────┘ │ │ │ └───────────────────────────────────────────────────┘ │ │ │ │ ・モデルごとに独立プロセス │ │ ・OpenAI互換API (/v1/chat/completions) │ │ ・GPUメモリの割合を個別に制御 │ │ ・Continuous Batchingで高スループット │ └───────────────────────────────────────────────────────┘

特徴

  • マルチサーバー構成:用途ごとに独立したサーバープロセスを起動
  • OpenAI互換API:/v1/chat/completions、/v1/embeddings、/v1/models
  • PagedAttention:GPUメモリをページ単位で管理し、KVキャッシュの無駄を最小化
  • Continuous Batching:複数リクエストを動的にバッチ処理し、スループットを最大化
  • HuggingFaceモデルの直接利用:ダウンロードからロードまで自動

OllamaとvLLMの比較

Ollamaの特性

観点内容
セットアップbrew install ollama → ollama pull qwen2.5 で完了。導入が容易
モデル管理ollama list で一覧、ollama rm で削除。Docker的な操作感
量子化GGUF形式で4bit/8bit量子化モデルを標準サポート。VRAM 8GBでも7Bモデルが動作
CPU推論llama.cppベースのため、GPUなしでも動作する(速度は低下する)
ModelfileFROM qwen2.5:7b + SYSTEM "..." でカスタムモデルを定義可能
制約OpenAI 互換は一部機能に限られる、GPUメモリの細かな制御が難しい、マルチモデル同時利用が制限的

vLLMの特性

観点内容
スループットPagedAttention + Continuous Batchingにより、同時リクエストの処理能力が高い
マルチモデルモデルごとに独立サーバー。Chat + Embedding + Visionを同時に安定運用
GPUメモリ制御--gpu-memory-utilization 0.55 のようにモデルごとのVRAM使用率を指定可能
API互換性OpenAI APIと互換。既存のOpenAIクライアントコードをそのまま利用可能
HuggingFace統合Qwen/Qwen2.5-1.5B-Instruct のようにHuggingFace IDを直接指定してロード
制約実運用では GPU 前提(CPU ビルドは存在するが性能が出ない)、セットアップがやや複雑、メモリ消費が大きい

比較表

項目OllamavLLM
セットアップ時間5分程度30分〜1時間
GPU要否なくても動作必須
API形式独自 (/api/chat)OpenAI互換 (/v1/chat/completions)
モデル形式GGUF(量子化)HuggingFace(FP16/BF16)
同時モデル数1〜2(メモリ次第)用途別に複数プロセス
GPUメモリ制御自動(制御困難)--gpu-memory-utilization で精密制御
バッチ処理逐次Continuous Batching
Embedding同一サーバー別サーバー(専用ポート)
推論速度(単発)高速(ggml最適化)高速(CUDA最適化)
推論速度(並列)低下しやすい高スループットを維持
Tensor Parallel非対応対応(マルチGPU)

OllamaからvLLMへの移行

DigitalBaseの社内AI基盤の本番化で実装した移行作業を、5つのステップに整理します。

Step 1: APIクライアント層の変更

最も大きな変更は、Ollama独自APIからOpenAI互換APIへの切り替えです。

主な変更点

OllamavLLM備考
/api/chat/v1/chat/completionsOpenAI互換エンドポイント
/api/generate/v1/completionsテキスト補完
/api/embed/v1/embeddingsEmbedding API
/api/tags/v1/modelsモデル一覧
num_predictmax_tokensパラメータ名の差異
repeat_penaltyrepetition_penaltyパラメータ名の差異
NDJSON streamSSE (Server-Sent Events)ストリーミング形式の差異

Step 2: Embeddingサーバーの分離

Ollamaでは1つのサーバーでChatもEmbeddingも処理しますが、vLLMではEmbeddingを専用サーバーとして分離します。

サーバー分離には次のメリットがあります。

  • メモリの独立管理:Chat 55%、Embedding 35%のようにGPUメモリを用途別に割り当て
  • 独立したスケーリング:Embeddingの負荷が高い場合、そのサーバーだけスケールアウト可能
  • 障害の分離:Chatサーバーがクラッシュしても、Embedding処理を継続できる

RAGパイプラインでは、検索のためのEmbedding生成とChat推論が同時に走ります。この分離は、社内ドキュメント検索を伴う用途で特に効果が大きい設計です。

Step 3: Vision APIの移行

画像認識もAPIフォーマットが異なります。

Ollama版

# Ollama: imagesフィールドにbase64画像を配列で渡す response = await client.post( f"{OLLAMA_BASE_URL}/api/chat", json={ "model": vision_model, "messages": [{ "role": "user", "content": prompt, "images": [image_b64] # Ollama独自形式 }], "stream": False } )

vLLM版

# vLLM: OpenAI形式のcontent配列にimage_urlブロックを含める content = [ {"type": "text", "text": prompt}, { "type": "image_url", "image_url": {"url": f"data:image/png;base64,{image_b64}"} # OpenAI形式 }, ] response = await client.post( f"{VLLM_BASE_URL}/v1/chat/completions", json={ "model": vision_model, "messages": [{"role": "user", "content": content}], "max_tokens": 4096, } )

Step 4: インフラ層(プロセス管理)の変更

Ollamaは ollama serve の1プロセスで完結しますが、vLLMは用途別にプロセスを起動します。

実装上の要点は起動順序です。vLLMはモデルロード時にGPUメモリを確保するため、メモリ使用量の大きいChatサーバーを先に起動して完了を待ち、その後にEmbeddingサーバーを起動する必要があります。順序を誤るとメモリ確保が競合し、起動に失敗します。

Step 5: SSEストリーミングパーサーの実装

OllamaはNDJSON(1行1JSON)でストリーミングしますが、vLLMはSSE(Server-Sent Events)形式です。パーサーの差し替えが必要になります。


vLLMサーバーの起動コマンド

移行後のvLLMサーバーの起動コマンドを示します。

Chatサーバー

python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2.5-1.5B-Instruct \ --host 0.0.0.0 \ --port 8080 \ --gpu-memory-utilization 0.55 \ --tensor-parallel-size 1

Embeddingサーバー

# vLLM 0.15.0以降: --convert embed を使用(旧 --task embed) python -m vllm.entrypoints.openai.api_server \ --model intfloat/multilingual-e5-large-instruct \ --host 0.0.0.0 \ --port 8081 \ --gpu-memory-utilization 0.35 \ --convert embed

Visionサーバー(オプション)

python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2-VL-7B-Instruct \ --host 0.0.0.0 \ --port 8082 \ --gpu-memory-utilization 0.10

--gpu-memory-utilization の合計が単一GPUの容量を超えないよう、各サーバーの割り当てを設計時に確定させておく点が重要です。


エンジンの使い分け

Ollamaが適するケース

シーン理由
低リソース環境GGUF量子化でメモリ使用量を最小化
プロトタイピングモデル切り替えが容易。Modelfileでカスタムプリセットを作成

vLLMが適するケース

シーン理由
本番APIサービスContinuous Batchingで安定した同時接続処理
複数モデルの同時利用Chat + Embedding + Visionを独立プロセスで並行運用
RAGパイプラインChat推論とEmbedding生成を同時に高速処理
マルチGPU環境Tensor Parallelで複数GPUにモデルを分散
GPU効率の最大化--gpu-memory-utilization でVRAMを精密制御
OpenAI互換が必要既存のOpenAIクライアントコードをそのまま流用
高スループット複数ユーザーからの同時リクエストを効率よく処理

まとめ

OllamaからvLLMへの移行は、次のステップで進められます。

  1. APIエンドポイントの変更:独自API → OpenAI互換API
  2. Embeddingの分離:同一サーバー → 専用サーバー
  3. Vision APIの変更:images配列 → OpenAI content配列
  4. プロセス管理の変更:単一プロセス → マルチプロセス(起動順序に注意)
  5. ストリーミング形式の変更:NDJSON → SSE

移行時は、APIエンドポイントとストリーミング形式の変更に加え、Embedding・Visionを含む各サーバーのGPUメモリ割り当てと起動順序を確認します。

下記のお悩みなら、ご相談ください

PoC から商用化に進むには、次の 3 点が必要になります。統合型 AI エージェント基盤「DigitalBase」は、 これらを 1 つの製品で提供しています。お気軽にご相談ください。