Q&A#

问:我如何知道 DALI 是否可以帮助我?#

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

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

答: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 代码中加载和解析数据,并通过外部源操作符提供。

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

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

问:如果 DALI 不涵盖我的用例该怎么办?#

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

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

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

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

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

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

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

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

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

问:DALI 体积数据处理可以与超声波扫描一起使用吗?#

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

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

问:如何调试 DALI pipeline?#

答:最近 DALI 添加了 一种 eager 调试模式,因此可以立即评估每个操作符的输出,并且可以在 pipeline 内部添加 Python 代码以进行原型设计。

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

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

问:DALI 何时会支持 XYZ 操作符?#

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

问:我应该如何知道是否应该使用 CPU 或 GPU 操作符变体?#

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

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

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

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

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

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

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

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

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

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

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

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

问:如何获取 DALI?#

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

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

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

问:在哪里可以找到 DALI 支持的操作列表?#

答:您可以在 此处 找到可用操作符的完整列表。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

答:由于 PyTorch 迭代器,它非常容易与 PyTorch Lightning 集成。此处提供了专用示例 here

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

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

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

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

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

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

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

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

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

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

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

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