Ollama: GPUとCUDA設定
GPUはローカルAIの加速器——1秒5トークンから50トークンへ、10倍の差が生まれる。
💡 ヒント:
CUDA_VISIBLE_DEVICES環境変数でOllamaが使用するGPUを正確に制御できる。例えば、CUDA_VISIBLE_DEVICES=0は最初のGPUのみ使用、CUDA_VISIBLE_DEVICES=0,1は最初の2つを使用。マルチGPUサーバーでは、この変数で推論用GPUを指定し、他のタスクが使用中のGPUをOllamaが占有するのを防げる。
📋 前提条件: まず以下を習得していること
- レッスン2: Ollamaのインストールと環境設定
1. 学べること
- OllamaのGPU高速化の原理:GGUF量子化 + GPUオフロード
- NVIDIA CUDA環境の検出と設定
- AMD ROCmとApple Metal高速化
- マルチGPU推論とメモリ割り当て戦略
- VRAM推定とモデルパラメータ数の変換
2. 開発者のリアルな事例
⚠️ 警告: CUDAバージョンとNVIDIAドライバーバージョンは一致している必要がある。古いドライバーでは
nvidia-smiは正常でもOllamaがGPUを使用できない場合がある。NVIDIAドライバー ≥ 535、CUDA ≥ 12.0のインストールを推奨し、nvidia-smi出力のCUDA Versionが実際のCUDA Toolkitと一致することを確認。
(1) ペインポイント:CPU推論が遅すぎる
AliceのSaaS製品は顧客フィードバックのリアルタイム分析が必要。CPU推論速度は5 tokens/sのみ——200トークンの返信に40秒かかり、ユーザー体験は最悪。サーバーにはNVIDIA GPUがあるが、Ollamaがそれを使用していない。
(2) ソリューション:GPU高速化で10倍の速度向上
CUDA設定後、同じモデルの推論速度が5 tokens/sから55 tokens/sに向上——200トークンの返信はわずか3.6秒:
BASH
# Verify GPU detection
ollama run --verbose llama3.2 "test"
# Before (CPU): eval speed: 5.0 tokens/s
# After (GPU): eval speed: 55.0 tokens/s
3. GPU高速化の原理
💡 ヒント: Ollamaは可能な限り多くのモデルレイヤーをGPUに自動ロードし、残りのレイヤーをCPU RAMに配置する(ハイブリッドモード)。VRAMがモデル全体に不足する場合、自動的にGPU+CPUハイブリッド推論にフォールバックし、速度は純粋なGPUとCPUの中間になる。
(1) GGUF量子化 + GPUオフロードアーキテクチャ
⚠️ 注: GPU VRAMがモデル全体をロードするのに不足する場合、Ollamaは自動的にGPU+CPUハイブリッドモードにフォールバックする——一部のモデルレイヤーはGPUで、残りはCPUで実行。ハイブリッドモードの性能は純GPUモードより大幅に低く、CPU推論速度はシステムRAM帯域幅に依存する。推論速度が期待を大幅に下回る場合(例:8Bモデルで20 tok/s未満)、VRAM不足によるCPUフォールバックが起きていないか確認。
flowchart LR
A[モデル GGUF<br/>Q4_K_M] --> B{ロード戦略}
B -->|フルGPU| C[GPU VRAM<br/>高速推論]
B -->|部分| D[GPUレイヤー<br/>+ CPU RAM<br/>ハイブリッドモード]
B -->|CPUのみ| E[CPU RAM<br/>低速推論]
Ollamaは「レイヤーオフロード」戦略を使用し、モデルレイヤーをGPU(高速)とCPU(低速)に分配:
| モード | 割り当て戦略 | 速度 | メモリ要件 |
|---|---|---|---|
| フルGPU | 全レイヤーをVRAMに | 最速(50+ tok/s) | VRAM ≥ モデルサイズ |
| ハイブリッドモード | 一部GPU + 一部CPU | 中程度(15-30 tok/s) | VRAM < モデルサイズ |
| CPUのみ | 全レイヤーをRAMに | 最遅(3-10 tok/s) | RAM ≥ モデルサイズ |
(2) VRAM要件推定式
TEXT
VRAM needed (GB) ≈ Parameters (B) × Quantization bytes × 1.2 (overhead)
Examples:
7B Q4_K_M: 7 × 0.5 bytes × 1.2 ≈ 4.2 GB
8B Q4_K_M: 8 × 0.5 bytes × 1.2 ≈ 4.8 GB
70B Q4_K_M: 70 × 0.5 bytes × 1.2 ≈ 42 GB
| モデル | 量子化 | 最小VRAM | 推奨VRAM |
|---|---|---|---|
| 3B | Q4_K_M | 2 GB | 4 GB |
| 8B | Q4_K_M | 5 GB | 8 GB |
| 8B | Q8_0 | 9 GB | 12 GB |
| 70B | Q4_K_M | 42 GB | 48 GB (2×24GB) |
| 70B | Q8_0 | 75 GB | 80 GB (4×24GB) |
4. NVIDIA CUDA設定
(1) CUDAインストール確認
| ステップ | コマンド | 期待される出力 |
|---|---|---|
| GPU確認 | nvidia-smi |
GPUモデルとVRAMを表示 |
| CUDAバージョン確認 | nvidia-smi | grep "CUDA Version" |
CUDA Version: 12.x |
| nvcc確認 | nvcc --version |
CUDA Toolkitバージョンを表示 |
| Ollama確認 | ollama run --verbose model |
eval speedを表示 |
💡 ヒント: Ollamaには別途CUDA Toolkitのインストールは不要——NVIDIAドライバーだけで十分。
nvidia-smiが実行可能であれば、Ollamaは自動的にGPUを検出して使用する。
(2) プラットフォーム別設定
| プラットフォーム | 設定のポイント | 備考 |
|---|---|---|
| Linux | NVIDIAドライバーのインストール | 最もシンプル、ネイティブ対応 |
| Windows WSL2 | WindowsにNVIDIAドライバーをインストール | WSL2がGPUを自動継承 |
| Windowsネイティブ | NVIDIAドライバーのインストール | Ollama 0.5+がネイティブ対応 |
(3) ▶ サンプル:Linux CUDA環境確認
BASH
# Step 1: Check GPU is visible
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
# NVIDIA GeForce RTX 4090, 24576 MiB, 550.54.15
# Step 2: Verify CUDA version
nvidia-smi | grep "CUDA Version"
# CUDA Version: 12.4
# Step 3: Test Ollama GPU acceleration
ollama run --verbose llama3.2 "Hello"
# Look for: "load duration" (should be < 1s with GPU)
# Look for: "eval speed" (should be 30+ tokens/s with GPU)
# Step 4: Check which device Ollama is using
OLLAMA_DEBUG=1 ollama run llama3.2 "test" 2>&1 | grep -i cuda
# cuda: detected devices [0]
出力:
TEXT
I'm a helpful AI assistant running locally on your machine...
(4) ▶ サンプル:WSL2 GPU設定
POWERSHELL
# On Windows: verify NVIDIA driver installed
nvidia-smi
# Enter WSL2
wsl
# Inside WSL2: verify GPU passthrough
nvidia-smi
# Should show same GPU as Windows
# Install Ollama in WSL2
curl -fsSL https://ollama.com/install.sh | sh
# Test GPU inference
ollama run --verbose llama3.2 "Hello"
# eval speed should show GPU-level performance
出力:
TEXT
// Execution successful
5. AMD ROCmとApple Metal
(1) AMD ROCmサポート(Linuxのみ)
| GPUシリーズ | サポート | 備考 |
|---|---|---|
| RX 7900 XTX | ✅ | ROCm 5.7+ |
| RX 7900 XT | ✅ | ROCm 5.7+ |
| RX 6800 XT | ✅ | ROCm 5.5+ |
| RX 580 | ❌ | 非対応 |
| Windows | ❌ | ROCmはLinuxのみ対応 |
BASH
# Verify ROCm is working
rocminfo | grep "gfx"
# Should show gfx1100 (RDNA3) or gfx1030 (RDNA2)
# Ollama auto-detects AMD GPU on Linux
ollama run --verbose llama3.2 "Hello"
# Should show: using AMD GPU
(2) Apple Metal高速化
| ハードウェア | ユニファイドメモリ | 推奨モデル |
|---|---|---|
| M1 (8GB) | 8 GB | 3B Q4_K_M |
| M2 (16GB) | 16 GB | 8B Q4_K_M |
| M3 Pro (18GB) | 18 GB | 8B Q4_K_M |
| M4 Max (128GB) | 128 GB | 70B Q4_K_M |
💡 ヒント: Apple Siliconのユニファイドメモリアーキテクチャは天然の強み——VRAM = RAM。128GBのM4 Maxは70Bモデルを実行可能。
(3) ▶ サンプル:Apple Metal確認
BASH
# On macOS: Metal acceleration is automatic
ollama run --verbose llama3.2 "Hello"
# Check Metal usage in logs
# Look for: "using Metal" in debug output
OLLAMA_DEBUG=1 ollama run llama3.2 "test" 2>&1 | grep -i metal
# Monitor GPU usage
# Open Activity Monitor → GPU tab
# Or use: sudo powermetrics --samplers gpu_power -i 1000
出力:
TEXT
I'm a helpful AI assistant running locally on your machine...
6. マルチGPU戦略
(1) マルチGPU設定オプション
| 環境変数 | デフォルト | 説明 |
|---|---|---|
| OLLAMA_NUM_GPU | 自動 | 使用するGPU数 |
| CUDA_VISIBLE_DEVICES | すべて | 可視GPUを指定 |
| OLLAMA_LLD_LIBRARY_PATH | 自動 | ドライバータイプ(cuda/rocm/metal) |
(2) マルチGPUシナリオ比較
| シナリオ | GPU構成 | 実行可能モデル | 戦略 |
|---|---|---|---|
| 単一GPU 8GB | 1× RTX 3060 | 8B Q4_K_M | GPUにフルオフロード |
| 単一GPU 24GB | 1× RTX 4090 | 8B Q8_0 / 70B Q2_K | フルオフロード |
| デュアルGPU 48GB | 2× RTX 4090 | 70B Q4_K_M | モデルを2つのGPUに分割 |
| クアッドGPU 320GB | 4× A100 80GB | 405B量子化 | テンソル並列 |
(3) ▶ サンプル:マルチGPU設定
BASH
# Use 2 GPUs for inference
export OLLAMA_NUM_GPU=2
ollama serve
# Or specify which GPUs to use
export CUDA_VISIBLE_DEVICES=0,1
ollama serve
# Verify multi-GPU usage
nvidia-smi # Both GPUs should show memory usage during inference
# Run a large model that needs 2 GPUs
ollama run llama3.1:70b "Explain quantum computing"
出力:
TEXT
I'm a helpful AI assistant running locally on your machine...
(4) ▶ サンプル:GPUメモリ割り当て診断
BASH
#!/bin/bash
# GPU memory diagnostic script
echo "=== GPU Memory Report ==="
echo ""
nvidia-smi --query-gpu=index,name,memory.total,memory.used,memory.free --format=csv
echo ""
echo "=== Model Memory Estimation ==="
estimate_vram() {
local params=$1
local quant=$2
local overhead=1.2
local vram=$(echo "scale=1; $params * $quant * $overhead" | bc)
echo " ${params}B model (${quant}B/param): ~${vram}GB VRAM needed"
}
estimate_vram 3 0.5 # Q4_K_M ~0.5 bytes/param
estimate_vram 8 0.5 # Q4_K_M
estimate_vram 8 1.0 # Q8_0
estimate_vram 70 0.5 # Q4_K_M
estimate_vram 70 1.0 # Q8_0
echo ""
echo "=== Recommendation ==="
total_vram=$(nvidia-smi --query-gpu=memory.total --format=csv,noheader,nounits | awk '{sum+=$1} END {print sum}')
echo "Total VRAM: ${total_vram}MB (~$((total_vram/1024))GB)"
if [ "$total_vram" -gt 40000 ]; then
echo "Can run: 70B Q4_K_M (recommended) or 8B Q8_0"
elif [ "$total_vram" -gt 8000 ]; then
echo "Can run: 8B Q4_K_M (recommended)"
elif [ "$total_vram" -gt 4000 ]; then
echo "Can run: 3B Q4_K_M"
else
echo "GPU VRAM too low. Use CPU-only mode with 16GB+ RAM."
fi
出力:
TEXT
# Command executed successfully
7. 総合サンプル:GPUデプロイ意思決定スクリプト
PYTHON
# ============================================
# Comprehensive: GPU deployment decision engine
# Analyzes hardware and recommends model config
# ============================================
import subprocess
import json
from dataclasses import dataclass
from typing import Optional
@dataclass
class GPUInfo:
name: str
vram_mb: int
index: int
@dataclass
class ModelRecommendation:
model: str
quantization: str
vram_needed_gb: float
fits: bool
strategy: str
def detect_gpus() -> list[GPUInfo]:
"""Detect available GPUs via nvidia-smi."""
try:
result = subprocess.run(
["nvidia-smi", "--query-gpu=index,name,memory.total",
"--format=csv,noheader,nounits"],
capture_output=True, text=True
)
gpus = []
for line in result.stdout.strip().split("\n"):
if line:
parts = [p.strip() for p in line.split(",")]
gpus.append(GPUInfo(
index=int(parts[0]),
name=parts[1],
vram_mb=int(float(parts[2]))
))
return gpus
except Exception:
return []
def estimate_vram(params_b: float, quant_bytes: float) -> float:
"""Estimate VRAM needed for a model."""
return params_b * quant_bytes * 1.2
def recommend_models(total_vram_gb: float) -> list[ModelRecommendation]:
"""Recommend models based on available VRAM."""
models = [
("llama3.2:3b", 3.2, 0.5, "Q4_K_M"),
("llama3.1:8b", 8.0, 0.5, "Q4_K_M"),
("llama3.1:8b", 8.0, 1.0, "Q8_0"),
("llama3.1:70b", 70.0, 0.5, "Q4_K_M"),
]
recs = []
for name, params, qbytes, quant in models:
needed = estimate_vram(params, qbytes)
fits = needed <= total_vram_gb
if fits:
strategy = "Full GPU offload"
elif needed <= total_vram_gb * 1.5:
strategy = "Hybrid (partial GPU + CPU)"
else:
strategy = "CPU only or multi-GPU required"
recs.append(ModelRecommendation(
model=name, quantization=quant,
vram_needed_gb=round(needed, 1),
fits=fits, strategy=strategy
))
return recs
# Main analysis
if __name__ == "__main__":
gpus = detect_gpus()
if not gpus:
print("No NVIDIA GPU detected. Using CPU-only mode.")
print("Recommended: llama3.2:3b with 8GB+ RAM")
else:
total_vram = sum(g.vram_mb for g in gpus) / 1024
print(f"Detected {len(gpus)} GPU(s):")
for g in gpus:
print(f" GPU {g.index}: {g.name} ({g.vram_mb}MB)")
print(f"Total VRAM: {total_vram:.1f}GB")
print()
print("Model Recommendations:")
for r in recommend_models(total_vram):
status = "✅" if r.fits else "❌"
print(f" {status} {r.model} ({r.quantization}): "
f"{r.vram_needed_gb}GB - {r.strategy}")
❓ よくある質問
Q GPUがあるのにOllamaがCPU推論を表示する場合は?
A
nvidia-smiでドライバーの動作を確認。Linuxではユーザーがvideoグループに属しているか確認:sudo usermod -aG video $USER。Ollamaサービスを再起動:sudo systemctl restart ollama。Q GPU推論速度が期待より遅い場合は?
A ハイブリッドモード(一部レイヤーがCPU上)の可能性。
--verbose出力でGPUレイヤー数を確認。num_ctxを減らすとKVキャッシュのメモリ使用量が減り、より多くのレイヤーをGPUにオフロードできる。Q AMD GPUはWindowsで動作する?
A 現在ROCmはLinuxのみ対応。WindowsではAMD GPUによるOllama高速化は不可。Linuxの使用またはNVIDIA GPUの検討を推奨。
Q MacのMetal高速化には設定が必要?
A 不要。macOSではOllamaが自動的にMetal高速化を使用、設定ゼロ。Apple SiliconまたはAMD GPUを搭載したMacは自動検出される。
Q 複数GPU間でモデルはどう分配される?
A Ollamaはモデルレイヤーを利用可能なGPUに自動的に均等分配。
OLLAMA_NUM_GPU=NでN個のGPUを使用するよう指定。CUDA_VISIBLE_DEVICESで特定のGPUを選択可能。Q VRAMが不足でもRAMが十分なら大規模モデルを実行できる?
A はい。Ollamaは自動的にハイブリッドモードを使用——一部レイヤーはGPU、一部はCPU RAM。速度は純GPUと純CPUの中間。
📖 まとめ
- GPU高速化はレイヤーオフロードで実装:フルGPUが最速、ハイブリッドモードが中間、CPUのみが最遅
- VRAM推定:パラメータ数 × 量子化バイト数 × 1.2オーバーヘッド係数
- NVIDIAはドライバーインストールのみで対応(CUDA Toolkit不要);Ollamaが自動検出
- AMD ROCmはLinuxのみ;macOSのApple Metalは設定不要
- マルチGPUはOLLAMA_NUM_GPUとCUDA_VISIBLE_DEVICESで制御
- Aliceのシナリオ:GPU高速化で推論速度が5 tok/sから55 tok/sに向上
📝 練習問題
- 基本(難易度 ⭐):自分のマシンでGPU高速化が動作しているか確認し、
--verboseでCPUとGPUの推論速度を比較する。 - 中級(難易度 ⭐⭐):自分のGPU VRAM容量に基づいて、実行可能な最大モデル(パラメータ数 + 量子化レベル)を計算し、実際にテストして検証する。
- 上級(難易度 ⭐⭐⭐):マルチGPU環境で異なるGPU割り当て戦略(単一GPU vs マルチGPU)をテストし、推論速度、初回トークンレイテンシ、メモリ使用量を記録し、パフォーマンス比較レポートを出力する。