ブログ

BLOG

GPUの性能比較 (CycleGANの実装でテスト)

2019年11月18日

この前マイニングリグでGPUサーバーを作りました。性能はこちらをご確認ください。
作ったあとで性能比較をしたくなったので、CycleGANがすぐ実行できるので、こちらで比較をしてみました。

マイニング用のマザーボードなので、PCIeスロットはたくさんあるのですが、レーン数はx16が1つで残りはすべてx1です。ゲームのベンチマークにはさほど影響がないという記事もありますが、Deep LearningはRAMからGPUにデータを次々と転送していくため、結構なボトルネックになりそうです。

CycleGANのgithubにて、下記のコードで1エポック学習した際の経過時間を比較します。

python train.py --dataroot ./datasets/horse2zebra --name horse2zebra --model cycle_gan

1080ti x1, PCIe Lane x1, Batch size 1

(epoch: 1, iters: 100, time: 0.298, data: 0.108) D_A: 0.557 G_A: 0.510 cycle_A: 2.149 idt_A: 1.389 D_B: 0.442 G_B: 0.539 cycle_B: 2.925 idt_B: 0.994
(epoch: 1, iters: 200, time: 0.301, data: 0.001) D_A: 0.293 G_A: 0.288 cycle_A: 3.926 idt_A: 1.938 D_B: 0.287 G_B: 0.231 cycle_B: 3.765 idt_B: 1.845
(epoch: 1, iters: 300, time: 0.299, data: 0.001) D_A: 0.227 G_A: 0.251 cycle_A: 2.306 idt_A: 2.500 D_B: 0.249 G_B: 0.319 cycle_B: 5.326 idt_B: 1.131
(epoch: 1, iters: 400, time: 0.619, data: 0.001) D_A: 0.302 G_A: 0.365 cycle_A: 2.647 idt_A: 1.376 D_B: 0.211 G_B: 0.399 cycle_B: 2.906 idt_B: 1.094
(epoch: 1, iters: 500, time: 0.304, data: 0.001) D_A: 0.253 G_A: 0.207 cycle_A: 2.234 idt_A: 0.751 D_B: 0.256 G_B: 0.289 cycle_B: 1.655 idt_B: 1.046
(epoch: 1, iters: 600, time: 0.301, data: 0.001) D_A: 0.291 G_A: 0.555 cycle_A: 1.289 idt_A: 0.929 D_B: 0.166 G_B: 0.380 cycle_B: 2.072 idt_B: 0.646
(epoch: 1, iters: 700, time: 0.301, data: 0.001) D_A: 0.384 G_A: 0.657 cycle_A: 1.551 idt_A: 0.699 D_B: 0.240 G_B: 0.333 cycle_B: 1.726 idt_B: 0.735
(epoch: 1, iters: 800, time: 0.451, data: 0.001) D_A: 0.312 G_A: 0.340 cycle_A: 2.341 idt_A: 1.066 D_B: 0.191 G_B: 0.252 cycle_B: 2.073 idt_B: 1.113
(epoch: 1, iters: 900, time: 0.301, data: 0.001) D_A: 0.290 G_A: 0.651 cycle_A: 2.696 idt_A: 1.059 D_B: 0.121 G_B: 0.487 cycle_B: 2.725 idt_B: 1.277
(epoch: 1, iters: 1000, time: 0.301, data: 0.001) D_A: 0.182 G_A: 0.418 cycle_A: 2.086 idt_A: 0.939 D_B: 0.256 G_B: 0.610 cycle_B: 2.129 idt_B: 0.838
(epoch: 1, iters: 1100, time: 0.298, data: 0.001) D_A: 0.162 G_A: 0.509 cycle_A: 2.532 idt_A: 0.865 D_B: 0.228 G_B: 0.322 cycle_B: 2.160 idt_B: 1.268
(epoch: 1, iters: 1200, time: 0.468, data: 0.001) D_A: 0.243 G_A: 0.390 cycle_A: 3.207 idt_A: 0.789 D_B: 0.208 G_B: 0.261 cycle_B: 1.869 idt_B: 1.339
(epoch: 1, iters: 1300, time: 0.302, data: 0.001) D_A: 0.188 G_A: 0.334 cycle_A: 2.328 idt_A: 0.773 D_B: 0.289 G_B: 0.334 cycle_B: 2.009 idt_B: 1.059
End of epoch 1 / 200     Time Taken: 403 sec

大体6分40秒です。

1080ti x4, PCIe Lane x1, Batch size 16

