深度学习 AMI
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

TensorFlow with Horovod

本教程介绍如何在 采用 Conda 的 Deep Learning AMI 上使用 TensorFlow with Horovod。Horovod 已为 TensorFlow 预安装在 Conda 环境中。推荐使用 Python 3 环境。

注意

仅支持 P3.*、P2.* 和 G3.* 实例类型。

在 DLAMI with Conda 上激活 TensorFlow 并测试 Horovod

  1. 激活 Python 3 TensorFlow 环境:

    $ source activate tensorflow_p36
  2. 启动 iPython 终端:

    (tensorflow_p36)$ ipython
  3. 测试导入 TensorFlow with Horovod 以验证其是否运行正常:

    import horovod.tensorflow as hvd hvd.init()

    以下内容应显示在您的屏幕上(可能出现在一些警告消息之后)。

    -------------------------------------------------------------------------- [[55425,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) Host: ip-172-31-72-4 Another transport will be used instead, although this may result in lower performance. --------------------------------------------------------------------------

利用 Horovod 训练 ImageNet

在本部分中,您将下载 ImageNet 数据集,然后从原始数据集生成 TFRecord 格式的数据集。DLAMI 上提供了一组适用于 ImageNet 数据集的预处理脚本,您可用于 ImageNet 或用作其他数据集的模板。还提供了为 ImageNet 配置的主训练脚本。以下教程假定您已通过带 8 个 GPU 的某个 EC2 实例启动 DLAMI。建议使用 p3.16xlarge 实例类型。

在 DLAMI 上的 ~/examples/horovod 目录中,您将找到以下脚本:

  • utils/preprocess_imagenet.py - 使用此脚本将原始 ImageNet 数据集转换为 TFRecord 格式。

  • utils/tensorflow_image_resizer.py - 使用此脚本将 TFRecord 数据集的大小调整为 ImageNet 训练所建议的大小。

  • cnn/aws_tf_hvd_cnn.py - 将此脚本与 mpirun 结合使用以在经过预处理的 ImageNet 数据集上训练带 Horovod 的 CNN。

  • cnn/aws_tf_cnn.py - 使用此脚本在经过预处理的 ImageNet 数据集上训练不带 Horovod 的 CNN。

准备 ImageNet 数据集

  1. 访问 image-net.org,创建账户,获取访问密钥,然后下载数据集。image-net.org 托管原始数据集。要下载此数据集,您需要有一个 ImageNet 账户和访问密钥。账户是免费的,要获取免费访问密钥,您必须同意 ImageNet 许可证。

  2. 使用图像预处理脚本来从原始 ImageNet 数据集生成 TFRecord 格式的数据集。从 ~/examples/horovod/utils/preprocess 目录中:

    python preprocess_imagenet.py \ --local_scratch_dir=[YOUR DIRECTORY] \ --imagenet_username=[imagenet account] \ --imagenet_access_key=[imagenet access key]
  3. 使用图像调整大小脚本。如果要调整图像大小,训练将更快地运行并更好地符合 ResNet 参考文件。从 ~/examples/horovod/utils/preprocess 目录中:

    python tensorflow_image_resizer.py \ -d imagenet \ -i [PATH TO TFRECORD TRAINING DATASET] \ -o [PATH TO RESIZED TFRECORD TRAINING DATASET] \ --subset_name train \ --num_preprocess_threads 60 \ --num_intra_threads 2 \ --num_inter_threads 2

在 ImageNet 数据集上使用 Horovod 训练 ResNet50 CNN

  1. 导航到 ~/examples/horovod/cnn 文件夹。

    cd ~/examples/horovod/cnn
  2. 验证您的配置并设置要在训练中使用的 GPU 数量。首先,查看与脚本位于相同文件夹中的 hostfile。如果您使用的是具有少于 8 个 GPU 的实例,则必须更新此文件。默认为 localhost slots=8。将数量 8 更新为要使用的 GPU 的数量。

  3. 运行此训练脚本。完成此操作需要几个小时。它使用 mpirun 来跨您的 GPU 分布训练。

    使用 --save_interval 是可选的。这样可每小时(3,600 秒)保存一个检查点。保存检查点会降低训练速度,但在性能评估方面提供了灵活性。

    注意

    该脚本预计经过预处理的训练数据将位于 train 文件夹中。将此值更改为您的训练数据所在的位置。

    • 如果您要将最新版本的 DLAMI(版本 13 或更高版本)与 Amazon Linux 或 Ubuntu 一起使用,则必须使用 mpirun -np 8,其中 8 是要使用的 GPU 数:

      mpirun -np 8 \ --hostfile hostfile --bind-to none --map-by slot -x NCCL_DEBUG=INFO \ -x NCCL_MIN_NRINGS=4 -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib \ python aws_tf_hvd_cnn.py --batch_size=256 --num_epochs=90 --fp16 \ --data_dir train --model resnet50 --log_dir results --display_every 100 --save_interval=3600
    • 如果您要将较旧的 DLAMI(版本 12 或更低版本)与 Ubuntu 一起使用,则必须使用 mpirun.openmpi -np 8,其中 8 是要使用的 GPU 数:

      mpirun.openmpi -np 8 \ --hostfile hostfile --bind-to none --map-by slot -x NCCL_DEBUG=INFO \ -x NCCL_MIN_NRINGS=4 -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib \ python aws_tf_hvd_cnn.py --batch_size=256 --num_epochs=90 --fp16 \ --data_dir train --model resnet50 --log_dir results --display_every 100 --save_interval=3600
  4. 在训练完成后,请运行评估脚本。

    python -u aws_tf_hvd_cnn.py --batch_size=256 \ --num_epochs=90 --data_dir [PATH TO TFRECORD VALIDAGTION DATASET] \ --model resnet50 --log_dir [PATH TO RESULT] \ --display_every 100 \ --eval

您也可以在没有 Horovod 支持的情况下尝试使用训练脚本。

在不使用 Horovod 的情况下在 ImageNet 数据集上训练 ResNet50 CNN

  1. 导航到 ~/examples/horovod/cnn 文件夹,然后确保您有记录结果的文件夹。

    cd ~/examples/horovod/cnn mkdir results
  2. 在不使用 Horovod 的情况下运行配置的训练脚本。完成此操作需要几个小时。

    注意

    该脚本预计经过预处理的训练数据将位于 train 文件夹中。将此值更改为您的训练数据所在的位置。

    python ./cnn/aws_tf_cnn.py --num_epochs=90 \ --batch_size=256 \ --display_every 100 \ --data_dir=[PATH TO TFRECORD TRAINING DATASET] \ --log_dir=[PATH TO CHECKPOINT DIR] \ --model=resnet50 \ --num_gpus=8 \ --fp16
  3. 在训练完成后,请运行带评估设置的脚本。

    python ./cnn/aws_tf_cnn.py --num_epochs=90 \ --batch_size=256 \ --display_every 100 \ --data_dir=[PATH TO TFRECORD VALIDAGTION DATASET] \ --log_dir=[PATH TO CHECKPOINT DIR] \ --model=resnet50 \ --num_gpus=8 \ --fp16 \ --eval

如果比较了 Horovod 训练与非 Horovod 训练,您会发现在速度方面有了改善,Horovod 为 TensorFlow 训练大型数据集带来了速度。

更多信息

TensorFlow with Horovod

有关教程,请参阅 DLAMI 的主目录中的 examples/horovod 文件夹。

有关更多教程和示例,请参阅 Horovod GitHub 项目