NVIDIA GeForce RTX 2080 Tiには、前世代のGTX 1080 TiなどにはあったGPU間DMA転送機能がなくなったため、複数GPUでの並列学習で性能が出ないと言われています。実際はどうなのか、標準的なTensorFlowのtf_cnn_benchmarks.pyを1, 2, 4, 8, 10GPUで実行してみました(ダウンロードはここから)。テストしたネットワークはResNet50, ResNet152, Inception v3, Inception v4, VGG-16, Nasnetです。テストにはHPCDIY-XCLGPU10R4Sを使いました。スペックは、GPU:10*GeForce RTX 2080 Ti 11GB, CPU:2*Intel Xeon Gold 6230 (20C/40T 2.1G/3.9G 27.5MB 3UPI 1TB/2933M 125W) , Memory:12*32GB DDR4-2933 ECC REG DIMM, U.2 NVMeSSD:1*Samsung DC PM983, 1.92TB , NVMe PCIe3.0x4, V4 TLC VNAND, 2.5" (1.3 DWPD) です。

GeForce RTX 2080 Ti Deep Learning ベンチマーク: FP16 (XLA on)

カッコ内は1GPUに対して何倍になっているかを示しています。

  Batch Size 1 GPU img/sec 2 GPU img/sec 4 GPU img/sec 8 GPU img/sec 10 GPU img/sec
ResNet50 128 808.94(1.00) 1473.41(1.82) 2629.64(3.25) 4898.68(6.06) 6061.55(7.49)
Inception v3 128 482.45(1.00) 901.23(1.87) 1695.87(3.52) 3266.71(6.77) 4048.04(8.39)
Nasnet 128 438.37(1.00) 832.95(1.90) 1579.25(3.60) 3052.47(6.96) 3762.45(8.58)
VGG-16 64 393.98(1.00) 598.41(1.52) 780.44(1.98) 1298.8(3.30) 1599.04(4.06)
ResNet152 64 328.01(1.00) 534.75(1.63) 881.21(2.69) 1569.11(4.78) 1962.03(5.98)
nception v4 64 244.78(1.00) 441.28(1.80) 792.49(3.24) 1477.58(6.04) 1823.75(7.45)

VGG-16は並列効率が悪いですが、その他はまあまあ並列の効果が出ている様に見えます。FP16を使っているため、GPU間のデータ転送も比較的少なくなっているからでしょうか。ベンチマークは下記のスクリプトの--batch_size. --model, --num_gpusをそれぞれに合わせて変更して実行しています。

  • python tf_cnn_benchmarks.py --data_format=NCHW --batch_size=64 --num_batches=100 --model=inception4 --optimizer=momentum --variable_update=replicated --all_reduce_spec=nccl --use_fp16=True --nodistortions --gradient_repacking=2 --datasets_use_prefetch=True --per_gpu_thread_count=2 --loss_type_to_report=base_loss --compute_lr_on_cpu=True --single_l2_loss_op=True --xla_compile=True --local_parameter_device=gpu --num_gpus=1 --display_every=10