🔥 新作首發 🎮 天堂私服 YOLOv8 物件偵測實戰 — 從資料蒐集、模型訓練到即時偵測 立即閱讀 →
熱門系列
Like Share Discussion Bookmark Smile

J.J. Huang   2026-04-01   Python OpenCV 07.物件偵測與辨識篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV GPU 加速與效能優化

📚 前言

在上一篇 避免過擬合 中,我們學會了讓模型訓練更穩定的技巧。
這一篇介紹 GPU 加速與效能優化,讓訓練速度大幅提升。

使用 GPU 訓練比 CPU 快數十倍,對於大型資料集或深層模型而言幾乎是必要的。
但 GPU 環境的設定也是新手最常卡關的環節,這一篇將完整說明設定流程與常見問題。

🔎 GPU 訓練的前提條件


圖:GPU 加速環境需求 ─ NVIDIA GPU、CUDA Toolkit、cuDNN 與版本對應關係

💻 環境安裝與驗證

確認 CUDA 版本


圖:使用 nvidia-sminvcc --version 指令確認目前安裝的 CUDA 版本

1
2
3
4
5
nvidia-smi
# 右上角顯示的 CUDA Version 是顯示驅動支援的最高版本,非目前安裝版本

nvcc --version
# 顯示目前安裝的 CUDA Toolkit 版本

💡 如果尚未安裝可以參考CUDA 與 cuDNN:用途與環境安裝

⚠️ 重要警告

PyTorch 和 TensorFlow 的 GPU 版本非常容易互相衝突,導致 NumPy 錯誤、import 失敗等問題。
因此,強烈建議一次只安裝一個框架(推薦新手先安裝 PyTorch)。

本篇會先教你正確的移除與安裝順序,再分別介紹 PyTorch 和 TensorFlow 的 GPU 使用方式。

🗑 徹底移除舊版本

在安裝任何 GPU 版本之前,請先執行以下指令,清除之前安裝的舊版本

1
2
3
4
5
6
7
8
# 徹底移除 PyTorch 和 TensorFlow(避免版本衝突)
pip uninstall torch torchvision torchaudio tensorflow tensorflow[and-cuda] numpy -y

# 清除 pip 下載快取
pip cache purge

# 升級必要工具
pip install --upgrade pip setuptools wheel typing_extensions

🔹 安裝 PyTorch GPU 版本

前往 PyTorch 官方安裝頁面 選擇對應的 CUDA 版本,例如:

1
2
# CUDA 13.0
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu130

👀 驗證 PyTorch GPU 是否可用

1
2
3
4
5
6
7
8
9
# verify_gpu.py
# PyTorch
import torch
print(f"CUDA 可用:{torch.cuda.is_available()}")
print(f"GPU 數量:{torch.cuda.device_count()}")
if torch.cuda.is_available():
print(f"GPU 名稱:{torch.cuda.get_device_name(0)}")
print(f"PyTorch 版本:{torch.__version__}")
print(f"CUDA 版本:{torch.version.cuda}")


圖:使用 PyTorch 查詢 GPU 可用性、數量、名稱及版本資訊,驗證 GPU 環境正常

💻 PyTorch — GPU 訓練設定

🔸 基本用法

  • 自動偵測 CUDA 裝置後將模型與訓練資料移至 GPU,實現 PyTorch 基本 GPU 訓練
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # gpu_pytorch_basic.py
    import torch

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print(f"使用裝置:{device}")

    # 模型移到 GPU
    model = model.to(device)

    # 訓練迴圈中,資料也要移到 GPU
    for inputs, labels in train_loader:
    inputs = inputs.to(device)
    labels = labels.to(device)
    # ...

🔸 多 GPU 訓練(DataParallel)

  • 偵測到多張 GPU 時使用 DataParallel 自動將模型複製到所有 GPU 進行並行訓練
    1
    2
    3
    4
    5
    6
    # gpu_pytorch_dataparallel.py
    if torch.cuda.device_count() > 1:
    print(f"使用 {torch.cuda.device_count()} 張 GPU")
    model = torch.nn.DataParallel(model)

    model = model.to(device)

🔸 混合精度訓練(AMP)

  • 使用 PyTorch AMP 混合精度訓練,以 FP16 計算前向傳播與 GradScaler 縮放梯度節省 GPU 記憶體
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # amp_pytorch.py
    from torch.cuda.amp import autocast, GradScaler

    scaler = GradScaler()

    for inputs, labels in train_loader:
    inputs, labels = inputs.to(device), labels.to(device)
    optimizer.zero_grad()

    with autocast(): # 自動使用 FP16
    outputs = model(inputs)
    loss = criterion(outputs, labels)

    scaler.scale(loss).backward() # 縮放梯度
    scaler.step(optimizer)
    scaler.update()

    ⚠️ 使用 FP16 與 FP32 混合精度,可節省約 50% 的 GPU 記憶體並加速訓練

🔸 DataLoader 效能優化

  • 設定 DataLoader 的 num_workers、pin_memory 與 prefetch_factor,加速資料載入與 CPU 至 GPU 的傳輸
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # dataloader_optimize.py
    train_loader = DataLoader(
    train_dataset,
    batch_size=64,
    shuffle=True,
    num_workers=4, # 多執行緒讀取(Linux/macOS)
    pin_memory=True, # 固定記憶體,加速 CPU→GPU 傳輸
    prefetch_factor=2 # 預先載入的批次數
    )

    ⚠️ num_workers 在 Windows 上請設為 0,否則可能造成死鎖。

