跳至主要内容

GPU 後端與優化

本文介紹 KataGo 支援的各種 GPU 後端、效能差異,以及如何調校以獲得最佳效能。


後端總覽

KataGo 支援四種計算後端:

後端硬體支援效能安裝難度
CUDANVIDIA GPU最佳中等
OpenCLNVIDIA/AMD/Intel GPU良好簡單
MetalApple Silicon良好簡單
Eigen純 CPU較慢最簡單

CUDA 後端

適用場景

  • NVIDIA GPU(GTX 10 系列以上)
  • 需要最高效能
  • 有 CUDA 開發環境

安裝需求

# 檢查 CUDA 版本
nvcc --version

# 檢查 cuDNN
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR
元件建議版本
CUDA11.x 或 12.x
cuDNN8.x
驅動程式470+

編譯

cd KataGo/cpp
mkdir build && cd build

cmake .. -DUSE_BACKEND=CUDA \
-DCUDNN_INCLUDE_DIR=/usr/local/cuda/include \
-DCUDNN_LIBRARY=/usr/local/cuda/lib64/libcudnn.so

make -j$(nproc)

效能特點

  • Tensor Cores:支援 FP16 加速(RTX 系列)
  • 批次推理:GPU 利用率最佳
  • 記憶體管理:可精細控制 VRAM 用量

OpenCL 後端

適用場景

  • AMD GPU
  • Intel 內顯
  • NVIDIA GPU(無 CUDA 環境)
  • 跨平台部署

安裝需求

# Linux - 安裝 OpenCL 開發套件
sudo apt install ocl-icd-opencl-dev

# 檢查可用的 OpenCL 裝置
clinfo

編譯

cmake .. -DUSE_BACKEND=OPENCL
make -j$(nproc)

驅動程式選擇

GPU 類型建議驅動
AMDROCm 或 AMDGPU-PRO
Intelintel-opencl-icd
NVIDIAnvidia-opencl-icd

效能調校

# config.cfg
openclDeviceToUse = 0 # GPU 編號
openclUseFP16 = auto # 半精度(支援時)
openclUseFP16Storage = true # FP16 儲存

Metal 後端

適用場景

  • Apple Silicon(M1/M2/M3)
  • macOS 系統

編譯

cmake .. -DUSE_BACKEND=METAL
make -j$(sysctl -n hw.ncpu)

Apple Silicon 優化

Apple Silicon 的統一記憶體架構有特殊優勢:

# Apple Silicon 建議設定
numNNServerThreadsPerModel = 1
nnMaxBatchSize = 16
numSearchThreads = 4

效能比較

晶片相對效能
M1~RTX 2060
M1 Pro/Max~RTX 3060
M2~RTX 2070
M3 Pro/Max~RTX 3070

Eigen 後端(純 CPU)

適用場景

  • 無 GPU 環境
  • 快速測試
  • 低強度使用

編譯

sudo apt install libeigen3-dev
cmake .. -DUSE_BACKEND=EIGEN
make -j$(nproc)

效能預期

CPU 單核:~10-30 playouts/sec
CPU 多核:~50-150 playouts/sec
GPU(中階):~1000-3000 playouts/sec

效能調校參數

核心參數

# config.cfg

# === 神經網路設定 ===
# GPU 編號(多 GPU 時使用)
nnDeviceIdxs = 0

# 每個模型的推理執行緒數
numNNServerThreadsPerModel = 2

# 最大批次大小
nnMaxBatchSize = 16

# 快取大小(2^N 個位置)
nnCacheSizePowerOfTwo = 20

# === 搜索設定 ===
# 搜索執行緒數
numSearchThreads = 8

# 每手最大訪問次數
maxVisits = 800

參數調校指南

nnMaxBatchSize

太小:GPU 利用率低,推理延遲高
太大:VRAM 不足,等待時間長

建議值:
- 4GB VRAM: 8-12
- 8GB VRAM: 16-24
- 16GB+ VRAM: 32-64

numSearchThreads

太少:無法餵飽 GPU
太多:CPU 瓶頸、記憶體壓力

建議值:
- CPU 核心數的 1-2 倍
- 與 nnMaxBatchSize 相近

numNNServerThreadsPerModel

CUDA:1-2
OpenCL:1-2
Eigen:CPU 核心數

記憶體調校

# 減少 VRAM 用量
nnMaxBatchSize = 8
nnCacheSizePowerOfTwo = 18

# 增加 VRAM 用量(提升效能)
nnMaxBatchSize = 32
nnCacheSizePowerOfTwo = 22

多 GPU 設定

單機多 GPU

# 使用 GPU 0 和 GPU 1
nnDeviceIdxs = 0,1

# 每個 GPU 的執行緒數
numNNServerThreadsPerModel = 2

負載平衡

# 根據 GPU 效能分配權重
# GPU 0 效能較強,分配更多工作
nnDeviceIdxs = 0,0,1

基準測試

執行基準測試

katago benchmark -model model.bin.gz -config config.cfg

輸出解讀

GPU 0: NVIDIA GeForce RTX 3080
Threads: 8, Batch Size: 16

Benchmark results:
- Neural net evals/second: 2847.3
- Playouts/second: 4521.8
- Time per move (1000 visits): 0.221 sec

Memory usage:
- Peak GPU memory: 2.1 GB
- Peak system memory: 1.3 GB

常見效能數據

GPU模型Playouts/秒
RTX 3060b18c384~2500
RTX 3080b18c384~4500
RTX 4090b18c384~8000
M1 Prob18c384~1500
M2 Maxb18c384~2200

TensorRT 加速

適用場景

  • NVIDIA GPU
  • 追求極致效能
  • 可接受較長的初始化時間

啟用方式

# 編譯時啟用
cmake .. -DUSE_BACKEND=CUDA -DUSE_TENSORRT=ON

# 或使用預編譯版本
katago-tensorrt

效能提升

標準 CUDA:100%
TensorRT FP32:+20-30%
TensorRT FP16:+50-80%(RTX 系列)
TensorRT INT8:+100-150%(需要校準)

注意事項

  • 首次啟動需要編譯 TensorRT 引擎(數分鐘)
  • 不同 GPU 需要重新編譯
  • FP16/INT8 可能略微降低精度

常見問題

GPU 未被偵測

# 檢查 GPU 狀態
nvidia-smi # NVIDIA
rocm-smi # AMD
clinfo # OpenCL

# KataGo 列出可用 GPU
katago gpuinfo

VRAM 不足

# 使用較小的模型
# b18c384 → b10c128

# 減少批次大小
nnMaxBatchSize = 4

# 減少快取
nnCacheSizePowerOfTwo = 16

效能不如預期

  1. 確認使用正確的後端(CUDA > OpenCL > Eigen)
  2. 檢查 numSearchThreads 是否足夠
  3. 確認 GPU 沒有被其他程式佔用
  4. 使用 benchmark 命令確認效能

效能優化檢查清單

  • 選擇正確的後端(CUDA/OpenCL/Metal)
  • 安裝最新的 GPU 驅動程式
  • 調整 nnMaxBatchSize 符合 VRAM
  • 調整 numSearchThreads 符合 CPU
  • 執行 benchmark 確認效能
  • 監控 GPU 使用率(應 > 80%)

延伸閱讀