AI: オンプレミス モデル展開

最終更新:2026-08-26

「データは機械から出ない」——これは SF ではなく、オンプレミス AI の現実です。プライバシー規制でデータをクラウドに送れない場合、ネットワーク不安定でサービスに影響が出る場合、あるいは API 呼び出し料金が高額になりすぎる場合、AI モデルをオンプレミスで展開することは現実的な選択です。この章ではオンプレミス展開とクラウド API の違いを理解し、Ollama を導入してオープンソース LLM を実行し、Python でローカルモデルを呼び出し、プライバシー保護とオフライン AI の恩恵を体験します。

1. 学べること




2. ストーリー:Charlie のプライバシージレンマ

(1) 痛みの種:データをクラウドに移行できない

Charlie の医療 AI プロジェクトは、患者のカルテを分析して主要な症状や投薬情報を抽出する必要があります。彼はもともと OpenAI API を使う予定でしたが、コンプライアンスチームが警告しました。

「患者のカルテは機微な個人データとみなされ、GDPR および個人情報保護法に従い、第三者のクラウド API に送信することはできません。」

API 案は一蹴されました。Charlie は困り果てました。AI はとても強力ですが、データをクラウドに上げられないのです。

(2) Bob のアプローチ:モデルをローカルで動かす

事情を聞いた Bob は提案しました。「Ollama を使って Llama 3 をローカルで動かせばいい。データはそのマシンに留まるから、コンプライアンスも守れるしコストも抑えられる。」

たった 1 コマンドです。

BASH
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:

BASH
curl -fsSL https://ollama.com/install.sh | sh

Windows:

ollama.com からインストーラをダウンロードし、ダブルクリックでインストールします。

Linux での手動起動:

BASH
sudo systemctl start ollama

インストール後、Ollama はデフォルトで http://localhost:11434 で REST API サービスを起動します。

(3) Ollama のワークフロー

100%
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

▶ サンプル: モデルのダウンロード(難易度:⭐)

BASH
# Llama 3 8B モデルをダウンロード(約 4.7 GB)
ollama pull llama3

# Qwen2 7B をダウンロード
ollama pull qwen2

# Mistral 7B をダウンロード
ollama pull mistral

出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)

ダウンロードのプログレスバーには速度と残り時間が表示されます。モデルは ~/.ollama/models ディレクトリに保存されます。

▶ サンプル: コマンドライン対話(難易度:⭐)

BASH
# Llama 3 で対話モードを開始
ollama run llama3

# >>> ニューラルネットワークを 1 段落で説明してください。
# ニューラルネットワークは、人間の脳内の生物学的ニューロンの働きを
# 参考にした計算モデルです。相互接続されたノード(ニューロン)の層からなり、
# 情報を処理します…

# /bye と入力して終了
# >>> /bye

出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)

▶ サンプル: インストール済みモデルの表示(難易度 ⭐)

BASH
# ダウンロード済みのすべてのモデルを一覧表示
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 Google 8K セキュリティが良く、軽量で効率的
Phi-3 3.8B / 14B Microsoft 4K〜128K コンパクトだが高性能、エッジコンピューティングに適する

(3) モデルの選び方




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 ライブラリのインストール

BASH
pip install ollama

(2) 2 つの呼び出し方法

Ollama は Python からの 2 つの呼び出し方法をサポートします。

▶ サンプル: Python でローカルモデルを呼び出す(難易度:⭐)

PYTHON
import ollama

# ローカルの Llama 3 と簡単なチャット
response = ollama.chat(
    model="llama3",
    messages=[
        {"role": "user", "content": "量子コンピューティングを 1 文で説明してください。"},
    ],
)

print(response["message"]["content"])

出力: (例を実行して実際の出力を確認するか、上のコードコメントの期待出力メモを参照してください。)

▶ サンプル: ローカルとクラウド API のレイテンシ比較(難易度:⭐⭐)

PYTHON
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 での直接呼び出し(難易度:⭐⭐)

PYTHON
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 との出力品質の違いを比較。

PYTHON
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 '--- 異なる ---'}")

実行前に以下を確認してください。

BASH
# ステップ 1: Ollama をインストールして起動
ollama serve

# ステップ 2: モデルをダウンロード(別のターミナルで)
ollama pull llama3

# ステップ 3: Python 依存関係をインストール
pip install ollama openai

# ステップ 4: 翻訳ツールを実行
python local_translator.py

期待される出力の例:

TEXT 📖 参照専用
============================================================
ローカル 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 は医療診断分野を革命している。
    --- 異なる ---

両方の翻訳は正確ですが、言葉遣いとスタイルが異なります——ローカルモデルでも日常の翻訳ニーズを十分に満たせます。


❓ よくある質問

Q LLM をローカルで動かすのにどんなハードウェアが必要?
A 7B Q4 量子化モデル(約 4 GB)を動かすには最低 8 GB の RAM が必要です。より快適にするには 16 GB の RAM または 8 GB VRAM の GPU を推奨します。70B モデルには最低 48 GB の VRAM が必要です。
Q Ollama は無料?
A はい、Ollama は完全に無料かつオープンソース(MIT ライセンス)で、サポートされるすべてのモデルもオープンソースで無料、隠れた料金はありません。
Q 量子化でモデル品質は下がる?
A はい、しかし影響は最小限です。Q4 量子化ではベンチマークスコアで通常 1〜3% の低下にとどまり、ほとんどの実用タスクで差は実質的に検知できません。Q8 量子化はほぼロスレスです。
Q ローカルモデルと GPT-4 の差は大きい?
A 7B 級のローカルモデルは複雑な推論や長文生成で GPT-4 に大きく劣りますが、翻訳・要約・分類などのタスクではすでに GPT-3.5 に近いレベルに達しています。70B 級モデルなら GPT-4 に迫る性能が出ます。
Q 8 GB の RAM で動くモデルは?
A 8 GB RAM で 3B Q4 モデル(Phi-3 mini)を快適に動かせ、7B Q4 モデルも動きますが遅めです。7B モデルを動かすには少なくとも 16 GB RAM または 8 GB VRAM の GPU を推奨します。
Q Ollama は GPU 加速をサポート?
A はい。macOS は自動的に Metal を使って加速し、Linux/Windows は NVIDIA GPU 検出時に自動的に CUDA 加速を使います。追加の設定は不要です。

📖 まとめ


📝 練習問題

基礎(⭐)

Ollama をインストールしてモデルをダウンロードし、コマンドラインで対話してみなさい。

BASH
# ステップ 1: https://ollama.com から Ollama をインストール

# ステップ 2: モデルをダウンロード
ollama pull llama3

# ステップ 3: チャットを開始
ollama run llama3

# >>> 火星について面白い事実を 3 つ教えてください。

# ステップ 4: インストール済みモデルを一覧表示
ollama list

応用(⭐⭐)

Python ollama ライブラリでローカルモデルを呼び出し翻訳させ、対話型翻訳ツールを実装しなさい。

PYTHON
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 の出力の違いを比較し、分析レポートを書きなさい。

PYTHON
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()
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%