🔹 安裝 TensorFlow GPU 版本

⚠️ 重要提醒:
在 Windows 原生環境中安裝 TensorFlow GPU 版本,過程極為容易遇到版本衝突(如 NumPy、CUDA、_ARRAY_API 等錯誤),即使多次移除重裝也常常無法順利讓 GPU 被辨識。
作者實際測試多次後,發現安裝過程非常耗時且不穩定,因此決定在本文中放棄 Windows 原生安裝 TensorFlow GPU
若你未來有強烈需求使用 TensorFlow + GPU,雖然 WSL2 是較穩定的選擇,但設定過程同樣較為麻煩。
後續內容將以 PyTorch GPU 為主進行教學,推薦新手優先使用 PyTorch。

TensorFlow 安裝指令:

1
2
# TensorFlow 2.10 以後在 Windows 原生不支援 GPU,需使用 WSL2 或 Linux
pip install tensorflow[and-cuda] # TensorFlow 2.12+

👀 驗證 TensorFlow GPU 是否可用

1
2
3
4
5
6
# verify_gpu.py
# TensorFlow
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
print(f"GPU 裝置:{gpus}")
print(f"TensorFlow 版本:{tf.__version__}")

💻 TensorFlow — GPU 訓練設定

🔸 基本用法

  • 查詢 TensorFlow 可用的 GPU 裝置,並使用 tf.device 明確指定在 GPU:0 上執行訓練
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # gpu_tensorflow_basic.py
    import tensorflow as tf

    # 確認 GPU 可用
    print(tf.config.list_physical_devices("GPU"))

    # 明確指定使用 GPU 0
    with tf.device("/GPU:0"):
    model.fit(train_ds, validation_data=val_ds, epochs=10)

    ⚠️ TensorFlow 預設會自動使用 GPU,無需額外設定。

🔸 限制 GPU 記憶體成長(避免 OOM)

  • 設定 TensorFlow GPU 記憶體動態成長,避免程式啟動時即佔用全部 GPU 記憶體導致 OOM
    1
    2
    3
    4
    5
    # gpu_tensorflow_memory_growth.py
    gpus = tf.config.list_physical_devices("GPU")
    if gpus:
    for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)

🔸 混合精度訓練

  • 啟用 TensorFlow mixed_float16 全域混合精度策略,並以 LossScaleOptimizer 包裝優化器防止梯度下溢
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # amp_tensorflow.py
    from tensorflow.keras import mixed_precision

    mixed_precision.set_global_policy("mixed_float16")

    # 分類頭的最後一層需使用 float32
    outputs = layers.Dense(NUM_CLASSES, activation="softmax", dtype="float32")(x)

    # 優化器需搭配 LossScaleOptimizer
    optimizer = tf.keras.optimizers.Adam(1e-3)
    optimizer = mixed_precision.LossScaleOptimizer(optimizer)

🔸 tf.data 效能優化

  • 使用 tf.data 的 cache、shuffle 與 prefetch 優化資料管線,讓 GPU 不需等待資料載入
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # tfdata_optimize.py
    AUTOTUNE = tf.data.AUTOTUNE

    train_ds = (
    train_ds
    .cache() # 快取資料至記憶體(適合小資料集)
    .shuffle(buffer_size=1000)
    .prefetch(buffer_size=AUTOTUNE) # 預先載入下一批次
    )

🔧 常見問題排除


圖:常見 GPU 錯誤與解決方法 ─ CUDA out of memory、device-side assert 等問題快速排查

💻 監控 GPU 使用狀況

1
2
3
4
5
6
7
8
9
10
11
# 即時監控 GPU 使用率與記憶體
# 每 1 秒刷新一次 + 清屏(畫面比較乾淨)
while ($true) {
Clear-Host # 清空畫面
nvidia-smi
Start-Sleep -Seconds 1
}

# 或使用 gpustat(更簡潔的顯示)
pip install gpustat
gpustat -i 1


圖:使用 gpustat 即時監控 GPU 記憶體使用狀況(每秒更新一次)

1
2
3
4
5
# monitor_gpu_memory.py
# 在 Python 中查詢 GPU 記憶體使用量
import torch
print(f"已分配:{torch.cuda.memory_allocated() / 1024**2:.1f} MB")
print(f"已快取:{torch.cuda.memory_reserved() / 1024**2:.1f} MB")


圖:在 Python 中查詢 PyTorch GPU 已分配與已快取的記憶體用量,監控訓練時的記憶體使用狀況

⚠️ 注意事項

  • PyTorch 在 Windows 原生支援 GPU,但 num_workers 需設為 0。
  • TensorFlow 在 Windows 原生自 2.11 之後不支援 GPU,建議改用 WSL2 或 Linux 環境。
  • CUDA 與框架版本必須嚴格對應:版本不符會導致安裝後 GPU 仍無法使用。建議先確認 GPU 驅動版本,再選擇對應的 CUDA Toolkit 與框架版本。
  • 混合精度訓練並非萬能:部分模型對 FP16 精度敏感,使用前需測試訓練是否穩定。

🎯 結語

GPU 加速是深度學習訓練的標配。掌握環境設定、混合精度訓練與 DataLoader 優化後,訓練速度可大幅提升。
至此,模型選擇與訓練的所有通用子主題已全部完成,接下來進入 模型使用與推論 章節。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
PyTorch 官方文件 — CUDA semantics
PyTorch 官方文件 — Automatic Mixed Precision
TensorFlow 官方文件 — GPU support
TensorFlow 官方文件 — Mixed precision