Python | OpenCV GPU 加速與效能優化
📚 前言
在上一篇 避免過擬合 中,我們學會了讓模型訓練更穩定的技巧。
這一篇介紹 GPU 加速與效能優化,讓訓練速度大幅提升。
使用 GPU 訓練比 CPU 快數十倍,對於大型資料集或深層模型而言幾乎是必要的。
但 GPU 環境的設定也是新手最常卡關的環節,這一篇將完整說明設定流程與常見問題。
🔎 GPU 訓練的前提條件
圖:GPU 加速環境需求 ─ NVIDIA GPU、CUDA Toolkit、cuDNN 與版本對應關係
💻 環境安裝與驗證
確認 CUDA 版本

圖:使用 nvidia-smi 、 nvcc --version 指令確認目前安裝的 CUDA 版本
1 | nvidia-smi |
💡 如果尚未安裝可以參考CUDA 與 cuDNN:用途與環境安裝
⚠️ 重要警告
PyTorch 和 TensorFlow 的 GPU 版本非常容易互相衝突,導致 NumPy 錯誤、import 失敗等問題。
因此,強烈建議一次只安裝一個框架(推薦新手先安裝 PyTorch)。
本篇會先教你正確的移除與安裝順序,再分別介紹 PyTorch 和 TensorFlow 的 GPU 使用方式。
🗑 徹底移除舊版本
在安裝任何 GPU 版本之前,請先執行以下指令,清除之前安裝的舊版本:
1 | # 徹底移除 PyTorch 和 TensorFlow(避免版本衝突) |
🔹 安裝 PyTorch GPU 版本
前往 PyTorch 官方安裝頁面 選擇對應的 CUDA 版本,例如:
1 | # CUDA 13.0 |
👀 驗證 PyTorch GPU 是否可用
1 | # verify_gpu.py |

圖:使用 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 | # TensorFlow 2.10 以後在 Windows 原生不支援 GPU,需使用 WSL2 或 Linux |
👀 驗證 TensorFlow GPU 是否可用
1 | # verify_gpu.py |
💻 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 | # 即時監控 GPU 使用率與記憶體 |

圖:使用 gpustat 即時監控 GPU 記憶體使用狀況(每秒更新一次)
1 | # monitor_gpu_memory.py |

圖:在 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
