ollama-stack について
ollama-stackは、OllamaによるローカルLLM推論環境を構築するスキルです。オフラインやプライバシー重視の開発、個人のハードウェアでのモデル実行に向けて、導入から運用までを扱います。
主な機能
- 01ローカルOllama推論サーバーの構築
- 02APIやSDK経由でのモデル呼び出し
- 03カスタムプロンプト付きモデルの作成
- 04GPUと並列処理設定の調整
- 05モデルの監視と問題の調査
活用シーン
- 01オフライン開発用LLM環境の構築
- 02チーム共有の推論エンドポイント提供
- 03個人のハードウェアでのモデル実行
- 04クラウドAPI利用前のローカル検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill ollama-stackインストール後、Claude Code で/ollama-stackを入力して読み込まれたか確認します。
詳細
Ollama スタック
オフラインでプライバシーを重視するワークフロー向けに、ローカル LLM スタックをデプロイします。
このスキルを使用する場面
次の場合にこのスキルを使用します:
- 開発向けにプライベート/ローカル LLM 推論をセットアップする
- エアギャップ環境の AI 環境を構築する
- 個人用ハードウェア(Mac、Linux、GPU 搭載の Windows)でモデルを実行する
- チームで共有する推論エンドポイントを作成する
- クラウド LLM API の利用を決める前にプロトタイプを作成する
前提条件
- 8 GB 以上の RAM(7B 以上のモデルには 16 GB 以上を推奨)
- GPU アクセラレーションの場合:6 GB 以上の VRAM を搭載した NVIDIA GPU、または Apple Silicon Mac
- Docker(コンテナ化されたデプロイの場合)
- モデル保存用に 20 GB 以上のディスク容量
クイックスタート
# Install Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Start the server
ollama serve
# Pull and run a model
ollama pull llama3.1:8b
ollama run llama3.1:8b "Explain Kubernetes pods in one paragraph"
# List available models
ollama list
# Pull specific quantization
ollama pull llama3.1:8b-instruct-q4_K_M
モデル選択ガイド
| モデル | サイズ | VRAM | 最適な用途 |
|---|---|---|---|
llama3.1:8b | 4.7 GB | 6 GB | 一般的なチャット、コーディング |
llama3.1:70b | 40 GB | 48 GB | 複雑な推論 |
codellama:13b | 7.4 GB | 10 GB | コード生成 |
mistral:7b | 4.1 GB | 6 GB | 高速な一般タスク |
mixtral:8x7b | 26 GB | 32 GB | 高品質な MoE |
nomic-embed-text | 274 MB | 1 GB | RAG 用の埋め込み |
llava:13b | 8 GB | 10 GB | 画像認識+テキスト |
deepseek-coder-v2:16b | 9 GB | 12 GB | コード生成 |
qwen2.5:14b | 9 GB | 12 GB | 多言語、推論 |
Docker Compose — フルスタック
# docker-compose.yml
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
environment:
- OLLAMA_HOST=0.0.0.0
- OLLAMA_NUM_PARALLEL=4
- OLLAMA_MAX_LOADED_MODELS=2
- OLLAMA_FLASH_ATTENTION=1
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 3
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- webui_data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_AUTH=true
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:-change-me-in-production}
- DEFAULT_MODELS=llama3.1:8b
depends_on:
ollama:
condition: service_healthy
litellm:
image: ghcr.io/berriai/litellm:main-latest
container_name: litellm
restart: unless-stopped
ports:
- "4000:4000"
volumes:
- ./litellm-config.yaml:/app/config.yaml
command: ["--config", "/app/config.yaml"]
depends_on:
ollama:
condition: service_healthy
volumes:
ollama_data:
webui_data:
LiteLLM プロキシ設定
# litellm-config.yaml
model_list:
- model_name: llama3
litellm_params:
model: ollama/llama3.1:8b
api_base: http://ollama:11434
- model_name: codellama
litellm_params:
model: ollama/codellama:13b
api_base: http://ollama:11434
- model_name: embeddings
litellm_params:
model: ollama/nomic-embed-text
api_base: http://ollama:11434
general_settings:
master_key: sk-local-dev-key
max_budget: 0 # unlimited for local
API の使用方法
Ollama は OpenAI 互換の API を公開します:
# Chat completion
curl http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama3.1:8b",
"messages": [{"role": "user", "content": "Hello"}],
"stream": false
}'
# Embeddings
curl http://localhost:11434/v1/embeddings \
-H "Content-Type: application/json" \
-d '{
"model": "nomic-embed-text",
"input": "The quick brown fox"
}'
# List models
curl http://localhost:11434/api/tags
Python クライアント
# pip install ollama
import ollama
# Chat
response = ollama.chat(
model="llama3.1:8b",
messages=[{"role": "user", "content": "Explain Docker in 3 sentences"}],
)
print(response["message"]["content"])
# Streaming
for chunk in ollama.chat(
model="llama3.1:8b",
messages=[{"role": "user", "content": "Write a haiku about containers"}],
stream=True,
):
print(chunk["message"]["content"], end="", flush=True)
# Embeddings
result = ollama.embed(model="nomic-embed-text", input="Hello world")
print(f"Embedding dimensions: {len(result['embeddings'][0])}")
OpenAI SDK との互換性
from openai import OpenAI
client = OpenAI(base_url="http://localhost:11434/v1", api_key="unused")
response = client.chat.completions.create(
model="llama3.1:8b",
messages=[{"role": "user", "content": "Hello"}],
)
print(response.choices[0].message.content)
カスタム Modelfile
カスタムのシステムプロンプトとパラメーターを使って、特化したモデルを作成します:
# Modelfile.devops-assistant
FROM llama3.1:8b
SYSTEM """You are a DevOps expert assistant. You provide concise, production-ready
advice about infrastructure, CI/CD, containers, and cloud services.
Always include relevant commands and config examples."""
PARAMETER temperature 0.3
PARAMETER top_p 0.9
PARAMETER num_ctx 8192
PARAMETER repeat_penalty 1.1
# Build and use custom model
ollama create devops-assistant -f Modelfile.devops-assistant
ollama run devops-assistant "Set up a GitHub Actions workflow for Docker builds"
GPU の設定
NVIDIA
# Verify GPU access
nvidia-smi
ollama run llama3.1:8b --verbose # Shows GPU layers loaded
# Environment tuning
export OLLAMA_NUM_PARALLEL=4 # Concurrent requests
export OLLAMA_MAX_LOADED_MODELS=2 # Models in VRAM
export OLLAMA_FLASH_ATTENTION=1 # Faster attention
export CUDA_VISIBLE_DEVICES=0,1 # Multi-GPU
Apple Silicon
# Metal acceleration is automatic on macOS
# Verify with:
ollama run llama3.1:8b --verbose
# Look for: "metal" in the output
# Optimize for unified memory
export OLLAMA_NUM_PARALLEL=2 # Keep memory headroom
export OLLAMA_MAX_LOADED_MODELS=1 # One model at a time on 16GB
モニタリング
# Check running models and memory usage
curl http://localhost:11434/api/ps
# Prometheus metrics (if enabled)
curl http://localhost:11434/metrics
# Quick health check script
#!/bin/bash
response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:11434/api/tags)
if [ "$response" = "200" ]; then
echo "Ollama is healthy"
curl -s http://localhost:11434/api/ps | python3 -m json.tool
else
echo "Ollama is down (HTTP $response)"
exit 1
fi
Systemd サービス
# /etc/systemd/system/ollama.service
[Unit]
Description=Ollama LLM Server
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OLLAMA_FLASH_ATTENTION=1"
LimitNOFILE=65535
[Install]
WantedBy=default.target
sudo useradd -r -s /bin/false -m -d /usr/share/ollama ollama
sudo systemctl daemon-reload
sudo systemctl enable --now ollama
sudo systemctl status ollama
セキュリティ
- 本番環境では
127.0.0.1にバインドし(デフォルト)、リモートアクセスにはリバースプロキシを使用します - Open WebUI で
WEBUI_AUTH=trueを設定します - リモートアクセスには TLS 対応の nginx を使用します:
server {
listen 443 ssl;
server_name llm.internal.example.com;
ssl_certificate /etc/ssl/certs/llm.pem;
ssl_certificate_key /etc/ssl/private/llm.key;
location / {
proxy_pass http://127.0.0.1:11434;
proxy_set_header Host $host;
proxy_buffering off; # Required for streaming
proxy_read_timeout 600s; # Long model responses
allow 10.0.0.0/8;
deny all;
}
}
トラブルシューティング
| 問題 | 解決方法 |
|---|---|
| モデルの動作が遅すぎる | より小さい量子化(q4_K_M)を使用し、フラッシュアテンションを有効にします |
| メモリ不足 | num_ctx を減らし、より小さいモデルを使用し、OLLAMA_MAX_LOADED_MODELS=1 を設定します |
| GPU が検出されない | nvidia-smi を確認し、CUDA ドライバーを再インストールして、Docker の GPU ランタイムを確認します |
| 接続が拒否される | OLLAMA_HOST の設定を確認し、ファイアウォールのルールを確認します |
| モデルのダウンロードに失敗する | ディスク容量を確認し、自己署名レジストリの場合は ollama pull --insecure を使用して再試行します |
関連スキル
- mac-mini-llm-lab — Apple Silicon の最適化
- docker-compose — サービスのオーケストレーション
- vllm-server — 高スループットの本番推論
- llm-gateway — 統一 API ルーティング
コメント
Markdown 対応