OllamaでLLMをローカル実行する完全ガイド — 本番運用6ヶ月の知見

OllamaでLLMをローカル実行する完全ガイド — 本番運用6ヶ月の知見

まず5分で動かしてみる

半年前、初めてOllamaをサーバーに入れたとき「なぜもっと早くやらなかったのか」と後悔した。セットアップが拍子抜けするほど簡単で、しかもOpenAI APIと同じインターフェースでローカルLLMを呼び出せる。実用性という点では、これ以上ない選択肢だった。

まず手を動かそう。Linuxであれば1コマンドでインストールできる。

# Ollamaのインストール(Linux / macOS共通)
curl -fsSL https://ollama.com/install.sh | sh

# インストール確認
ollama --version

Windowsの場合は公式サイト(ollama.com)からインストーラーをダウンロードして実行すればいい。

インストールが終わったらモデルを落として起動するだけだ。

# Llama 3.2(3Bパラメータ)を取得して実行
ollama run llama3.2

# 対話モードが起動する
>>> 自己紹介してください

これだけ。数GBのダウンロードが終われば、すぐにローカルでLLMと会話できる。APIキーも不要、クラウド送信も一切なし。

Ollamaのアーキテクチャを理解する

バックグラウンドで動くデーモンプロセス

インストール直後から、OllamaはHTTPサーバーとしてバックグラウンドで常駐している。デフォルトポートは11434。まず動いているか確認してみよう。

# サービスの状態確認
systemctl status ollama

# APIが生きているか確認
curl http://localhost:11434/api/tags

このREST APIがOllamaの核心部分だ。OpenAI互換エンドポイント(/v1/chat/completions)も実装されているので、既存のOpenAI SDKをそのまま使い回せる。移行コストがほぼゼロなのが強い。

モデルの管理コマンド

Dockerを使ったことがあれば、すぐ馴染める操作感だ。

# 利用可能なモデル一覧(ローカルにあるもの)
ollama list

# モデルのダウンロードのみ(実行しない)
ollama pull mistral

# モデルの削除
ollama rm llama3.2

# モデルの詳細情報
ollama show llama3.2

# 現在ロードされているモデルの確認
ollama ps

モデルファイルは~/.ollama/models/に保存される。サーバー運用時は別ディスクにマウントしてシンボリックリンクを張るとディスク管理が楽になる。

主要モデルの選び方

6ヶ月使ってきた中で、用途別のおすすめを整理した。

  • Llama 3.2 3B — RAM 4GB以上で動く軽量モデル。開発環境や検証用途に最適
  • Llama 3.1 8B — 日本語も比較的まともに扱える。16GB RAMがあれば快適に動く
  • Mistral 7B — 英語のコード生成に強く、推論速度が速い。英語タスクならまずこれを試す
  • CodeLlama 13B — コーディング特化。コードレビューや補完に使っている
  • Gemma 2 9B — Googleが出したモデル。日本語品質が上がっている

APIを使った応用

curlで直接叩く

REST APIなのでcurlで気軽に試せる。

# チャット形式でリクエスト
curl http://localhost:11434/api/chat \
  -d '{
    "model": "llama3.2",
    "messages": [
      {"role": "user", "content": "Pythonでフィボナッチ数列を書いて"}
    ],
    "stream": false
  }'

# ストリーミングレスポンス(stream: trueがデフォルト)
curl http://localhost:11434/api/generate \
  -d '{"model": "llama3.2", "prompt": "Hello", "stream": true}'

PythonからOpenAI互換APIで呼び出す

本番で一番活用しているのがこの方法だ。既存のOpenAI SDK用コードをほぼ変更なしで動かせる。

from openai import OpenAI

# ベースURLをローカルに向けるだけ
client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama"  # 実際には使われないがSDKの仕様上必要
)

response = client.chat.completions.create(
    model="llama3.2",
    messages=[
        {"role": "system", "content": "あなたは優秀なITエンジニアです。"},
        {"role": "user", "content": "DockerとPodmanの違いを教えて"}
    ],
    temperature=0.7
)

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

環境変数1つでクラウドLLMとローカルLLMを切り替える設計が簡単に作れる。開発中はOllama、本番はGPT-4、という使い分けをしているチームもある。コスト削減と可用性の両立に役立つ。

LangChainとの連携

LangChainから使う場合はlangchain-ollamaパッケージを使う。インターフェースは他のLLMと同じなので、既存のチェーンやエージェントをそのまま差し替えられる。

from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage

llm = ChatOllama(model="llama3.1", temperature=0)

messages = [HumanMessage(content="Linuxのinotifyについて説明して")]
response = llm.invoke(messages)
print(response.content)

