Q&A#

Q: 如何知道 DALI 是否能帮助我?#

A: 您需要先查看我们的文档,看看 DALI 运算符是否涵盖您的用例。然后,尝试使用固定的数据源运行几次训练迭代 - 生成一个批次并在测试运行中重复使用它,以查看在没有任何数据处理的情况下,您是否可以更快地进行训练。如果是这样,那么数据处理就是一个瓶颈,在这种情况下,DALI 可能会有所帮助。关于这个主题的详细讨论,请参阅 GTC’22 演讲

Q: DALI 支持哪些数据格式?#

A: DALI 可以加载大多数图像文件格式(JPEG、PNG、TIFF、JPEG2000 等)以及音频(WAV、OGG、FLAC)和视频(avi、mp4、mkv、mov、H264、HEVC、MPEG4、MJPEG、VP8、VP9)。文件可以单独存储,也可以分组存储在常见 DL 框架的存储容器中 - TFRecord、RecordIO、caffe/caffe2 LMDB。也支持 WebDataset。如果对特定格式没有原生支持,则可以在用户提供的 python 代码中加载和解析数据,并通过外部源运算符提供。

Q: DALI 与 TF、PyTorch、MXNet 或其他 FW 有何不同?#

A: 主要区别在于数据预处理和增强是 GPU 加速的,并且处理是针对整个批次完成的,以提高 GPU 利用率。此外,它可以在多种不同的 FW(TF、MXNet、PyTorch、PaddlePaddle)中使用 - 因此您可以确保数据处理是位精确的,这在您在 FW 之间移动模型并看到精度方面的一些差异时非常重要。此外,它提供了一种方便的方式来在 GPU 和 CPU 之间切换数据处理,以利用所有可用的计算资源。

Q: 如果 DALI 没有涵盖我的用例怎么办?#

A: 您可以首先尝试用 Python 编写自定义运算符,以检查是否可以创建您喜欢的数据管道(您甚至可以在内部使用 CuPy 来利用 GPU)。然后,您可以创建一个带有运行本机代码的运算符的插件,或者使用 Numba 将 python 代码转换为本机运算符。您也可以成为贡献者,让您的工作成为 DALI 代码库的一部分 - 我们非常乐意审查和接受任何包含新功能的 PR。

Q: 如何将 DALI 用于推理?#

A: 您可以轻松地将 DALI 与 Triton Inference Server 一起用于推理。我们开发了一个专用的 DALI Backend,因此您只需向 Triton 提供处理管道的描述,并将 DALI 添加到模型集成中即可。有关将 DALI 与 Triton 结合使用的更多信息,请参阅 DALI Backend 文档

Q: 与使用 OpenCV 加载相比,使用 DALI 的速度提升有多大?特别是对于 JPEG 图像。#

A: DALI 利用 nvJPEG 加速 JPEG 解码。使用 NVIDIA A100 Ampere GPU,它实现了高达 2.5 倍的加速 - 请参阅详细信息。对于没有 GPU 加速解码的其他图像格式,DALI 要么使用 OpenCV(如 PNG),要么直接使用专用库,如 libtiff。在这种情况下,性能应该是相当的。

Q: 可以将 DALI 与 DeepStream 一起使用吗?#

A: 没有理由认为用 DALI 训练的模型不能用于 DeepStream 的推理。DeepStream 主要关注在线视频和音频推理管道,DALI 只能在离线场景中执行此操作。这两个解决方案之间没有直接集成。

Q: 如何在 DALI 中控制视频读取器中的帧数?#

A: 可以通过 sequence_length 参数控制。

Q: DALI 体积数据处理可以用于超声扫描吗?#

A: DALI 不支持任何特定领域的数据格式,如 NIfTI,但在大多数情况下,数据首先离线处理并转换为更适合数据处理的格式,如 NumPy 数组(包括初始归一化和转换)。如果数据以 DALI 支持的格式提供,那么无论它是超声波还是 CT 扫描,都没有理由不能处理。

请注意,DALI 不支持 3D 重建,无论是从 2D 超声扫描序列还是 CT 正弦图。

Q: 如何调试 DALI pipeline?#

A: 最近 DALI 添加了 eager debug mode,因此可以立即评估每个运算符的输出,并且可以在 pipeline 内添加 Python 代码以进行原型设计。

Q: 我可以访问 pipeline 中间数据节点的内容吗?#

A: 在 pipeline 模式下,这是不可能的,但是,由于最近引入的 debug mode,可以做到这一点。出于性能原因,此功能仅用于调试和原型设计。

Q: DALI 什么时候会支持 XYZ 运算符?#

A: 我们无法承诺添加任何特定运算符的时间表。尽管如此,我们对外部贡献持开放态度。最重要的是,每个用户都可以在不修改其代码库的情况下自行扩展 DALI,请查看 此页面 以了解更多详细信息。

