TensorflowでGPUのBenchmarkをとる

2018/04/26

AMD GPU用のスタックROCm https://rocm.github.io/ が使えるようになってきたということで、 テストために、Radeon Vegaのボードを導入した。

この時点でのアップデートのポイントは、Tensorflow(TF) backendの性能がかなりよくなったことである。 まだ、公式のレポジトリ(最新バージョンは1.8)には取り込まれていないが、 現状TF 1.3.0用のバックエンドが動作している。

参考にしたページ:TFが公式にサポートしているNVIDIAのGPUとROCmによるAMDのGPUの性能比較 http://blog.gpueater.com/en/2018/04/23/00011_tech_cifar10_bench_on_tf13/

以下、NVIDIA P100とRadeon Vega 64のベンチマークをとった。TFのベンチマークは色々あり、公式にもちゃんとしたもの( https://github.com/tensorflow/benchmarks )が用意されているが、これは原則として最新バージョンでしか動作しないため、TF1.3では動かなかった。そこで、https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10 にある"cifar10_train.py"で性能を比較する。

実行コマンドは

python3 cifar10_train.py --max_steps 8000 --batch_size 512

バッチサイズはできるだけ大きく512とした。この値により性能は変わる。

NVIDIA用の環境はTF 1.7.0をpipでインストールしたもの、AMD用の環境は https://github.com/ROCmSoftwarePlatform/tensorflow/blob/rocm-v1/rocm_docs/tensorflow-install-basic.md に従ってインストールしたTF 1.3.0。OSはいずれもUbuntu 16.04LTS。

P100のログ抜粋

ログ冒頭

2018-04-26 10:50:19.388900: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1344] Found device 0 with properties:
name: Tesla P100-PCIE-12GB major: 6 minor: 0 memoryClockRate(GHz): 1.3285
pciBusID: 0000:84:00.0
totalMemory: 11.91GiB freeMemory: 11.62GiB
2018-04-26 10:50:19.388960: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1423] Adding visible gpu devices: 0
2018-04-26 10:50:19.786563: I tensorflow/core/common_runtime/gpu/gpu_device.cc:911] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-04-26 10:50:19.786624: I tensorflow/core/common_runtime/gpu/gpu_device.cc:917]      0
2018-04-26 10:50:19.786638: I tensorflow/core/common_runtime/gpu/gpu_device.cc:930] 0:   N
2018-04-26 10:50:19.787043: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 11250 MB memory) -> physical GPU (device: 0, name: Tesla P100-PCIE-12GB, pci bus id: 0000:84:00.0, compute capability: 6.0)
Filling queue with 20000 CIFAR images before starting to train. This will take a few minutes.

ログの最後の5行

2018-04-26 10:56:15.487232: step 7950, loss = 0.83 (13189.4 examples/sec; 0.039 sec/batch)
2018-04-26 10:56:15.876863: step 7960, loss = 0.64 (13140.7 examples/sec; 0.039 sec/batch)
2018-04-26 10:56:16.262362: step 7970, loss = 0.77 (13281.5 examples/sec; 0.039 sec/batch)
2018-04-26 10:56:16.650273: step 7980, loss = 0.74 (13198.9 examples/sec; 0.039 sec/batch)
2018-04-26 10:56:17.029462: step 7990, loss = 0.70 (13502.5 examples/sec; 0.038 sec/batch)

Vega64 のログ抜粋

ログ冒頭

2018-04-26 10:58:08.979392: W tensorflow/stream_executor/rocm/rocm_driver.cc:405] creating context when one is currently active; existing: 0x7f32cea20fc0
2018-04-26 10:58:08.979528: I tensorflow/core/common_runtime/gpu/gpu_device.cc:907] Found device 0 with properties:
name: Device 687f
AMDGPU ISA: gfx900
memoryClockRate (GHz) 1.63
pciBusID 0000:04:00.0
Total memory: 7.98GiB
Free memory: 7.73GiB
2018-04-26 10:58:08.979553: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929] DMA: 0
2018-04-26 10:58:08.979561: I tensorflow/core/common_runtime/gpu/gpu_device.cc:939] 0:   Y
2018-04-26 10:58:08.979572: I tensorflow/core/common_runtime/gpu/gpu_device.cc:997] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Device 687f, pci bus id: 0000:04:00.0)
2018-04-26 10:58:11.821976: I tensorflow/core/kernels/conv_ops.cc:670] running auto-tune for Convolve
2018-04-26 10:58:12.290266: I tensorflow/core/kernels/conv_ops.cc:670] running auto-tune for Convolve
2018-04-26 10:58:12.442089: I tensorflow/core/kernels/conv_grad_input_ops.cc:858] running auto-tune for Backward-Data
2018-04-26 10:58:12.545351: I tensorflow/core/kernels/conv_grad_filter_ops.cc:778] running auto-tune for Backward-Filter
2018-04-26 10:58:12.631547: I tensorflow/core/kernels/conv_grad_input_ops.cc:858] running auto-tune for Backward-Data
2018-04-26 10:58:12.716731: I tensorflow/core/kernels/conv_grad_filter_ops.cc:778] running auto-tune for Backward-Filter
Filling queue with 20000 CIFAR images before starting to train. This will take a few minutes.

ログの最後の5行

2018-04-26 11:03:57.941580: step 7950, loss = 137.48 (15103.5 examples/sec; 0.034 sec/batch)
2018-04-26 11:03:58.276343: step 7960, loss = 0.71 (15294.4 examples/sec; 0.033 sec/batch)
2018-04-26 11:03:58.615006: step 7970, loss = 0.67 (15118.3 examples/sec; 0.034 sec/batch)
2018-04-26 11:03:58.951314: step 7980, loss = 0.82 (15224.2 examples/sec; 0.034 sec/batch)
2018-04-26 11:03:59.297581: step 7990, loss = 0.71 (14786.5 examples/sec; 0.035 sec/batch)

結果について

このバッチサイズの場合、性能はどちらも同じくらい。Vegaのほうがクロック分くらいか、速い。 最後のステップのlossの値もほぼ同じ。これまでのROCmはただ動くだけ状態だったことを思うと、 ようやく追いつきつつあるのかと思う。GPUの値段で比較すると、このP100は約56万円(TESLA, DP&ECC enable)であり、 Vega64は約10万円(ゲーム用, DPは遅い)である。この比較では単精度演算しかつかってない(はず)。

Vegaのログによると数10ステップに一回lossが3桁を超えている。 これは学習中同じくらいの頻度で発生していて、理由は不明。