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