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が占有するのを防げる。

📋 前提条件: まず以下を習得していること

1. 学べること


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フォールバックが起きていないか確認。

100%
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の中間。

📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐):自分のマシンでGPU高速化が動作しているか確認し、--verboseでCPUとGPUの推論速度を比較する。
  2. 中級(難易度 ⭐⭐):自分のGPU VRAM容量に基づいて、実行可能な最大モデル(パラメータ数 + 量子化レベル)を計算し、実際にテストして検証する。
  3. 上級(難易度 ⭐⭐⭐):マルチGPU環境で異なるGPU割り当て戦略(単一GPU vs マルチGPU)をテストし、推論速度、初回トークンレイテンシ、メモリ使用量を記録し、パフォーマンス比較レポートを出力する。
Web-Tutorial.com

Web-Tutorial 技術チーム

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

100%