本篇記錄如何使用多張 GPU 顯示卡,加速 TensorFlow Object Detection API 模型訓練的過程。
雖然 TensorFlow Object Detection API 已經有支援多張 GPU 卡平行計算的功能,但是缺乏說明文件,所以我自己也不是非常確定該怎麼用,以下只是我目前嘗試出來的方式,僅供參考。
使用多 GPU 卡時,會把每個 batch 的資料分散至每張 GPU 卡,也就是可以讓 batch size 變大,所以在 train_config 的 batch_size 要自己修改一下,要讓資料可以平均分散至每張 GPU 卡,最簡單的修改方式就是看自己有多少張 GPU 卡,就乘以多少。
在預設的設定值中,batch_size 的值是 1,現在我打算用 3 張 GPU 卡,所以就改成 3:
train_config: {
batch_size: 3
optimizer {
# [略]
}
# [略]
}
由於 batch size 變大了,收斂的速度應該也會變快,所以 optimizer 內的參數應該也是要改的,不過要怎麼改就要看實際情況而定,這個部分就自己看著辦。
改好設定檔之後,接著就可以使用多張 GPU 卡平行運算,使用的指令幾乎沒有變,只是加上兩個參數:
--num_clones:指定 GPU 卡的數量。--ps_tasks:指定參數伺服器的數量。另外再以 CUDA_VISIBLE_DEVICES 指定要使用哪幾張 GPU 卡,完整的指令搞如下:
# 設定檔路徑 PIPELINE_CONFIG="object_detection/data/faster_rcnn_resnet101_pets.config" # 訓練結果放置路徑 MY_MODEL_DIR="my_model" # 使用前三張 GPU 卡進行訓練 CUDA_VISIBLE_DEVICES=0,1,2 python object_detection/train.py --logtostderr --pipeline_config_path=${PIPELINE_CONFIG} --train_dir=${MY_MODEL_DIR}/train --num_clones=3 --ps_tasks=1 # 使用第四張 GPU 卡進行驗證 CUDA_VISIBLE_DEVICES=3 python object_detection/eval.py --logtostderr --pipeline_config_path=${PIPELINE_CONFIG} --checkpoint_dir=${MY_MODEL_DIR}/train --eval_dir=${MY_MODEL_DIR}/eval
指令執行之後,我們可以使用 nvidia-smi 來查看每一張 GPU 卡的使用情況,看看是不是真的有同時用到三張 GPU 卡訓練:
nvidia-smi
Tue Dec 26 15:35:34 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.81 Driver Version: 384.81 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 TITAN Xp Off | 00000000:02:00.0 Off | N/A |
| 44% 72C P2 186W / 250W | 11763MiB / 12189MiB | 84% Default |
+-------------------------------+----------------------+----------------------+
| 1 TITAN Xp Off | 00000000:03:00.0 Off | N/A |
| 47% 76C P2 124W / 250W | 11763MiB / 12189MiB | 76% Default |
+-------------------------------+----------------------+----------------------+
| 2 TITAN Xp Off | 00000000:83:00.0 Off | N/A |
| 42% 70C P2 131W / 250W | 11763MiB / 12189MiB | 72% Default |
+-------------------------------+----------------------+----------------------+
| 3 TITAN Xp Off | 00000000:84:00.0 Off | N/A |
| 23% 41C P2 72W / 250W | 11761MiB / 12189MiB | 51% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 22192 C python 11751MiB |
| 1 22192 C python 11751MiB |
| 2 22192 C python 11751MiB |
| 3 29266 C python 11751MiB |
+-----------------------------------------------------------------------------+
在訓練的過程中,如果仔細觀察每步的計算速度,應該會發現使用一張 GPU 卡的速度會跟使用多張 GPU 卡差不多。這是單張 GPU 卡的速度:
這是同時使用三張 GPU 卡的計算速度:
速度會差不多是正常的(理論上多張 GPU 卡運算的速度會變慢一點點),因為兩邊的 batch size 不同,若每步的計算時間差不多,就表示實際的計算速度有增加。
參考資料:GitHub