(epoch: 1, iters: 400, time: 0.404, data: 0.251) D_A: 0.563 G_A: 0.547 cycle_A: 2.621 idt_A: 1.599 D_B: 0.455 G_B: 0.445 cycle_B: 3.330 idt_B: 1.281
(epoch: 1, iters: 800, time: 0.395, data: 0.003) D_A: 0.418 G_A: 0.418 cycle_A: 2.582 idt_A: 1.496 D_B: 0.399 G_B: 0.449 cycle_B: 3.186 idt_B: 1.173
(epoch: 1, iters: 1200, time: 0.395, data: 0.003) D_A: 0.633 G_A: 0.806 cycle_A: 3.005 idt_A: 1.363 D_B: 0.485 G_B: 0.551 cycle_B: 2.902 idt_B: 1.129
End of epoch 1 / 200     Time Taken: 521 sec
learning rate = 0.0002000

データ並列化したのに関わらず、3割程度遅くなりました。データを角GPUへ分岐及び処理後の同期がボトルネックになっている気がします。

Tesla K80 x1, PCIe Lane Unknown, Batch size 1 (On google colaboratory)

こちらのColabを試しました。

K80 1GPU batch 1
(epoch: 1, iters: 100, time: 1.330, data: 0.175) D_A: 0.334 G_A: 0.477 cycle_A: 2.363 idt_A: 1.548 D_B: 0.373 G_B: 0.301 cycle_B: 3.360 idt_B: 1.038
(epoch: 1, iters: 200, time: 1.333, data: 0.002) D_A: 0.351 G_A: 0.240 cycle_A: 2.713 idt_A: 1.797 D_B: 0.519 G_B: 0.443 cycle_B: 3.650 idt_B: 1.255
(epoch: 1, iters: 300, time: 1.325, data: 0.002) D_A: 0.322 G_A: 0.466 cycle_A: 1.945 idt_A: 1.223 D_B: 0.296 G_B: 0.258 cycle_B: 3.112 idt_B: 0.905
(epoch: 1, iters: 400, time: 1.694, data: 0.002) D_A: 0.286 G_A: 0.481 cycle_A: 1.992 idt_A: 1.127 D_B: 0.204 G_B: 0.402 cycle_B: 2.604 idt_B: 0.820
(epoch: 1, iters: 500, time: 1.323, data: 0.002) D_A: 0.255 G_A: 0.404 cycle_A: 2.966 idt_A: 1.147 D_B: 0.286 G_B: 0.304 cycle_B: 2.405 idt_B: 1.449
(epoch: 1, iters: 600, time: 1.328, data: 0.002) D_A: 0.311 G_A: 0.255 cycle_A: 2.245 idt_A: 1.046 D_B: 0.197 G_B: 0.243 cycle_B: 2.306 idt_B: 1.070
(epoch: 1, iters: 700, time: 1.328, data: 0.002) D_A: 0.169 G_A: 0.338 cycle_A: 2.903 idt_A: 0.712 D_B: 0.178 G_B: 0.362 cycle_B: 1.680 idt_B: 1.062
(epoch: 1, iters: 800, time: 1.513, data: 0.002) D_A: 0.299 G_A: 0.459 cycle_A: 1.175 idt_A: 1.075 D_B: 0.128 G_B: 0.152 cycle_B: 2.307 idt_B: 0.892
(epoch: 1, iters: 900, time: 1.320, data: 0.002) D_A: 0.163 G_A: 0.302 cycle_A: 2.075 idt_A: 1.014 D_B: 0.271 G_B: 0.286 cycle_B: 2.237 idt_B: 0.932
(epoch: 1, iters: 1000, time: 1.325, data: 0.002) D_A: 0.245 G_A: 0.306 cycle_A: 3.279 idt_A: 0.752 D_B: 0.220 G_B: 0.354 cycle_B: 1.930 idt_B: 1.556
(epoch: 1, iters: 1100, time: 1.331, data: 0.002) D_A: 0.309 G_A: 0.152 cycle_A: 1.784 idt_A: 1.116 D_B: 0.278 G_B: 0.345 cycle_B: 2.135 idt_B: 0.780
(epoch: 1, iters: 1200, time: 1.511, data: 0.002) D_A: 0.299 G_A: 0.348 cycle_A: 2.703 idt_A: 0.904 D_B: 0.358 G_B: 0.451 cycle_B: 2.026 idt_B: 1.168
(epoch: 1, iters: 1300, time: 1.324, data: 0.002) D_A: 0.073 G_A: 0.333 cycle_A: 2.746 idt_A: 1.739 D_B: 0.202 G_B: 0.412 cycle_B: 3.754 idt_B: 1.166
End of epoch 1 / 200     Time Taken: 1765 sec

1080ti x1, PCIe Lane x1, Batch size 1に比べるとなんと4倍以上遅くなっています。CPUなどその他の構成による可能性もありますが、こうしてみるとColabのGPUインスタンスって重いですね。

Tesla T4 x1, PCIe Lane Unknown, Batch size 1 (On google colaboratory)

同じくColabですが、GPUガチャであたりのT4も試してみました。

