Pipeline 运行方法#

DALI pipeline 可以通过以下方式之一运行

第一个 API,nvidia.dali.Pipeline.run() 方法完成以下任务

  1. 启动 DALI pipeline。

  2. 如有必要,执行预取迭代。

  3. 等待直到第一个批次准备就绪。

  4. 返回结果缓冲区。

缓冲区被标记为正在使用,直到下次调用 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 可能会导致未定义的行为,例如死锁或尝试访问无效缓冲区。