Q: 我应该如何知道是否应该使用 CPU 或 GPU 运算符变体?#

A: 这取决于具体的用例。我会首先检查 GPU 利用率,看看将更多工作负载放在 GPU 上是否会减慢速度,或者先将所有内容放在 CPU 上,然后逐渐将内容移至 GPU,看看是否有帮助。您可以查看 我们的 GTC22 演讲博客文章,了解如何逐步执行此操作。

Q: 如何为 DALI 提供自定义数据源/读取模式?#

A: 您可以使用 python 和 外部源运算符定义任何自定义数据加载模式。为了加快速度,请使用 其并行功能

Q: DALI 是否具有任何分析功能?#

A: DALI 没有内置的分析功能,但它仍然利用 NVTX 范围,并且具有专用域(因此很容易在分析中找到)来显示其操作。因此,您可以使用 NVIDIA Nsight Systems 或任何也支持 NVTX 标记的深度学习分析器来捕获分析。

Q: DALI 是否支持多 GPU/节点训练?#

A: 是的,DALI 支持数据并行和分布式数据并行策略(您可以 在此处 阅读更多关于这些策略的信息)。它使用分片数(世界大小)和分片 ID(全局排名)将数据分片为不重叠的部分,并使用设备 ID 来识别特定节点中使用的 GPU(本地排名)。

更多详细信息也可以在 此文档部分 中找到

Q: 如何报告问题/RFE 或获得 DALI 使用方面的帮助?#

A: DALI 是一个托管在 GitHub 上的开源项目,您可以使用 此链接 直接提问和报告问题。

Q: DALI 可以加速数据加载,而不仅仅是处理吗?#

A: DALI 主要关注处理加速,因为在大多数情况下,输入数据是压缩的(音频、视频或图像),并且与原始解码输出相比,输入数据相对较小。尽管如此,在某些情况下,数据未压缩,并且直接将其加载到 GPU 是可行的。为了支持这种情况,DALI 可以在 Numpy GPU 读取器内部使用 GPUDirect Storage 以绕过 CPU 并将数据直接加载到 GPU。

Q: 如何获取 DALI?#

A: DALI 以预构建的 python wheel 二进制文件形式提供 - 请参阅了解如何安装它 或作为 源代码,可以自行构建。

Q: DALI 支持哪些操作系统?#

A: DALI 支持所有主要的 Linux 发行版,并通过 WSL 间接支持 Windows。遗憾的是,不支持 MacOS。

Q: 在哪里可以找到 DALI 支持的运算符列表?#

A: 您可以在 此处 找到可用运算符的完整列表。

Q: 我可以向 Triton 服务器发送一批形状不同的样本请求(例如,长度不同的文件)吗?#

A: 批处理是 DALI 的主要范例之一。另一方面,Triton Inference Server 默认支持统一批处理。但是,通过启用 ragged batching,您可以发送非均匀批次并成功处理它们。在 此处,您可以找到将 ragged batching 功能与 DALI Backend 结合使用的示例。

Q: 我听说过新的数据处理框架 XYZ,DALI 比它好在哪里?#

A: DALI 是一个旨在加速我们看到由于 CPU 瓶颈而受到最大影响的某些工作负载的库。DALI 未涵盖许多情况,或者 DALI 可能不是最佳选择,而这些是其他解决方案可能发光的地方。

值得记住的是,其他库中有很多广告宣传的优化措施,但它们以降低训练或推理过程中的准确性为代价 - DALI 已在 MLPerf 基准测试和 NVIDIA Deep Learning Examples 中证明了自己,在这些基准测试和示例中,不仅速度重要,而且准确性也很重要。因此,用户可以确信 DALI 没有偷工减料。

Q: DALI 与其他 GPU 兼容吗?#

A: 当涉及到 DALI 是否支持非 NVIDIA GPU 的问题时,答案是否定的。DALI GPU 实现是用 CUDA 编写的。但是,有一些开源社区正在努力在其他 GPU 架构上启用基于 CUDA 的应用程序,但 DALI 官方不支持它。

Q: 何时使用 DALI,何时使用 RAPIDS?#

A: RAPIDS 更适合通用机器学习和数据分析。DALI 是深度学习工作流程的专用工具,旨在加速密集数据(如图像、视频、音频)处理,并将预处理与网络前向/后向传递重叠。

Q: 当需要最小延迟(即 batch_size=1)时,Triton + DALI 仍然比在 CPU 上进行预处理显着更好吗?#

这取决于我们与哪个基本实现进行比较,但总的来说,DALI 最有利于训练/推理的吞吐量,因为它可以使用 GPU 的大规模并行性进行批处理。尽管如此,DALI 运算符的 GPU 实现经过优化且速度很快,因此可能会降低推理延迟。

