オープンソースローカルLLM実行環境比較:Ollama vs vLLM vs LM Studio でLLMをオンプレで動かす
オープンソースラボ編集部 ・ 2026年6月13日
オープンソースローカルLLM実行環境比較:Ollama vs vLLM vs LM Studio でLLMをオンプレで動かす
OpenAIやAnthropicのAPIを使わず、LLMをローカルマシンやオンプレミスサーバーで実行したい場合、Ollama・vLLM・LM Studioが主要な選択肢です。プライバシー保護・コスト削減・エアギャップ環境でのAI活用を実現しましょう。
ローカルLLMが必要な場面
- プライバシー: 機密文書・個人情報をクラウドAPIに送れない
- コスト: 大量トークン処理でAPIコストが問題になっている
- レイテンシ: ネットワーク遅延なしのリアルタイム推論
- エアギャップ: インターネット非接続環境でのAI活用
- カスタムモデル: ファインチューニングした独自モデルをサービング
主要ツールの概要
Ollama
ローカルLLM実行の最も手軽なツールです。macOS・Linux・WindowsでGPU/CPUを自動検出し、ollama run llama31コマンドでLLMを起動できます。OpenAI互換APIを内蔵しており、既存のOpenAIコードを最小限の変更でローカルモデルに向け直せます。
# Ollamamのインストールと起動
curl -fsSL https://ollama.com/install.sh | sh
# モデルのダウンロードと実行
ollama run llama3.2:3b # 3Bパラメータ(4GB VRAM)
ollama run llama3.1:8b # 8Bパラメータ(8GB VRAM)
ollama run mistral:7b # Mistral 7B
ollama run qwen2.5:14b # Qwen2.5 14B
ollama run phi4:14b # Microsoft Phi-4
# 日本語対応モデル
ollama run hf.co/elyza/Llama-3-ELYZA-JP-8B-GGUF
# Dockerで起動(GPU付き)
docker run -d -p 11434:11434 --gpus=all -v ollama:/root/.ollama ollama/ollama
# OllamaをOpenAI SDKで使う
from openai import OpenAI
# baseUrlをOllamaに向けるだけ
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama", # 任意の文字列
)
# チャット補完
response = client.chat.completions.create(
model="llama3.1:8b",
messages=[
{"role": "system", "content": "あなたはコードレビューの専門家です。"},
{"role": "user", "content": "このPythonコードを改善してください:
def fib(n):
if n<=1: return n
return fib(n-1)+fib(n-2)"},
],
temperature=0.7,
)
print(response.choices[0].message.content)
# ストリーミング
for chunk in client.chat.completions.create(
model="llama3.1:8b",
messages=[{"role": "user", "content": "日本の技術トレンドを教えて"}],
stream=True,
):
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
# OllamaのネイティブAPIを使う
import httpx
import json
# チャット
response = httpx.post("http://localhost:11434/api/chat", json={
"model": "llama3.1:8b",
"messages": [{"role": "user", "content": "日本語でHello World"}],
"stream": False,
})
print(response.json()["message"]["content"])
# Embedding生成
embed_resp = httpx.post("http://localhost:11434/api/embed", json={
"model": "nomic-embed-text",
"input": "このテキストをベクトルに変換します",
})
embedding = embed_resp.json()["embeddings"][0]
print(f"Embedding dimension: {len(embedding)}") # 768次元
vLLM
PagedAttentionアルゴリズムで高スループットを実現するLLMサービングエンジンです。複数のリクエストを効率的にバッチ処理し、OpenAI互換APIサーバーとして動作します。本番環境での高負荷なLLM推論に使われます。
# vLLMをPipでインストールして起動
pip install vllm
# OpenAI互換APIサーバーとして起動
python -m vllm.entrypoints.openai.api_server --model meta-llama/Llama-3.1-8B-Instruct --host 0.0.0.0 --port 8000 --tensor-parallel-size 2 --gpu-memory-utilization 0.9 --max-model-len 8192
# HuggingFace認証が必要なモデルは
# --hf-token YOUR_HF_TOKEN を追加
# Dockerで起動(NVIDIA GPU必須)
docker run --runtime nvidia --gpus all -p 8000:8000 --ipc=host vllm/vllm-openai:latest --model Qwen/Qwen2.5-7B-Instruct --dtype bfloat16 --gpu-memory-utilization 0.85
# Kubernetesにデプロイ(複数GPUノード)
kubectl apply -f - << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-server
spec:
replicas: 2
template:
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
resources:
limits:
nvidia.com/gpu: "2"
args:
- --model=Qwen/Qwen2.5-7B-Instruct
- --tensor-parallel-size=2
EOF
# vLLMの非同期バッチ推論(スループット最大化)
from vllm import LLM, SamplingParams
llm = LLM(
model="Qwen/Qwen2.5-7B-Instruct",
tensor_parallel_size=2,
gpu_memory_utilization=0.85,
)
sampling_params = SamplingParams(
temperature=0.7,
max_tokens=512,
stop=["</s>", "<|im_end|>"],
)
# 複数プロンプトを一括処理
prompts = [
"Pythonでクイックソートを実装して",
"TypeScriptの型システムを説明して",
"機械学習とは何かを一言で説明して",
]
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
print(f"Prompt: {output.prompt[:30]}...")
print(f"Response: {output.outputs[0].text[:100]}...")
print()
LM Studio
GUIベースのローカルLLM実行環境です。技術者でなくてもHugging Faceからモデルをダウンロードしてチャットできます。内蔵のOpenAI互換APIサーバーを起動してコードから利用することも可能です。
# LM Studioの内蔵APIサーバーに接続
from openai import OpenAI
# LM Studioの「Local Server」を起動してから
client = OpenAI(
base_url="http://localhost:1234/v1",
api_key="lm-studio",
)
models = client.models.list()
print("利用可能なモデル:")
for m in models.data:
print(f" - {m.id}")
response = client.chat.completions.create(
model=models.data[0].id, # 最初のロードされたモデルを使用
messages=[{"role": "user", "content": "こんにちは!"}],
)
print(response.choices[0].message.content)
機能比較表
| 比較項目 | Ollama | vLLM | LM Studio |
|---|---|---|---|
| セットアップの容易さ | ★★★★★ | ★★★☆☆ | ★★★★★ |
| GUI | ❌(CLI) | ❌(CLI) | ✅ |
| スループット | ★★★☆☆ | ★★★★★ | ★★★☆☆ |
| OpenAI互換API | ✅ | ✅ | ✅ |
| GPU必須 | ❌(CPU可) | ✅ | ❌(CPU可) |
| バッチ処理 | ❌ | ✅ | ❌ |
| マルチGPU | ❌ | ✅ tensor parallel | ❌ |
| Embedding API | ✅ | ✅ | ✅ |
| モデルカタログ | ✅ | ❌(HFから) | ✅ |
| Windows対応 | ✅ | ⚠️ WSL2 | ✅ |
| Apple Silicon | ✅ Metal | ❌ | ✅ |
| ライセンス | MIT | Apache 2.0 | 非公開(無料) |
| GitHub Stars | 97k+ | 45k+ | — |
LLMツール・AI開発環境はLLMツールカテゴリ(/categories/llm-tools)で一覧でき、AI活用のRAG・ベクターDB構築はknowledgeカテゴリ(/categories/knowledge)でも探せます。
FAQ
Q. ローカルLLMは商用で使えますか?
A. モデルのライセンスによります。Llama 3.1(Meta)はMetaのLlama 3 Community Licenseで月間アクティブユーザー7億未満なら商用利用可能。Mistralモデルは多くがApache 2.0で商用可能。Gemmaは「Gemma Terms of Use」でほぼ商用可能。ただし再配布・ファインチューニングモデルの公開・競合AI製品への組み込みには制限がある場合があります。使用前に各モデルのライセンスを確認してください。
Q. MacBook(Apple Silicon)でOllamaを使う場合の推奨モデルは?
A. Apple SiliconはGPUメモリをシステムメモリと共有します。16GBのMacでは7〜8Bパラメータ、32GBでは14〜20Bパラメータが快適に動作します。推奨: M1/M2 16GB→llama3.2:3bやphi4:14b(4bit量子化)、M2 Pro/Max 32GB→llama3.1:8bやqwen2.5:14b、M2 Ultra 64GB→qwen2.5:32bやllama3.1:70b(4bit量子化)。日本語を使うならqwen2.5シリーズが特に優れています。
Q. vLLMとOllamaのスループットはどのくらい違いますか?
A. 単一リクエストのレイテンシはOllamaもvLLMも同程度です。違いが出るのは同時リクエスト数が増えた場合で、vLLMのPagedAttentionは複数リクエストのKVキャッシュを効率的に共有するため、10〜100の同時リクエストではvLLMが3〜10倍以上のスループットを出します。Ollama(またはllama.cpp)は単一ユーザーの対話には十分ですが、複数ユーザーが同時利用するプロダクション環境ではvLLMが推奨されます。
Q. HuggingFaceのモデルをOllamaで動かすには?
A. GGUFフォーマットのモデルはOllamaで直接使えます。ollama run hf.co/ユーザー名/モデル名-GGUFでHugging Faceから直接ダウンロードして実行できます(v0.1.47以降)。PyTorch形式のモデルはGGUFに変換が必要です: llama.cppのconvert.pyでGGUFに変換し、Modelfileを作成してollama createコマンドでOllamaに登録します。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 個人・開発者の手軽な利用 | Ollama |
| 本番環境・高スループット | vLLM |
| 非技術者のGUI利用 | LM Studio |
| Apple Silicon Mac | Ollama / LM Studio |