从源代码编译 DALI#


裸机构建#

先决条件#

DALI 有几个开源依赖项。我们将它们保存在两个位置。首先,主 DALI 存储库 包含一个 third_party 目录,其中列出了基于源代码的依赖项。其次,我们维护一个单独的 DALI_deps 存储库,其中包含其余依赖项的链接。请参阅 DALI_deps README 文件,了解如何从该存储库安装依赖项的说明。

当前使用的 DALI_deps 版本的 SHA 可以在 DALI_PROJECT_ROOT/DALI_EXTRA_VERSION 中找到。

**nvJPEG 库****GPU Direct Storage****libjpeg-turbo****libtiff** 具有禁用它们的非官方选项。

必需组件

注释

Linux x64

GCC

clang

编译时代码生成需要 clang 和 python-clang 绑定。获取它们的最简单方法是“pip install clang libclang”

NVIDIA CUDA

nvJPEG 库

可以非正式地禁用此功能。请参阅下文。

(可选)liblmdb

当前支持的版本可以在 **DALI_deps** 存储库中查看。

(可选)GPU Direct Storage

构建过程仅需要 libcufile,并且安装的头文件需要放在 /usr/local/cuda/include 目录中。对于 CUDA 11.4,它可以作为 CUDA 工具包的一部分安装。

以下一个或多个深度学习框架

注意

需要安装 TensorFlow 才能为 DALI 构建 TensorFlow 插件。

注意

标记为“非官方”的项目是社区贡献,据信可以工作,但未经 NVIDIA 官方测试或维护。

注意

此软件使用 LGPLv2.1 许可下的 FFmpeg 许可代码。其源代码可以从`此处下载<https://github.com/NVIDIA/DALI_deps>`__

FFmpeg 是使用以下命令行编译的