Q: 是否有使用 DALI 处理体积数据的示例?#

A: 是的,例如,DALI 被用于在 NVIDIA 的 MLPerf UNet3D 提交中实现高性能。您可以阅读一篇关于它的有趣文章 此处。您可以在 此示例 中看到使用的 DALI pipeline。

Q: 在哪里可以找到有关使用图像解码器和进行图像处理的更多详细信息?#

A: 您始终可以参考 DALI 文档的相关部分,您可以在其中找到 DALI 在不同用例中使用的多个示例。对于初学者,您还可以观看 我们在本次 GTC 上的介绍性演讲

Q: DALI 是否利用任何特殊的 NVIDIA GPU 功能?#

A: 是的,DALI 使用 NVJPEG - 特殊的 HW 单元卸载 JPEG 图像解码,NVDEC - HW 视频解码器,GPUDirect Storage - 直接将数据加载到 GPU 以避免通过 CPU 的缓慢往返的能力。

Q: DALI 可以在没有 GPU 的情况下运行吗?#

A: 是的。绝大多数运算符都有 CPU 和 GPU 变体,并且所有运算符都在 CPU 上运行的 pipeline 不需要 GPU 即可运行。但是,DALI 主要是一个 GPU 库,CPU 运算符没有经过彻底优化。此功能的主要目标是在没有 GPU 的机器(如笔记本电脑)上启用 DALI pipeline 的开发,并能够在以后将 DALI pipeline 部署在支持 GPU 的集群上。

Q: 我可以通过 Python 模型在 Triton 服务器中使用 DALI 吗?#

A: 如果服务器使用的 Python 安装了 DALI,您可以这样做,但为了获得最佳性能,我们鼓励您使用专用的 DALI 后端。它跳过了 Python 层,并优化了 Triton 服务器和 DALI pipeline 之间的交互。

Q: 可以为 DALI pipeline 自动生成 Triton 模型配置吗?#

A: 尚未实现,但我们正在积极开发此功能,我们希望很快为 DALI Backend 提供模型配置自动生成功能。

Q: 将 DALI 与现有 pipeline(如 PyTorch Lightning)集成有多容易?#

A: 由于 PyTorch 迭代器,它非常容易与 PyTorch Lightning 集成。有一个专门的示例 在此处 提供。

Q: 与在数据加载器中使用多个 PyTorch 工作线程相比,使用单个 GPU 的 DALI 通常会导致吞吐量降低吗?#

A: 在 CPU 执行的情况下,DALI 也使用多个工作线程。即使对于一个 GPU,使用 DALI 也应该在大多数情况下产生更好的性能。当然,细节可能取决于特定的 CPU 和 GPU 以及 pipeline 本身,以及引入 DALI 之前的当前 GPU 利用率。您可以查看 我们的 GTC22 演讲博客文章 以在实践中看到这一点。

Q: 当转换图像数据时,例如旋转/裁剪等,标签(例如,边界框)会自动调整吗?如果是,如何调整?#

A: 元数据(如边界框或坐标)不会随数据自动调整,但 DALI 有一组运算符,例如用于边界框的 bbox_pasterandom_bbox_crop 或用于坐标集的 coord_transform。您可以在 此处 找到一个示例。

Q: 实现自定义处理步骤有多容易?过去,我在 CPU 上计算 3D 高斯分布时遇到问题。使用自定义 DALI 函数是否可以实现?#

A: 有几种方法可以做到这一点。您可以使用 C++/CUDA 编写自定义运算符,或通过 Python 函数和 Numba 运算符运行任意 Python 代码。您可以在 此处 了解有关此主题的更多信息。

Q: DALI 是否在 Jetson 平台(如 Xavier AGX 或 Orin)上可用?#

A: 目前我们没有发布 Jetson 的二进制文件,但应该可以从源代码构建 DALI。您可以在 此处 了解有关确切步骤的更多信息。

Q: 是否可以将数据直接从实时摄像头流传输到 DALI pipeline?#

A: DALI 中没有专门处理摄像头流的方法,但您可以使用 fn.external_source 运算符来实现。它允许您使用 Python 函数或迭代器来提供数据,因此如果您的摄像头流可以从 Python 访问 - 这就是可行的方法。

Q: 与框架原生函数相比,使用 DALI 进行分布式数据并行批处理有什么优势?#

A: 通过使用 DALI,您不仅可以加速数据加载,还可以加速整个预处理 pipeline - 因此您可以获得 GPU 上批处理的好处,并将预处理与训练重叠。DALI 还具有预取队列,这意味着它可以提前预处理几个批次,以最大限度地提高吞吐量。