Watch talks from the 2019 TensorFlow Dev Summit Watch now

基准

概述

我们在多个平台上对选择的几个图像分类模型进行了测试,以便为 TensorFlow 社区提供参考。方法部分详细介绍了这些测试的执行方式并提供了指向所用脚本的链接。

图像分类模型的测试结果

在对 InceptionV3 (arXiv:1512.00567)、ResNet-50 (arXiv:1512.03385)、ResNet-152 (arXiv:1512.03385)、VGG16 (arXiv:1409.1556) 和 AlexNet 进行的测试中,我们使用了 ImageNet 数据集。测试在 Google Compute Engine、Amazon Elastic Compute Cloud (Amazon EC2) 和 NVIDIA® DGX-1™ 上运行。大多数测试同时使用了合成数据和真实数据。在合成数据测试中,我们使用了形状与 ImageNet 的每个模型所预期的数据形状相同的 tf.Variable。我们认为在对平台进行基准化分析时一定要包含真实数据测量结果。在为实际训练准备数据时,此负载会测试底层硬件和框架。我们从合成数据开始,将磁盘 I/O 作为变量移除并设置基准。然后,使用真实数据验证 TensorFlow 输入流水线和底层磁盘 I/O 是否使计算单元饱和。

使用 NVIDIA® DGX-1™ (NVIDIA® Tesla® P100) 进行训练

详细信息和其他结果包含在 NVIDIA® DGX-1™ (NVIDIA® Tesla® P100) 的详细信息部分。

使用 NVIDIA® Tesla® K80 进行训练

详细信息和其他结果包含在 Google Compute Engine (NVIDIA® Tesla® K80) 的详细信息Amazon EC2 (NVIDIA® Tesla® K80) 的详细信息部分。

使用 NVIDIA® Tesla® K80 进行分布式训练

详细信息和其他结果包含在 Amazon EC2 Distributed (NVIDIA® Tesla® K80) 的详细信息部分。

将合成数据训练与真实数据训练进行比较

NVIDIA® Tesla® P100

NVIDIA® Tesla® K80

NVIDIA® DGX-1™ (NVIDIA® Tesla® P100) 的详细信息

环境

  • 实例类型:NVIDIA® DGX-1™
  • GPU:8x NVIDIA® Tesla® P100
  • 操作系统:Ubuntu 16.04 LTS,测试通过 Docker 运行
  • CUDA/cuDNN:8.0/5.1
  • TensorFlow GitHub 哈希:b1e174e
  • 基准 GitHub 哈希:9165a70
  • 编译命令bazel build -c opt --copt=-march="haswell" --config=cuda //tensorflow/tools/pip_package:build_pip_package
  • 磁盘:本地 SSD
  • 数据集:ImageNet
  • 测试日期:2017 年 5 月

下表列出了每个模型使用的批次大小和优化器。除了表中列出的批次大小外,我们还使用 32 这个批次大小对 InceptionV3、ResNet-50、ResNet-152 和 VGG16 进行了测试。这些结果在“其他结果”部分列出。

选项 InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
每个 GPU 的批次大小 64 64 64 512 64
优化器 SGD SGD SGD SGD SGD

每个模型使用的配置。

模型 variable_update local_parameter_device
InceptionV3 parameter_server CPU
ResNet50 parameter_server CPU
ResNet152 parameter_server CPU
AlexNet 重复(使用 NCCL)
VGG16 重复(使用 NCCL)

结果

训练合成数据

GPU InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
1 142 219 91.8 2987 154
2 284 422 181 5658 295
4 569 852 356 10509 584
8 1131 1734 716 17822 1081

训练真实数据

GPU InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
1 142 218 91.4 2890 154
2 278 425 179 4448 284
4 551 853 359 7105 534
8 1079 1630 708 898

由于在 8 个 GPU 上使用真实数据对 AlexNet 进行训练会造成输入流水线超限,因此我们从以上图表和表格中排除了这一条目。

其他结果

以下结果的批次大小均为 32。

训练合成数据

GPU InceptionV3 ResNet-50 ResNet-152 VGG16
1 128 195 82.7 144
2 259 368 160 281
4 520 768 317 549
8 995 1485 632 820

训练真实数据

GPU InceptionV3 ResNet-50 ResNet-152 VGG16
1 130 193 82.4 144
2 257 369 159 253
4 507 760 317 457
8 966 1410 609 690

Google Compute Engine (NVIDIA® Tesla® K80) 的详细信息

环境

  • 实例类型:n1-standard-32-k80x8
  • GPU:8x NVIDIA® Tesla® K80
  • 操作系统:Ubuntu 16.04 LTS
  • CUDA/cuDNN:8.0/5.1
  • TensorFlow GitHub 哈希:b1e174e
  • 基准 GitHub 哈希:9165a70
  • 编译命令bazel build -c opt --copt=-march="haswell" --config=cuda //tensorflow/tools/pip_package:build_pip_package
  • 磁盘:1.7 TB 共享 SSD 永久性磁盘(800 MB/秒)
  • 数据集:ImageNet
  • 测试日期:2017 年 5 月

下表列出了每个模型使用的批次大小和优化器。除了表中列出的批次大小外,我们还使用 32 这个批次大小对 InceptionV3 和 ResNet-50 进行了测试。这些结果在“其他结果”部分列出。

选项 InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
每个 GPU 的批次大小 64 64 32 512 32
优化器 SGD SGD SGD SGD SGD

每个模型使用的配置是 variable_update 等于 parameter_serverlocal_parameter_device 等于 cpu

结果

训练合成数据