./configure \
--prefix=/usr/local \
--disable-static \
--disable-programs \
--disable-doc \
--disable-avdevice \
--disable-swresample \
--disable-postproc \
--disable-w32threads \
--disable-os2threads \
--disable-dct \
--disable-dwt \
--disable-error-resilience \
--disable-lsp \
--disable-mdct \
--disable-rdft \
--disable-fft \
--disable-faan \
--disable-pixelutils \
--disable-autodetect \
--disable-iconv \
--enable-shared \
--enable-avformat \
--enable-avcodec \
--enable-avfilter \
--disable-encoders \
--disable-hwaccels \
--disable-muxers \
--disable-protocols \
--enable-protocol=file \
--disable-indevs \
--disable-outdevs  \
--disable-devices \
--disable-filters \
--disable-bsfs \
--disable-decoder=ipu \
--enable-bsf=h264_mp4toannexb,hevc_mp4toannexb,mpeg4_unpack_bframes && \
# adds "| sed 's/\(.*{\)/DALI_\1/' |" to the version file generation command - it prepends "DALI_" to the symbol version
sed -i 's/\$\$(M)sed '\''s\/MAJOR\/\$(lib$(NAME)_VERSION_MAJOR)\/'\'' \$\$< | \$(VERSION_SCRIPT_POSTPROCESS_CMD) > \$\$\@/\$\$(M)sed '\''s\/MAJOR\/\$(lib$(NAME)_VERSION_MAJOR)\/'\'' \$\$< | sed '\''s\/\\(\.*{\\)\/DALI_\\1\/'\'' | \$(VERSION_SCRIPT_POSTPROCESS_CMD) > \$\$\@/' ffbuild/library.mak \
make

注意

此软件使用 LGPLv2.1 许可下的 libsnd 许可。其源代码可以从此处下载。

libsnd 是使用以下命令行编译的

./configure && make

构建 DALI#

  1. 获取 DALI 源代码

    git clone --recursive https://github.com/NVIDIA/DALI
    cd DALI
    
  2. 为 CMake 生成的 Makefile 创建一个目录。这将是 DALI 构建所在的目录。

    mkdir build
    cd build
    
  3. 运行 CMake。有关可以传递给 CMake 的其他选项,请参阅可选 CMake 构建参数

    cmake -D CMAKE_BUILD_TYPE=Release ..
    
  4. 构建。您可以使用 -j 选项在多个线程中执行它

    make -j"$(nproc)"
    

安装 Python 绑定#

为了使用 Python API 运行 DALI,您需要安装 Python 绑定

cd build
pip install dali/python

注意

虽然您可以在此处通过调用 pip wheel dali/python 来创建一个 wheel,但我们并不真正建议这样做。这样的 whl 不是自包含的(没有所有依赖项),它仅在您构建 DALI 裸机的系统上工作。要构建包含依赖项的 wheel,因此可以在其他系统上使用,请按照 DockerBuilderAnchor 进行操作。

验证构建(可选)#

获取测试数据#

您可以通过运行 GTest 和 Nose 测试来验证构建。为此,您需要 `DALI_extra 存储库<https://github.com/NVIDIA/DALI_extra#nvidia-dali>`__,其中包含测试数据。要下载它,请按照 DALI_extra README 进行操作。请记住,您需要 git-lfs 才能正确克隆 DALI_extra 存储库。要安装 git-lfs,请按照 本教程 进行操作。

设置测试数据路径#

DALI 使用 DALI_EXTRA_PATH 环境变量来定位测试数据。您可以通过调用来设置它

export DALI_EXTRA_PATH=PATH_TO_YOUR_DALI_EXTRA
e.g. export DALI_EXTRA_PATH=/home/yourname/workspace/DALI_extra

运行测试#

DALI 测试由 2 部分组成:C++ (GTest) 和 Python(通常是 Nose,但这并不总是正确的)。要运行测试,Make 有方便的目标,您可以在构建完成后运行

cd <path_to_DALI>/build
make check-gtest check-python

使用 Clang 构建 DALI(实验性)#

注意

此构建是实验性的。它既未维护也未测试。不保证能工作。我们建议在生产构建中使用 GCC。

cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang  ..
make -j"$(nproc)"

可选 CMake 构建参数#

  • BUILD_PYTHON - 构建 Python 绑定(默认值:ON)

  • BUILD_TEST - 包括构建测试套件(默认值:ON)

  • BUILD_BENCHMARK - 包括构建基准测试(默认值:ON)

  • BUILD_LMDB - 构建对 LMDB 的支持(默认值:OFF)

  • BUILD_NVTX - 构建时启用 NVTX 分析(默认值:OFF)

  • BUILD_NVJPEG - 构建 nvJPEG 支持(默认值:ON)

  • BUILD_NVJPEG2K - 构建 nvJPEG2k 支持(默认值:ON)

  • BUILD_LIBTIFF - 构建 libtiff 支持(默认值:ON)

  • BUILD_FFTS - 构建 ffts 支持(默认值:ON)

  • BUILD_CFITSIO - 构建 CFITSIO 支持(默认值:ON)

  • BUILD_LIBSND - 构建 libsnd 支持(默认值:ON)

  • BUILD_LIBTAR - 构建 libtar 支持(默认值:ON)

  • BUILD_NVOF - 构建 NVIDIA OPTICAL FLOW SDK 支持(默认值:ON)

  • BUILD_NVDEC - 构建 NVIDIA NVDEC 支持(默认值:ON)

  • BUILD_NVML - 构建 NVIDIA Management Library (NVML) 支持(默认值:ON)

  • BUILD_CUFILE - 构建 GPU Direct Storage 支持(默认值:ON)

  • BUILD_NVIMAGECODEC - 构建 NVIDIA nvImageCodec library 支持(默认值:ON)

  • VERBOSE_LOGS - 在 DALI 中启用详细日志记录。(默认值:OFF)

  • WERROR - 将所有构建警告视为错误(默认值:OFF)

  • BUILD_DALI_NODEPS - 禁用对第三方库的支持,这些库通常应在系统中可用

警告

启用此选项实际上只会编译 DALI 的最基本部分(C++ 核心和内核库)。当想要直接使用 DALI 处理原语(内核)而无需使用 DALI 的执行器基础设施时,这很有用。

  • LINK_DRIVER - 启用与驱动程序库的直接链接或适当的存根,而不是在运行时 dlopen 它(消除了需要 clang-python 绑定来生成存根的需求)

  • BUILD_WITH_ASAN - 构建 ASAN 支持(默认值:OFF)。

  • BUILD_WITH_LSAN - 构建 LSAN 支持(默认值:OFF)。

  • BUILD_WITH_UBSAN - 构建 UBSAN 支持(默认值:OFF)。

要使用启用的 sanitizers 运行,请发出

LD_LIBRARY_PATH=. ASAN_OPTIONS=symbolize=1:protect_shadow_gap=0 ASAN_SYMBOLIZER_PATH=$(shell which llvm-symbolizer)
LD_PRELOAD=PATH_TO_LIB_ASAN/libasan.so.X PATH_TO_LIB_STDC/libstdc++.so.STDC_VERSION*PATH_TO_BINARY*

Where X depends on used compiler version, for example GCC 10.x uses 6. Tested with GCC 10.2.1, CUDA 12.0
and libasan.6. Any earlier version may not work.

STDC_VERSION used by the system. Usually 6.
  • DALI_BUILD_FLAVOR - 允许为 nvidia-dali whl 包指定自定义名称后缀(即“nightly”)

  • (非官方) BUILD_JPEG_TURBO - 构建 libjpeg-turbo(默认值:ON)

  • (非官方) BUILD_LIBTIFF - 构建 libtiff(默认值:ON)

注意

DALI 发行包是使用上面列出的设置为 ON 且 NVTX 关闭的选项构建的。测试是在相同的配置下完成的。我们确保 DALI 可以使用所有这些设置为 OFF 的选项进行编译,但这些功能之间可能存在交叉依赖关系。

以下 CMake 参数可能有助于设置正确的路径

  • FFMPEG_ROOT_DIR - 已安装 FFmpeg 的路径

  • NVJPEG_ROOT_DIR - 可以找到 nvJPEG 的位置(从 CUDA 10.0 开始,它随 CUDA 工具包一起提供,因此不需要此选项)

  • libjpeg-turbo 选项可以从 **libjpeg CMake 文档页面** 获取

  • protobuf 选项可以从 **protobuf CMake 文档页面** 获取

为 aarch64 Jetson Linux 交叉编译(Docker)#

注意

对 aarch64 Jetson Linux 平台的支持是实验性的。某些功能仅适用于 x86-64 目标,并且在此构建中已关闭。

构建 aarch64 Jetson Linux 构建容器#

docker build -t nvidia/dali:builder_aarch64-linux -f docker/Dockerfile.build.aarch64-linux .

编译#

从 DALI 源代码树的根目录

docker run -v $(pwd):/dali nvidia/dali:builder_aarch64-linux

相关的 python wheel 将在 dali_root_dir/wheelhouse