从源代码编译 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
。 感谢 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 - 用于创建在其中安装了上述 DALI 的 runner 镜像的 Python 版本。默认值为
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 一起使用时,它会生成不包含任何调试信息的裸 wheel 二进制文件,以及第二个名为 *_debug.whl 的 wheel,其中包含此信息。在其他构建配置的情况下,这两个 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 - 服务器基本系统架构)。默认值为
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 的 DALI for Python 3,并将相关的 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** 存储库。 |
(可选) GPU Direct Storage |
构建过程仅需要 libcufile,并且安装的头文件需要位于 /usr/local/cuda/include 目录中。 对于 CUDA 11.4,它可以作为 CUDA 工具包的一部分安装。 |
|
注释
构建 DALI 的 TensorFlow 插件需要安装 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 设置为 OFF 的选项构建的。 测试是在相同的配置下完成的。 我们确保 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
中