GPU InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
1 30.5 51.9 20.0 656 35.4
2 57.8 99.0 38.2 1209 64.8
4 116 195 75.8 2328 120
8 227 387 148 4640 234

训练真实数据

GPU InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
1 30.6 51.2 20.0 639 34.2
2 58.4 98.8 38.3 1136 62.9
4 115 194 75.4 2067 118
8 225 381 148 4056 230

其他结果

训练合成数据

GPU InceptionV3(批次大小为 32) ResNet-50(批次大小为 32)
1 29.3 49.5
2 55.0 95.4
4 109 183
8 216 362

训练真实数据

GPU InceptionV3(批次大小为 32) ResNet-50(批次大小为 32)
1 29.5 49.3
2 55.4 95.3
4 110 186
8 216 359

Amazon EC2 (NVIDIA® Tesla® K80) 的详细信息

环境

  • 实例类型:p2.8xlarge
  • GPU:8x NVIDIA® Tesla® K80
  • 操作系统:Ubuntu 16.04 LTS
  • CUDA/cuDNN:8.0/5.1
  • TensorFlow GitHub 哈希:b1e174e
  • 基准 GitHub 哈希:9165a70
  • 编译命令bazel build -c opt --copt=-march="haswell" --config=cuda //tensorflow/tools/pip_package:build_pip_package
  • 磁盘:1TB Amazon EFS(12 小时内突发吞吐量为 100 MiB/秒,连续吞吐量为 50 MiB/秒)
  • 数据集:ImageNet
  • 测试日期:2017 年 5 月

下表列出了每个模型使用的批次大小和优化器。除了表中列出的批次大小外,我们还使用 32 这个批次大小对 InceptionV3 和 ResNet-50 进行了测试。这些结果在“其他结果”部分列出。

选项 InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
每个 GPU 的批次大小 64 64 32 512 32
优化器 SGD SGD SGD SGD SGD

每个模型使用的配置。

模型 variable_update local_parameter_device
InceptionV3 parameter_server CPU
ResNet-50 重复(不使用 NCCL) GPU
ResNet-152 重复(不使用 NCCL) GPU
AlexNet parameter_server GPU
VGG16 parameter_server GPU

结果

训练合成数据

GPU InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
1 30.8 51.5 19.7 684 36.3
2 58.7 98.0 37.6 1244 69.4
4 117 195 74.9 2479 141
8 230 384 149 4853 260

训练真实数据

GPU InceptionV3 ResNet-50 ResNet-152 AlexNet VGG16
1 30.5 51.3 19.7 674 36.3
2 59.0 94.9 38.2 1227 67.5
4 118 188 75.2 2201 136
8 228 373 149 242

由于 EFS 设置无法提供足够的吞吐量,因此我们从以上图表和表格中排除了在 8 个 GPU 上使用真实数据对 AlexNet 进行的训练。

其他结果

训练合成数据

GPU InceptionV3(批次大小为 32) ResNet-50(批次大小为 32)
1 29.9 49.0
2 57.5 94.1
4 114 184
8 216 355

训练真实数据

GPU InceptionV3(批次大小为 32) ResNet-50(批次大小为 32)
1 30.0 49.1
2 57.5 95.1
4 113 185
8 212 353

Amazon EC2 Distributed (NVIDIA® Tesla® K80) 的详细信息

环境

  • 实例类型:p2.8xlarge
  • GPU:8x NVIDIA® Tesla® K80
  • 操作系统:Ubuntu 16.04 LTS
  • CUDA/cuDNN:8.0/5.1
  • TensorFlow GitHub 哈希:b1e174e
  • 基准 GitHub 哈希:9165a70
  • 编译命令bazel build -c opt --copt=-march="haswell" --config=cuda //tensorflow/tools/pip_package:build_pip_package
  • 磁盘:1.0 TB EFS(12 小时内突发吞吐量为 100 MB/s,连续吞吐量为 50 MB/s)
  • 数据集:ImageNet
  • 测试日期:2017 年 5 月

下表中列出了测试使用的批次大小和优化器。除了表中列出的批次大小外,我们还使用 32 这个批次大小对 InceptionV3 和 ResNet-50 进行了测试。这些结果在“其他结果”部分列出。

选项 InceptionV3 ResNet-50 ResNet-152
每个 GPU 的批次大小 64 64 32
优化器 SGD SGD SGD

每个模型使用的配置。

模型 variable_update local_parameter_device cross_replica_sync
InceptionV3 distributed_replicated True
ResNet-50 distributed_replicated True
ResNet-152 distributed_replicated True

为了简化服务器设置,运行工作器服务器的 EC2 实例 (p2.8xlarge) 还运行了参数服务器。使用的参数服务器和工作器服务器数量相等,但以下情况除外:

  • InceptionV3:8 个实例/6 个参数服务器
  • ResNet-50:(批次大小为 32)8 个实例/4 个参数服务器
  • ResNet-152:8 个实例/4 个参数服务器

结果

训练合成数据

GPU InceptionV3 ResNet-50 ResNet-152
1 29.7 52.4 19.4
8 229 378 146
16 459 751 291
32 902 1388 565
64 1783 2744 981

其他结果

训练合成数据

GPU InceptionV3(批次大小为 32) ResNet-50(批次大小为 32)
1 29.2 48.4
8 219 333
16 427 667
32 820 1180
64 1608 2315

方法

我们在各种平台上运行了此脚本,以生成上述结果。

为了创建尽可能重复的结果,每个测试运行 5 次,然后取平均值。GPU 在给定平台上以其默认状态运行。对于 NVIDIA® Tesla® K80,这意味着使 GPU Boost 保持启用状态。对于每项测试,先完成 10 个预热训练步,然后对接下来的 100 个训练步求平均值。