Open WebUIでChatGPT風UIを立ち上げる

チームで使う場合はWeb UIがあると便利だ。DockerでOpen WebUIをサクッと立てられる。

# OllamaとOpen WebUIをDockerで一緒に起動
docker run -d \
  -p 3000:8080 \
  --add-host=host.docker.internal:host-gateway \
  -e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

localhost:3000にアクセスすればChatGPTライクなUIが使える。チームメンバーへの社内展開もこれで十分だ。

本番運用で気づいた実践Tips

GPUメモリのチューニング

GPUがあるサーバーで動かすと体感が全然違う。CPU処理と比べてトークン生成速度が5〜10倍上がることも珍しくない。NVIDIAのGPUがあれば自動でCUDAを使ってくれるが、いくつか設定を知っておくと良い。

# GPU使用状況の確認
nvidia-smi
ollama ps  # ロード済みモデルとGPU使用量

# モデルをGPUに完全ロードする(レイヤー数を指定)
OLLAMA_GPU_LAYERS=99 ollama run llama3.1

モデルのサイズがGPUのVRAMに収まらない場合、OllamaはCPUとGPUに分散してロードする。8GBのVRAMで13Bモデル(Q4量子化で約7〜8GB)を動かすと、VRAMを使い切った分のレイヤーがCPU処理に回る。速度は落ちるが動くには動く。

同時リクエストとタイムアウト管理

APIサーバーとして使う場合、同時リクエストに注意が必要だ。LLMは1リクエストでCPU/GPUリソースをかなり使うので、デフォルトでは順番待ちになる。

# 環境変数でパラレルリクエスト数を設定(デフォルト: 1)
OLLAMA_NUM_PARALLEL=2 ollama serve

# モデルのアンロードタイムアウト(デフォルト: 5分)
OLLAMA_KEEP_ALIVE=10m ollama serve

# アイドル時にすぐアンロードしたい場合
OLLAMA_KEEP_ALIVE=0 ollama serve

外部公開時のセキュリティ

デフォルトでOllamaはlocalhostのみバインドする。外部からアクセスさせたい場合はNginxのリバースプロキシ経由にするべきだ。直接0.0.0.0で公開すると認証なしで誰でも使えてしまう。

# Nginxの設定例(/etc/nginx/sites-available/ollama)
server {
    listen 443 ssl;
    server_name ollama.example.com;

    # SSL設定(Let's Encrypt等)
    ssl_certificate /etc/letsencrypt/live/ollama.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ollama.example.com/privkey.pem;

    # Basic認証
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        proxy_pass http://127.0.0.1:11434;
        proxy_set_header Host $host;
        proxy_read_timeout 300s;  # LLMのレスポンスは遅いのでタイムアウトを長めに
    }
}

Modelfileでカスタムモデルを作る

用途が決まっているなら、システムプロンプトや温度設定を焼き込んだカスタムモデルを作っておくと便利だ。毎回プロンプトを設定する手間が省ける。

# Modelfile の例
cat > Modelfile << 'EOF'
FROM llama3.1

SYSTEM """
あなたはLinux/Dockerの専門家です。
簡潔で実践的な回答を日本語でしてください。
コードは必ずコードブロックで囲んでください。
"""

PARAMETER temperature 0.3
PARAMETER num_ctx 4096
EOF

# カスタムモデルをビルド
ollama create it-expert -f Modelfile

# 使う
ollama run it-expert

ログとモニタリング

半年間安定して動いているのは、ちゃんとモニタリングしているからだと思っている。問題が起きたとき、ログがなければ原因追跡に何倍も時間がかかる。

# Ollamaのログ確認
journalctl -u ollama -f

# リソース使用量をざっくり確認するスクリプト
watch -n 5 'ollama ps && echo "---" && free -h && nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader 2>/dev/null'

Prometheusを使っているなら、Ollama 0.3以降はメトリクスエンドポイント(/metrics)を持っているのでそれを活用するといい。

運用6ヶ月で見えてきたこと

正直なところ、日本語の品質はGPT-4には及ばない。ただ、コード生成や英語ドキュメントの要約、社内用途のテキスト処理といったタスクでは、コスト面を考えると十分すぎるパフォーマンスだ。

僕の本番環境ではCodeLlamaをCI/CDパイプラインのコードレビュー補助に使っていて、半年間安定した結果を得ている。APIコールのたびにOpenAIにお金を払わなくて済むのが地味にありがたい。

モデルの進化が早いので、3ヶ月前に最適だったモデルが今では選択肢から外れることもある。ollama pullでモデルを更新できるので、定期的に新しいモデルを試してみるのがいい。