DALI使用指南 (v2.1)

更新时间:
复制为 MD 格式

Nvidia DALI是一个在模型训练时做并行data loader的开源框架,支持硬件编解码加速。T-Head SAIL SDK支持DALI框架,在CPU-bounding的模型训练场景下会有明显加速模型训练性能的效果。PPUDALI基于社区DALI进行适配,最新已经支持到了DALI 1.53。

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

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

1. 安装DALI

1.1 Docker

如果直接使用SAIL SDK发布的docker,可以直接使用 docker里已经安装好的DALI

pip list | grep nvidia-dali

1.2 通过PIP源安装

PPU 平台维护了专属的 pypi 软件源, 推荐通过指定平头哥 PPU pip 源进行安装,请根据当前的CUDA major版本决定具体安装那个库:

# 如果当前为CUDA 13.x
pip install nvidia_dali_cuda130==1.53.0 -i https://art-pub.eng.t-head.cn/artifactory/api/pypi/pypi_index/simple
# 如果当前为CUDA 12.x
pip install nvidia_dali_cuda120==1.44.0 -i https://art-pub.eng.t-head.cn/artifactory/api/pypi/pypi_index/simple
# 如果当前为CUDA 11.x
pip install nvidia_dali_cuda110==1.22.0 -i https://art-pub.eng.t-head.cn/artifactory/api/pypi/pypi_index/simple

nvidia_dali_cuda110支持的版本:1.22.0
nvidia_dali_cuda120支持的版本:1.44.0,1.50.0,1.53.0
nvidia_dali_cuda130支持的版本:1.53.0

如需使用视频Video DataLoader的功能,请使用1.44.0以上的DALI版本

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

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

1.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的主要内容如下:

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

+#if !(defined(__clang__) && defined(__CUDA__)) && !defined(__HGGCCC__)
- 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")

2. 使能DALI

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

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

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

  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

3. 开源库DALI的支持

3.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>

3.2 Pytorch image models

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

我们在pytorch image model里也支持了DALI的使能,参考这个patch:

https://code.alibaba-inc.com/jun.shang/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