(epoch: 1, iters: 100, time: 0.511, data: 0.270) D_A: 0.402 G_A: 0.452 cycle_A: 3.395 idt_A: 1.725 D_B: 0.337 G_B: 0.330 cycle_B: 3.657 idt_B: 1.636
(epoch: 1, iters: 200, time: 0.528, data: 0.001) D_A: 0.236 G_A: 0.598 cycle_A: 1.989 idt_A: 1.654 D_B: 0.302 G_B: 0.279 cycle_B: 3.576 idt_B: 1.167
(epoch: 1, iters: 300, time: 0.523, data: 0.001) D_A: 0.211 G_A: 0.187 cycle_A: 1.777 idt_A: 1.000 D_B: 0.393 G_B: 0.612 cycle_B: 2.037 idt_B: 0.728
(epoch: 1, iters: 400, time: 0.870, data: 0.001) D_A: 0.262 G_A: 0.420 cycle_A: 2.539 idt_A: 1.201 D_B: 0.235 G_B: 0.350 cycle_B: 2.501 idt_B: 0.847
(epoch: 1, iters: 500, time: 0.524, data: 0.001) D_A: 0.433 G_A: 0.164 cycle_A: 2.901 idt_A: 1.043 D_B: 0.292 G_B: 0.233 cycle_B: 2.157 idt_B: 1.438
(epoch: 1, iters: 600, time: 0.527, data: 0.001) D_A: 0.353 G_A: 0.219 cycle_A: 3.816 idt_A: 0.535 D_B: 0.220 G_B: 0.365 cycle_B: 1.288 idt_B: 1.833
(epoch: 1, iters: 700, time: 0.529, data: 0.001) D_A: 0.217 G_A: 0.370 cycle_A: 2.262 idt_A: 0.731 D_B: 0.340 G_B: 0.375 cycle_B: 1.867 idt_B: 1.173
(epoch: 1, iters: 800, time: 0.685, data: 0.001) D_A: 0.333 G_A: 0.350 cycle_A: 1.685 idt_A: 0.850 D_B: 0.357 G_B: 0.202 cycle_B: 1.874 idt_B: 0.736
(epoch: 1, iters: 900, time: 0.526, data: 0.001) D_A: 0.357 G_A: 0.327 cycle_A: 2.733 idt_A: 0.883 D_B: 0.159 G_B: 0.372 cycle_B: 1.941 idt_B: 1.057
(epoch: 1, iters: 1000, time: 0.524, data: 0.001) D_A: 0.213 G_A: 0.467 cycle_A: 2.538 idt_A: 0.816 D_B: 0.159 G_B: 0.291 cycle_B: 1.674 idt_B: 1.162
(epoch: 1, iters: 1100, time: 0.526, data: 0.002) D_A: 0.206 G_A: 0.336 cycle_A: 4.008 idt_A: 1.163 D_B: 0.285 G_B: 0.315 cycle_B: 2.468 idt_B: 2.040
(epoch: 1, iters: 1200, time: 0.691, data: 0.001) D_A: 0.220 G_A: 0.501 cycle_A: 2.770 idt_A: 0.816 D_B: 0.315 G_B: 0.489 cycle_B: 1.663 idt_B: 1.279
(epoch: 1, iters: 1300, time: 0.527, data: 0.001) D_A: 0.301 G_A: 0.362 cycle_A: 1.996 idt_A: 0.833 D_B: 0.253 G_B: 0.283 cycle_B: 2.659 idt_B: 0.935
End of epoch 1 / 200     Time Taken: 699 sec

K80よりは早いですが、それでもPCIe Lane x1の1080tiよりちょっと遅いです。性能が引き出せてないのでは、とおもいます。。

TITAN RTX x2, PCIe Lane x16, Batch size 16

(epoch: 1, iters: 400, time: 0.116, data: 0.237) D_A: 0.498 G_A: 0.436 cycle_A: 2.635 idt_A: 1.363 D_B: 2.924 G_B: 3.506 cycle_B: 2.826 idt_B: 1.288
(epoch: 1, iters: 800, time: 0.113, data: 0.003) D_A: 0.396 G_A: 0.390 cycle_A: 2.594 idt_A: 1.197 D_B: 0.681 G_B: 0.711 cycle_B: 2.617 idt_B: 1.156
(epoch: 1, iters: 1200, time: 0.114, data: 0.004) D_A: 0.329 G_A: 0.357 cycle_A: 2.554 idt_A: 1.169 D_B: 0.302 G_B: 0.383 cycle_B: 2.579 idt_B: 1.152
End of epoch 1 / 200     Time Taken: 143 sec

TITAN RTX x2, PCIe Lane x16, Batch size 18

(epoch: 1, iters: 900, time: 0.109, data: 0.274) D_A: 0.339 G_A: 0.354 cycle_A: 2.418 idt_A: 1.357 D_B: 0.737 G_B: 0.801 cycle_B: 2.904 idt_B: 1.131
End of epoch 1 / 200     Time Taken: 139 sec

<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5726855427617992" data-ad-slot="8553486055">