ResNet-N 与 TensorFlow 和 DALI#

此演示实现了残差网络模型,并使用 DALI 从 原始论文 中获取数据增强 pipeline。

它实现了 ResNet50 v1.5 CNN 模型,并演示了在多 GPU 系统上进行高效的单节点训练。它们可以用于基准测试,或作为实现和训练您自己网络的起点。

用于定义 CNN 网络和执行基本训练的常用实用程序位于 docs/examples/use_cases/tensorflow/resnet-n 内部的 nvutils 目录中。这些实用程序使用 Tensorflow 2.0 编写。模型脚本(即 resnet.py)演示了 nvutils 的用法。这些脚本支持带有 Horovod 的 Keras Fit/Compile 和自定义训练循环 (CTL) 模式。

要使用 DALI pipeline 进行数据加载和预处理,请使用 --dali_mode=GPU--dali_mode=CPU

在 Keras Fit/Compile 模式下训练#

在 8 个 GPU 上进行完整训练

mpiexec --allow-run-as-root --bind-to socket -np 8 \
  python resnet.py --num_iter=90 --iter_unit=epoch \
  --data_dir=/data/imagenet/train-val-tfrecord-480/ \
  --precision=fp16 --display_every=100 \
  --export_dir=/tmp --dali_mode="GPU"

在 8 个 GPU 上进行基准测试训练

mpiexec --allow-run-as-root --bind-to socket -np 8 \
  python resnet.py --num_iter=400 --iter_unit=batch \
  --data_dir=/data/imagenet/train-val-tfrecord-480/ \
  --precision=fp16 --display_every=100 --dali_mode="GPU"

在 Keras Fit/Compile 模式下预测#

用于使用先前保存在 /tmp 中的模型进行预测

python resnet.py --predict --export_dir=/tmp --dali_mode="GPU"

在 CTL(自定义训练循环)模式下训练#

在 8 个 GPU 上进行完整训练

mpiexec --allow-run-as-root --bind-to socket -np 8 \
  python resnet_ctl.py --num_iter=90 --iter_unit=epoch \
  --data_dir=/data/imagenet/train-val-tfrecord-480/ \
  --precision=fp16 --display_every=100 \
  --export_dir=/tmp --dali_mode="GPU"

在 8 个 GPU 上进行基准测试训练

mpiexec --allow-run-as-root --bind-to socket -np 8 \
  python resnet_ctl.py --num_iter=400 --iter_unit=batch \
  --data_dir=/data/imagenet/train-val-tfrecord-480/ \
  --precision=fp16 --display_every=100 --dali_mode="GPU"

在 CTL(自定义训练循环)模式下预测#

用于使用先前保存在 /tmp 中的模型进行预测

python resnet_ctl.py --predict --export_dir=/tmp --dali_mode="GPU"

其他有用的选项#

要使用 tensorboard(注意:/tmp/some_dir 需要由用户创建)

--tensorboard_dir=/tmp/some_dir

要在训练结束时导出已保存的模型(注意:/tmp/some_dir 需要由用户创建)

--export_dir=/tmp/some_dir

要在每个 epoch 结束时存储检查点(注意:/tmp/some_dir 需要由用户创建)

--log_dir=/tmp/some_dir

要启用 XLA

--use_xla

要求#

TensorFlow#

pip install tensorflow-gpu==2.4.1

OpenMPI#

wget -q -O - \
  https://www.open-mpi.org/software/ompi/v3.0/downloads/openmpi-3.0.0.tar.gz \
  | tar -xz
cd openmpi-3.0.0
./configure --enable-orterun-prefix-by-default --with-cuda \
            --prefix=/usr/local/mpi --disable-getpwuid
make -j"$(nproc)" install
cd .. && rm -rf openmpi-3.0.0
echo "/usr/local/mpi/lib" >> /etc/ld.so.conf.d/openmpi.conf && ldconfig
export PATH=/usr/local/mpi/bin:$PATH

以下内容解决了在未安装 ssh 的单节点内运行时 OpenMPI 3.0 中的段错误。

/bin/echo -e '#!/bin/bash'\
'\ncat <<EOF'\
'\n======================================================================'\
'\nTo run a multi-node job, install an ssh client and clear plm_rsh_agent'\
'\nin '/usr/local/mpi/etc/openmpi-mca-params.conf'.'\
'\n======================================================================'\
'\nEOF'\
'\nexit 1' >> /usr/local/mpi/bin/rsh_warn.sh && \
    chmod +x /usr/local/mpi/bin/rsh_warn.sh && \
    echo "plm_rsh_agent = /usr/local/mpi/bin/rsh_warn.sh" \
    >> /usr/local/mpi/etc/openmpi-mca-params.conf

Horovod#

export HOROVOD_GPU_ALLREDUCE=NCCL
export HOROVOD_NCCL_INCLUDE=/usr/include
export HOROVOD_NCCL_LIB=/usr/lib/x86_64-linux-gnu
export HOROVOD_NCCL_LINK=SHARED
export HOROVOD_WITHOUT_PYTORCH=1
pip install horovod==0.21.0