从源代码编译 DALI#
使用 Docker 构建器 - 推荐#
按照以下步骤,可以以类似于我们提供的官方预构建二进制文件的方式重新创建 Python wheel。
先决条件#
Linux x64 |
|
按照链接中的安装指南和手册(需要 17.05 或更高版本)。 |
|
按照链接中的安装指南和手册。 建议使用 NVIDIA Container Toolkit,因为 nvidia-docker2 已被弃用,但两者都受支持。 构建 DALI TensorFlow 插件所需。 |
|
按照适用于您操作系统的安装手册进行操作。 注意:如果在克隆 DALI 存储库后安装了 Git LFS,请更新子模块以确保二进制 blob 已下载。 |
构建 Python Wheel#
更改目录 (cd
) 到 docker
目录并运行 ./build.sh
。如果需要,设置以下环境变量
- CUDA_VERSION - CUDA 工具包版本(官方支持 11.8 和 12.4,11.0、11.1、11.2、11.4、11.5、11.6、11.7、12.0、12.1、12.2、12.3、12.4、12.5 和 12.6 已弃用,可能无法工作)。默认值为
12.8
。由于 CUDA 扩展兼容模式,CUDA 11.1、11.2、11.3、11.4 11.5、11.6、11.7 和 11.8 wheel 被命名为 CUDA 11.0,因为它可以使用 CUDA 11.0 R450.x 驱动程序系列。这同样适用于 CUDA 12.x。请更新到该系列中最新的推荐驱动程序版本。如果 CUDA_VERSION 的值以 . 为前缀,则可以传递任何值.XX.Y
,将抑制受支持的版本检查,并且用户需要确保 docker/ 目录中存在 Dockerfile.cudaXXY.deps。 - NVIDIA_BUILD_ID - 构建的自定义 ID。默认值为
1234
。 - CREATE_WHL - 创建独立的 wheel。默认值为
YES
。 - BUILD_TF_PLUGIN - 也创建 DALI TensorFlow 插件 wheel。默认值为
NO
。 - PREBUILD_TF_PLUGINS - 是否预构建 DALI TensorFlow 插件。它应与 BUILD_TF_PLUGIN 选项一起使用。如果两个选项都设置为
YES
,则 DALI TensorFlow 插件包将与内部预构建的插件二进制文件一起构建。如果 PREBUILD_TF_PLUGINS 设置为NO
,则 wheel 仍然构建,但没有预构建的二进制文件 - 内部没有放置预构建的二进制文件,并且用户需要确保他具有合适的编译器版本(与用于构建当前 TensorFlow 的版本对齐),以便可以在安装 DALI TensorFlow 插件包期间构建插件。如果 BUILD_TF_PLUGIN 设置为NO
,则 PREBUILD_TF_PLUGINS 值将被忽略。默认值为YES
。 - CREATE_RUNNER - 创建 Docker 镜像,其中安装了 cuDNN、CUDA 和 DALI。它将创建
Docker_run_cuda
镜像,需要使用以下命令运行NVIDIA docker runtime 并将 DALI wheel(以及可选的 TensorFlow 插件,如果已编译)放在/opt/dali
目录中。默认值为NO
。 - PYVER - 用于创建 runner 镜像的 Python 版本,其中安装了上述 DALI。默认值为
3.8
。 DALI_BUILD_FLAVOR - 向 DALI 包名称添加后缀,并在 whl 包描述中添加相关注释,例如 nightly 将导致 nvidia-dali-nightly
- CMAKE_BUILD_TYPE - 构建类型,可用选项:Debug、DevDebug、Release、RelWithDebInfo。默认值为
Release
。 - STRIP_BINARY - 当与 CMAKE_BUILD_TYPE 等于 Debug、DevDebug 或 RelWithDebInfo 一起使用时,它会生成不包含任何调试信息的 bare wheel 二进制文件,以及第二个带有 *_debug.whl 名称的文件,其中包含此信息。在其他构建配置的情况下,这两个 wheel 将是相同的。
- BUILD_INHOST - 要求 Docker 挂载源代码而不是复制它。因此,连续构建将重用现有的目标文件,并且对于开发来说更快。使用 $DALI_BUILD_DIR 作为构建对象目录。默认值为
YES
。 - REBUILD_BUILDERS - 是否需要重建构建器 Docker 镜像,或者可以从之前的构建中重用。默认值为
NO
。 - DALI_BUILD_DIR - DALI 构建应发生的位置。它只在树内构建中很重要,用户可以为每个 python/CUDA 版本提供不同的路径。默认值为
build-docker-${CMAKE_BUILD_TYPE}-${PYV}-${CUDA_VERSION}
。 - ARCH - DALI 构建的架构,支持 x86_64 和 aarch64 (SBSA - Server Base System Architecture)。默认值为
x86_64
。 - WHL_PLATFORM_NAME - Python wheel 平台标签的名称。默认值为
manylinux2014_x86_64
。
值得一提的是,build.sh 应该接受与项目 CMake 相同的环境变量集。
推荐的命令行是
CUDA_VERSION=Z ./build.sh
例如
CUDA_VERSION=11.1 ./build.sh
将构建基于 CUDA 11.1 的 Python 3 DALI,并将相关的 Python wheel 放在 DALI_root/wheelhouse 中。生成的 DALI wheel 和 TensorFlow 插件与 DALI 支持的所有 Python 版本兼容。
裸机构建#
先决条件#
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 |
|
编译时代码生成需要 clang 和 python-clang 绑定。获取它们的最简单方法是“pip install clang libclang” |
|
可以非正式地禁用此功能。请参阅下文。 |
|
(可选)liblmdb |
当前支持的版本可以在 **DALI_deps** 存储库中查看。 |
构建过程仅需要 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
构建 DALI#
获取 DALI 源代码
git clone --recursive https://github.com/NVIDIA/DALI cd DALI
为 CMake 生成的 Makefile 创建一个目录。这将是 DALI 构建所在的目录。
mkdir build cd build
运行 CMake。有关可以传递给 CMake 的其他选项,请参阅可选 CMake 构建参数。
cmake -D CMAKE_BUILD_TYPE=Release ..
构建。您可以使用
-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
中