AI: オンプレミス モデル展開
最終更新:2026-08-26
「データは機械から出ない」——これは SF ではなく、オンプレミス AI の現実です。プライバシー規制でデータをクラウドに送れない場合、ネットワーク不安定でサービスに影響が出る場合、あるいは API 呼び出し料金が高額になりすぎる場合、AI モデルをオンプレミスで展開することは現実的な選択です。この章ではオンプレミス展開とクラウド API の違いを理解し、Ollama を導入してオープンソース LLM を実行し、Python でローカルモデルを呼び出し、プライバシー保護とオフライン AI の恩恵を体験します。
1. 学べること
- オンプレミス展開とクラウド API の長所と短所
- Ollama の導入と使い方
- オープンソースモデルファミリー(Llama/Mistral/Qwen/Gemma)
- Python でのローカルモデル呼び出し
- 量子化モデルとハードウェア要件
2. ストーリー:Charlie のプライバシージレンマ
(1) 痛みの種:データをクラウドに移行できない
Charlie の医療 AI プロジェクトは、患者のカルテを分析して主要な症状や投薬情報を抽出する必要があります。彼はもともと OpenAI API を使う予定でしたが、コンプライアンスチームが警告しました。
「患者のカルテは機微な個人データとみなされ、GDPR および個人情報保護法に従い、第三者のクラウド API に送信することはできません。」
API 案は一蹴されました。Charlie は困り果てました。AI はとても強力ですが、データをクラウドに上げられないのです。
(2) Bob のアプローチ:モデルをローカルで動かす
事情を聞いた Bob は提案しました。「Ollama を使って Llama 3 をローカルで動かせばいい。データはそのマシンに留まるから、コンプライアンスも守れるしコストも抑えられる。」
たった 1 コマンドです。
ollama run llama3
画面に >>> プロンプトが現れます——完全にローカルで動く大規模言語モデルの準備ができました。カルテを Charlie のノート PC から出す必要はありません。
(3) 得られるもの:プライバシー、コスト削減、オフライン——すべて一緒に
テストの結果、Charlie はローカルモデルは GPT-4 ほど強力ではないものの、カルテ要約タスクには十分であり、毎月 $50 の API 料金を節約し、インターネット接続なしでも動くことを発見しました。
3. オンプレミス展開 vs クラウド API
(1) 重要な違い
オンプレミス展開とクラウド API はまったく異なる 2 つの AI 利用パラダイムです。前者は「所有して動かす」、後者は「借りて呼ぶ」です。
(2) 比較表:オンプレミス vs クラウド API
| 次元 | オンプレミス | クラウド API |
|---|---|---|
| プライバシー | データはデバイスに留まり完全に管理下 | データは第三者サーバに送信 |
| コスト | ハードウェアの一回投資。継続的な API 料金なし | トークン課金。長期コストが高い |
| レイテンシ | 推論レイテンシは一定、ネットワーク変動なし | ネットワーク依存。1〜5 秒で変動 |
| モデルサイズ | ローカルメモリ/GPU メモリに制限。通常 7B〜70B | 制限なし。GPT-4 級の大規模モデル対応 |
| オフライン | 完全にオフラインで利用可能 | インターネット接続が必要 |
| 運用保守 | ハードウェアと更新を自ら管理 | O&M ゼロ。すぐ使えて設定完了 |
| モデル品質 | オープンソースモデル、GPT-4 には及ばない | 商用モデル、最高品質 |
| カスタマイズ | 微調整可能。すべてのパラメータを制御 | ブラックボックス。API パラメータのみ調整 |
(3) どう選ぶか?
- オンプレミス:機微データ、高呼び出し頻度、オフラインシナリオ、予算制限
- クラウドを選ぶ:最も強力なモデルが必要、プロトタイピング迅速、利用頻度が低い、ハードウェア不要の場合
4. Ollama の導入と使い方
(1) Ollama とは?
Ollama はローカル LLM を動かすためのオープンソースフレームワークで、モデルのダウンロード・量子化・ロード・API サービスを最小限のコマンド操作に包んでいます。内部で llama.cpp 推論エンジンを使い、GPU 加速と CPU 推論の両方をサポートします。
(2) Ollama のインストール
macOS / Linux:
curl -fsSL https://ollama.com/install.sh | sh
Windows:
ollama.com からインストーラをダウンロードし、ダブルクリックでインストールします。
Linux での手動起動:
sudo systemctl start ollama
インストール後、Ollama はデフォルトで http://localhost:11434 で REST API サービスを起動します。
(3) Ollama のワークフロー
graph TB
A["ollama pull llama3<br/>モデルをダウンロード"] --> B["量子化 GGUF<br/>自動量子化"]
B --> C["メモリ/VRAM へロード<br/>モデル読み込み"]
C --> D["API サーバ :11434<br/>REST API エンドポイント"]
D --> E["Python / CLI / アプリ<br/>クライアント呼び出し"]
E --> F["推論<br/>回答を生成"]
F --> D
▶ サンプル: モデルのダウンロード(難易度:⭐)
# Llama 3 8B モデルをダウンロード(約 4.7 GB)
ollama pull llama3
# Qwen2 7B をダウンロード
ollama pull qwen2
# Mistral 7B をダウンロード
ollama pull mistral
出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)
ダウンロードのプログレスバーには速度と残り時間が表示されます。モデルは ~/.ollama/models ディレクトリに保存されます。
▶ サンプル: コマンドライン対話(難易度:⭐)
# Llama 3 で対話モードを開始
ollama run llama3
# >>> ニューラルネットワークを 1 段落で説明してください。
# ニューラルネットワークは、人間の脳内の生物学的ニューロンの働きを
# 参考にした計算モデルです。相互接続されたノード(ニューロン)の層からなり、
# 情報を処理します…
# /bye と入力して終了
# >>> /bye
出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)
▶ サンプル: インストール済みモデルの表示(難易度 ⭐)
# ダウンロード済みのすべてのモデルを一覧表示
ollama list
# 出力例:
# NAME ID SIZE MODIFIED
# llama3:latest 365c0bd3c000 4.7 GB 2 時間前
# mistral:latest 2b3e8435e228 4.1 GB 5 日前
# qwen2:latest e3d7e5e5e5e5 4.4 GB 1 日前
出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)
5. オープンソース LLM ファミリー
(1) 主要なオープンソースモデル
オープンソース LLM エコシステムは 2023〜2024 年に爆発的に成長し、いくつかのモデルファミリーが生まれました。
(2) オープンソース LLM の比較表
| モデル | パラメータ数 | 開発元 | コンテキスト長 | 特徴 |
|---|---|---|---|---|
| Llama 3 | 8B / 70B | Meta | 8K | 汎用能力が強く、エコシステムが最も豊富 |
| Mistral | 7B / 8x7B | Mistral AI | 32K | 推論効率が高く、長文脈をサポート |
| Qwen2 | 7B / 72B | 阿里雲(Alibaba Cloud) | 32K〜128K | 中国語能力に優れ、多言語能力が強い |
| Gemma 2 | 9B / 27B | 8K | セキュリティが良く、軽量で効率的 | |
| Phi-3 | 3.8B / 14B | Microsoft | 4K〜128K | コンパクトだが高性能、エッジコンピューティングに適する |
(3) モデルの選び方
- 中国語タスク:Qwen2 を優先
- 一般的な英語:Llama 3 または Mistral
- リソース制約:Phi-3(3.8B パラメータで動作)
- 長文書処理:Mistral または Qwen2(32K+ コンテキスト)
- セキュリティ重視:Gemma 2
6. モデルの量子化とハードウェア要件
(1) 量子化とは?
量子化(quantization)は、モデルの重みを高精度(FP16 など、各重み 16 ビット)から低精度(Q4 など、各重み 4 ビット)に圧縮するプロセスです。わずかな品質低下を代償に、メモリ使用量を大幅に削減します。
Ollama はデフォルトで GGUF 形式(llama.cpp ベース)の量子化モデルを使用します。一般的な量子化レベル:
(2) 量子化レベルの比較表
| 量子化レベル | 重みあたりビット数 | 7B モデルサイズ | 品質低下 | 適したシナリオ |
|---|---|---|---|---|
| FP16 | 16 ビット | 約 14 GB | なし | 品質最優先、VRAM に余裕 |
| Q8 | 8 ビット | 約 7 GB | 非常に小さい | 品質とサイズのバランス |
| Q5 | 5 ビット | 約 5 GB | 軽微 | バランスの選択肢 |
| Q4 | 4 ビット | 約 4 GB | 許容範囲 | メモリが厳しい時の優先 |
(3) ハードウェア要件参考表
| モデルパラメータ数 | Q4 量子化サイズ | 最小メモリ/VRAM | 推奨構成 |
|---|---|---|---|
| 3B | 約 2 GB | 4 GB | 内蔵グラフィックス搭載ノート PC |
| 7B-8B | 約 4-5 GB | 8 GB | 8 GB VRAM GPU または 16 GB RAM |
| 13B-14B | 約 8 GB | 16 GB | 16 GB VRAM GPU |
| 70B-72B | 約 40 GB | 48 GB | 2×24 GB GPU または 64 GB RAM + CPU |
量子化した 7B モデル(Q4)は约 4 GB のメモリしか要らず、多くの modern ノート PC で動きます。これがオンデバイス AI の参入障壁を大きく下げる鍵です。
7. Python でローカルモデルを呼び出す
(1) ollama ライブラリのインストール
pip install ollama
(2) 2 つの呼び出し方法
Ollama は Python からの 2 つの呼び出し方法をサポートします。
- ollama Python ライブラリ:あらかじめパッケージされた Python SDK
- REST API:直接 HTTP リクエスト
http://localhost:11434
▶ サンプル: Python でローカルモデルを呼び出す(難易度:⭐)
import ollama
# ローカルの Llama 3 と簡単なチャット
response = ollama.chat(
model="llama3",
messages=[
{"role": "user", "content": "量子コンピューティングを 1 文で説明してください。"},
],
)
print(response["message"]["content"])
出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)
▶ サンプル: ローカルとクラウド API のレイテンシ比較(難易度:⭐⭐)
import time
import ollama
from openai import OpenAI
# ローカルモデルのレイテンシ
start = time.time()
local_response = ollama.chat(
model="llama3",
messages=[{"role": "user", "content": "機械学習とは何ですか?"}],
)
local_time = time.time() - start
# クラウド API のレイテンシ
client = OpenAI()
start = time.time()
cloud_response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "機械学習とは何ですか?"}],
)
cloud_time = time.time() - start
print(f"ローカルモデル: {local_time:.2f}秒")
print(f"クラウド API: {cloud_time:.2f}秒")
print(f"ローカル出力: {local_response['message']['content'][:100]}")
print(f"クラウド出力: {cloud_response.choices[0].message.content[:100]}")
出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)
▶ サンプル: REST API での直接呼び出し(難易度:⭐⭐)
import requests
import json
# Ollama REST API を直接呼び出す
url = "http://localhost:11434/api/chat"
payload = {
"model": "llama3",
"messages": [{"role": "user", "content": "プログラミングについて俳句を書いてください。"}],
"stream": False,
}
response = requests.post(url, json=payload)
result = response.json()
print(result["message"]["content"])
出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)
8. 総合例:ローカル AI 翻訳ツール
▶ サンプル: 完全な翻訳ツール——導入から実行まで(難易度:⭐⭐)
この総合例は以下を示します:Ollama のインストール → Llama 3 のダウンロード → Python ollama ライブラリで「ローカル AI 翻訳ツール」を実装 → OpenAI API との出力品質の違いを比較。
import ollama
from openai import OpenAI
def local_translate(text: str, source: str = "English", target: str = "Chinese") -> str:
prompt = (
f"あなたはプロの {source}-{target} 翻訳者です。"
f"以下の {source} テキストを {target} に翻訳してください。"
f"翻訳のみを出力し、説明は不要です。\n\n{text}"
)
response = ollama.chat(
model="llama3",
messages=[{"role": "user", "content": prompt}],
)
return response["message"]["content"]
def cloud_translate(text: str, source: str = "English", target: str = "Chinese") -> str:
client = OpenAI()
prompt = (
f"あなたはプロの {source}-{target} 翻訳者です。"
f"以下の {source} テキストを {target} に翻訳してください。"
f"翻訳のみを出力し、説明は不要です。\n\n{text}"
)
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content
test_sentences = [
"The patient presented with persistent cough and mild fever for three days.",
"Artificial intelligence is transforming healthcare diagnostics.",
"The stock market rallied after the central bank announced rate cuts.",
]
print("=" * 60)
print("ローカル AI 翻訳 vs クラウド API 翻訳")
print("=" * 60)
for i, sentence in enumerate(test_sentences, 1):
local_result = local_translate(sentence)
cloud_result = cloud_translate(sentence)
print(f"\n[{i}] EN: {sentence}")
print(f" ローカル: {local_result}")
print(f" クラウド: {cloud_result}")
print(f" {'--- 一致 ---' if local_result.strip() == cloud_result.strip() else '--- 異なる ---'}")
実行前に以下を確認してください。
# ステップ 1: Ollama をインストールして起動
ollama serve
# ステップ 2: モデルをダウンロード(別のターミナルで)
ollama pull llama3
# ステップ 3: Python 依存関係をインストール
pip install ollama openai
# ステップ 4: 翻訳ツールを実行
python local_translator.py
期待される出力の例:
============================================================
ローカル AI 翻訳 vs クラウド API 翻訳
============================================================
[1] EN: The patient presented with persistent cough and mild fever for three days.
ローカル: 患者は 3 日間続く持続的な咳と軽い発熱を呈した。
クラウド: 患者は持続的な咳と軽い発熱を呈している。
--- 異なる ---
[2] EN: Artificial intelligence is transforming healthcare diagnostics.
ローカル: AI は医療診断を変革している。
クラウド: AI は医療診断分野を革命している。
--- 異なる ---
両方の翻訳は正確ですが、言葉遣いとスタイルが異なります——ローカルモデルでも日常の翻訳ニーズを十分に満たせます。
❓ よくある質問
📖 まとめ
- オンプレミス vs クラウド: オンプレミスはプライバシーとコストで勝り、クラウドはモデル品質と利便性で勝る
- Ollama: 1 コマンドでローカル LLM を実行。組み込み REST API サービス
- オープンソース LLM: Llama 3、Mistral、Qwen2、Gemma 2 が各々得意分野を持つ
- 量子化: Q4 でモデルサイズを大幅縮小、品質低下は最小限
- ハードウェア: 基本利用は 8 GB RAM、快適は 16 GB、大規模モデルは 48 GB+
- Python 統合: ollama ライブラリまたは REST API。呼び出し方法は OpenAI SDK と類似
📝 練習問題
基礎(⭐)
Ollama をインストールしてモデルをダウンロードし、コマンドラインで対話してみなさい。
# ステップ 1: https://ollama.com から Ollama をインストール
# ステップ 2: モデルをダウンロード
ollama pull llama3
# ステップ 3: チャットを開始
ollama run llama3
# >>> 火星について面白い事実を 3 つ教えてください。
# ステップ 4: インストール済みモデルを一覧表示
ollama list
応用(⭐⭐)
Python ollama ライブラリでローカルモデルを呼び出し翻訳させ、対話型翻訳ツールを実装しなさい。
import ollama
def interactive_translator():
print("ローカル AI 翻訳ツール('quit' で終了)")
print("-" * 40)
while True:
text = input("EN> ")
if text.lower() == "quit":
break
response = ollama.chat(
model="llama3",
messages=[
{
"role": "user",
"content": f"中国語に翻訳してください。翻訳のみを出力してください:\n\n{text}",
},
],
)
print(f"CN> {response['message']['content']}\n")
interactive_translator()
チャレンジ(⭐⭐⭐)
同じプロンプトでローカルモデルとクラウド API の出力の違いを比較し、分析レポートを書きなさい。
import ollama
from openai import OpenAI
import time
PROMPT = """以下の顧客レビューを分析し、抽出してください:
1. 感情(ポジティブ/ネガティブ/中立)
2. 主な不満または称賛
3. 会社への提案アクション
レビュー: "ヘッドホンの音は素晴らしいが、Bluetooth が 10 分ごとに切れる。常に再起動しなければならない。音質は最高だが通話には使えない。"
"""
def compare_outputs():
# ローカルモデル
start = time.time()
local = ollama.chat(
model="llama3",
messages=[{"role": "user", "content": PROMPT}],
)
local_time = time.time() - start
local_text = local["message"]["content"]
# クラウド API
client = OpenAI()
start = time.time()
cloud = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": PROMPT}],
)
cloud_time = time.time() - start
cloud_text = cloud.choices[0].message.content
print("PROMPT:", PROMPT[:80], "...")
print("=" * 60)
print(f"[ローカル - {local_time:.1f}秒]\n{local_text}")
print("=" * 60)
print(f"[クラウド - {cloud_time:.1f}秒]\n{cloud_text}")
print("=" * 60)
# TODO: 以下を比較する簡単な分析を書く:
# - 感情抽出の正確性
# - 要点の完全性
# - 提案の実行性
# - 応答時間の差
compare_outputs()