DALI使用指南 (v1.5)

更新时间:
复制为 MD 格式

1. 概述

Nvidia DALI是一个在模型训练时做并行data loader的开源框架,支持硬件编解码加速。T-Head SAIL SDK支持DALI框架,在CPU-bounding的模型训练场景下会有明显加速模型训练性能的效果。

官网链接:https://docs.nvidia.com/deeplearning/dali/user-guide/docs/index.html

源代码链接:https://github.com/NVIDIA/DALI

2. 安装DALI

2.1 Docker

如果直接使用SAIL SDK发布的Docker,可以直接使用Docker里已经安装好的DALI(Docker里默认的DALI版本是DALI v1.20):

pip list | grep nvidia-dali

2.2 通过PIP源安装

可以通过安装T-Head pip源里的whl包来使用DALI,从SAIL SDK v1.4.1 release开始,我们开始额外支持了DALI v1.44版本。因此,可以根据DALI版本(v1.20或者v1.44),OS(ubuntu或者alios)和CUDA版本来指定安装相应的whl包。

比如在Ubuntu OS、CUDA 11.6上安装DALI 1.20的指令:

pip install nvidia_dali_cuda110==1.20.0+ppu202412182301.ce -i https://art-pub.eng.t-head.cn/artifactory/api/pypi/ptgai-pypi_ppu_ubuntu_cu116_index/simple/
# ppu2024xxxxxxxx 为v1.4.1 release SAIL SDK版本号

Ubuntu OS、CUDA 12.4上安装DALI 1.44的指令:

pip install nvidia_dali_cuda110==1.44.0+ppu202412182301.ce -i https://art-pub.eng.t-head.cn/artifactory/api/pypi/ptgai-pypi_ppu_ubuntu_cu124_index/simple/
# ppu2024xxxxxxxx 为v1.4.1 release SAIL SDK版本号
说明
  1. DALI v1.44会依赖NvidianvImageCodec项目:https://github.com/NVIDIA/nvImageCodec,该项目最低要求的CUDA版本是CUDA 11.8,所以请在CUDA 11.8+的环境下使用DALI v1.44。

  2. 除了说明1提到的这一限制的情况外,DALI对于CUDA版本号的依赖仅限于CUDAmajor版本。也就是说,如果已经安装了CUDA 12.4DALI whl包,当CUDA Toolkit升级到CUDA 12.6或者降级到CUDA 12.1,都不需要重新安装DALI。参考NV官方的说明:https://docs.nvidia.com/deeplearning/dali/user-guide/docs/support_matrix.html

  3. SAIL SDK v1.4.1 release开始,DALI开始支持video loader的功能,提供视频硬件解码加速的能力。如需使用video loader的功能,推荐使用DALI v1.44,因为NV官方在v1.20上对于video loader功能的支持还不完善。这里不完全列举一些DALI v1.44相较于DALI v1.20video loader功能上做的一些特性和修复:

    1. ideoReader的鲁棒性增强,增强了对错误流的处理能力。

    2. 修复了video decoder seek死循环的问题。

    3. 增加了对于不同bitdepth视频流的支持。

2.3 直接下载NV提供的WHL安装文件

不建议,无法直接使用NV提供的DALI安装包

2.4 从源代码编译

下载DALI dependencies并编译安装:

git clone --depth 1 --branch v1.44.0 --recurse-submodules https://github.com/NVIDIA/DALI_deps.git /tmp/DALI_deps
cd /tmp/DALI_deps
bash build_scripts/build_deps.sh

下载并编译DALI:

git clone --branch release_v1.44 --recurse-submodules https://github.com/NVIDIA/DALI.git
cd /workspace/DALI
git apply t-head_dali.patch # !!!需要patch
mkdir build && cd build
cmake .. -DBUILD_BENCHMARK=OFF -DWITH_DYNAMIC_NVIMGCODEC=OFF -DBUILD_CVCUDA=OFF # Will fix CVCUDA compile issue soon
make -j

patch的主要内容如下:

third_party/cutlass/include/cutlass/arch/wmma.h:

-#if !(defined(__clang__) && defined(__CUDA__))
+#if !(defined(__clang__) && defined(__CUDA__)) && !defined(__HGGCCC__)

CMakeLists.txt:

-set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --compiler-options \"-fvisibility=hidden -Wno-free-nonheap-object\" --Wno-deprecated-gpu-targets -Xfatbin -compress-all")
+set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --compiler-options \"-fvisibility=hidden -Wno-free-nonheap-object -fno-delayed-template-parsing\" --Wno-deprecated-gpu-targets -Xfatbin -compress-all")

3. 使能DALI

可以参考Nvidia官方从0开始使能DALI的文档实现代码:

https://docs.nvidia.com/deeplearning/dali/user-guide/docs/examples/getting_started.html

一些深度学习框架的使能可以参考以下示例代码:

  1. Pytorch: https://github.com/NVIDIA/DALI/blob/main/docs/examples/use_cases/pytorch/resnet50/main.py

  2. TensorFlow: https://github.com/NVIDIA/DALI/blob/main/docs/examples/use_cases/tensorflow/resnet-n/nvutils/image_processing.py

  3. PaddlePaddle: https://github.com/NVIDIA/DALI/blob/main/docs/examples/use_cases/paddle/resnet50/dali.py

4. 开源库DALI的支持

4.1 DLE

Nvidia Deep Learning Examples (DLE)的一些模型原生支持了DALI dataloader。

GitHub - NVIDIA/DeepLearningExamples: State-of-the-Art Deep Learning scripts organized by models - easy to train and deploy with reproducible accuracy and performance on enterprise-grade infrastructure.

运行指令指定dali-gpu作为data backend即可。

ResNet50训练为例

python ./multiproc.py --nproc_per_node 8 ./main.py --arch resnet50 -c fanin --label-smoothing 0.1 --data-backends dali-gpu <path to imagenet>

4.2 Pytorch image models

Pytorch image models (timm):https://github.com/huggingface/pytorch-image-models

mobilenet_v3训练为例

bash ./distributed_train.sh 2 /root/datasets/vision/imagenet --model mobilenetv3_large_100 -b 512 --sched step --epochs 1  --decay-epochs 2.4 --decay-rate .973 --opt rmsproptf --opt-eps .001 -j 7 --warmup-lr 1e-6 --weight-decay 1e-5 --drop 0.2 --model-ema --model-ema-decay 0.9999 --aa rand-m9-mstd0.5 --remode pixel --reprob 0.2 --lr .064 --lr-noise 0.42 0.9 --amp --data-backends dali-gpu