Pipeline 运行方法#
DALI pipeline 可以通过以下方式之一运行
- 简单运行方法,它运行计算并返回结果。此选项对应于
nvidia.dali.types.PipelineAPIType.BASIC()
API 类型。 nvidia.dali.Pipeline.schedule_run()
、nvidia.dali.Pipeline.share_outputs()
、nvidia.dali.Pipeline.release_outputs()
,允许对输出缓冲区生命周期进行细粒度控制。此选项对应于nvidia.dali.types.PipelineAPIType.SCHEDULED()
API 类型。- 用于 PyTorch、JAX、PaddlePaddle 和 TensorFlow 的内置迭代器。此选项对应于
nvidia.dali.types.PipelineAPIType.ITERATOR()
API 类型。
第一个 API,nvidia.dali.Pipeline.run()
方法完成以下任务
启动 DALI pipeline。
如有必要,执行预取迭代。
等待直到第一个批次准备就绪。
返回结果缓冲区。
缓冲区被标记为正在使用,直到下次调用 nvidia.dali.Pipeline.run()
。此过程可能很浪费,因为数据通常会复制到 DL 框架的本机存储对象,并且 DALI pipeline 输出可以返回到 DALI 以供重用。
第二个 API,它由 nvidia.dali.Pipeline.schedule_run()
、nvidia.dali.Pipeline.share_outputs()
和 nvidia.dali.Pipeline.release_outputs()
组成,允许您显式管理输出缓冲区的生命周期。nvidia.dali.Pipeline.schedule_run()
方法指示 DALI 准备下一批数据,并在必要时进行预取。如果执行模式设置为异步,则此调用立即返回,而无需等待结果。这样,可以同时执行另一个任务。可以通过调用 nvidia.dali.Pipeline.share_outputs()
从 DALI 请求数据批次,这将返回结果缓冲区。如果数据批次尚未准备就绪,DALI 将等待它。数据在 nvidia.dali.Pipeline.share_outputs`()
完成后立即准备就绪。当不再需要 DALI 缓冲区时(因为数据已被复制或已消耗),调用 nvidia.dali.Pipeline.release_outputs()
以返回 DALI 缓冲区,以便在后续迭代中重用。
内置迭代器使用第二个 API,为深度学习框架中的即时使用提供方便的包装器。数据以框架的本机缓冲区形式返回。迭代器的实现从 DALI 缓冲区内部复制数据,并通过调用 nvidia.dali.Pipeline.release_outputs()
回收数据。
我们建议您不要混合使用 API。API 遵循不同的输出缓冲区生命周期管理逻辑,并且该过程的详细信息可能会更改,恕不另行通知。混合使用 API 可能会导致未定义的行为,例如死锁或尝试访问无效缓冲区。