nndeploy并行优化策略:数据并行与流水线并行实战指南

【免费下载链接】nndeploy nndeploy is a cross-platform, high-performing, and straightforward AI model deployment framework. We strive to deliver a consistent and user-friendly experience across various inference framework backends in complex deployment environments and focus on performance. 【免费下载链接】nndeploy 项目地址: https://gitcode.com/gh_mirrors/nn/nndeploy

nndeploy作为一款跨平台、高性能且易用的AI模型部署框架,致力于在复杂部署环境中为各类推理框架后端提供一致且友好的使用体验,并专注于性能优化。其中,并行优化策略是提升性能的关键手段,本文将详细介绍nndeploy中的数据并行与流水线并行实战指南。

并行优化概览

在AI模型部署过程中,为了充分利用硬件资源、提高处理效率,并行优化策略至关重要。nndeploy当前支持任务级并行和流水线并行两种并行方式,二者面向的场景不同。任务级并行在多模型以及多硬件设备的复杂场景下,基于有向无环图的模型部署方式,可充分挖掘模型部署中的并行性,缩短单次算法全流程运行耗时。流水线并行则在处理多帧的场景下,将前处理Node、推理Node、后处理Node绑定到不同线程,每个线程还可绑定不同硬件设备,从而实现三个Node的流水线并行处理,在多模型及多硬件设备的复杂场景下能显著提高整体吞吐量。

核心并行策略解析

数据并行

数据并行是一种将大规模数据分割成多个小批次,然后在多个计算单元上同时处理这些小批次数据的并行方式。通过这种方式,可以充分利用多个计算核心或设备的计算能力,加快数据处理速度。在nndeploy中,数据并行的实现需要结合具体的模型和硬件环境,合理划分数据批次,确保各计算单元负载均衡。

流水线并行

流水线并行是一种基于流水线思想的并行计算模型,主要用于解决计算密集型任务的并行执行问题,例如图像处理、视频编解码、机器学习等领域。其面向的场景为多批输入数据。流水线并行的原理是将一个大型计算任务拆分为若干个小的子任务,然后将这些子任务分配给不同的计算单元同时执行,每个计算单元只负责执行其中的一个子任务,完成后将结果传递给下一个计算单元,以此类推,直到所有子任务都被执行完成并合并为最终结果。其优点为可以充分利用计算资源,提高整体吞吐量。

在nndeploy中,可以将前处理Node、推理Node、后处理Node绑定三个不同的线程,每个线程又可绑定不同的硬件设备下,从而三个Node可流水线并行处理。

nndeploy流水线并行处理流程

如上图所示,共有4张图片需要处理,前处理、推理、后处理具有线性的依赖关系。t0时刻前处理节点处理image1的数据,t1时刻前处理节点处理image2的数据,推理节点处理由前处理计算完毕的image1数据。以此类推,每一个节点在下一时刻处理由上一个节点计算完毕的下一份数据。每一个时间片的大小由最耗时的节点时间开销决定,其余节点时间开销被隐藏。假设推理耗时最大,当数据总量足够大时,总的时间开销约等于数据总量x单个图片推理时延。

nndeploy中流水线并行实现思路如下:

  1. 初始化:对图进行拓扑排序,返回剔除死节点的排序后图;初始化线程池,线程数量等于有效节点数量。
  2. 运行:整体流程为每一个节点在其所有前驱节点计算完毕后开始运行,结束本次运行后获取新数据继续运行。这里有两个关键设计,一个是节点何时开始运行,一个是节点何时结束运行。
    • 节点何时开始运行:当该节点的运行速度小于其前驱节点时,前驱结点生成数据基本能满足该节点的运行。否则,该节点需要等待前驱结点完成计算。在流水线并行中,节点之间数据流动由PipelineEdge边控制。每条PipelineEdge可能有多个消费者节点,而不同消费者节点消耗数据速度可能不同。因此在PipelineEdge维护了两个关键数据容器。一个数据容器为数据包的list,记录了所有还会被消费者消耗的数据包。另一个为<消费者-当前消费数据包>的map,记录了每个消费者当前消费数数据包索引。当某一个数据包永远不会被消耗时,其被销毁。当某个消费者需要的数据还没生产出来时,该消费者的运行会阻塞住,直到前驱生产者节点产生数据后,才能继续运行。

nndeploy流水线并行边缘控制

- 节点何时结束运行:当所有数据都被消耗结束,且所有结果都已计算得出后,需要结束所有节点线程。主线程与节点线程关系通过在主线程获得结果这一步进行同步,保证所有数据的结果都被返回后,进行反初始化操作,给每个节点线程发送停止信号。
  1. 反初始化:给线程池中所有节点线程发送停止信号,结束运行;销毁线程池。

实战性能对比

以YOLOv8n处理24张图片为例,对比串行与流水线并行的性能结果如下表所示:

YOLOv8n串行与流水线并行性能对比

从表中可以清晰地看到,在不同的推理引擎下,流水线并行相比串行都有显著的性能提升,大大减少了总耗时,提高了处理效率。

并行优化配置步骤

环境准备

首先,确保已正确安装nndeploy框架。可以通过以下命令克隆仓库:

git clone https://gitcode.com/gh_mirrors/nn/nndeploy

数据并行配置

  1. 根据模型和硬件资源,确定数据批次大小。
  2. 在代码中设置数据并行相关参数,如并行设备数量、数据划分方式等。具体配置可参考官方文档中的相关说明。

流水线并行配置

  1. 构建有向无环图,将任务拆分为前处理、推理、后处理等节点。
  2. 在图中设置各节点的线程绑定和硬件设备绑定。
  3. 配置PipelineEdge边的相关参数,确保数据在节点间的顺畅流动。

详细的配置步骤和示例可参考docs/zh_cn/quick_start/deploy.md

总结

nndeploy的并行优化策略为AI模型部署提供了强大的性能提升手段。数据并行通过分割数据批次,充分利用多计算单元的能力;流水线并行则通过任务拆分和节点并行处理,显著提高整体吞吐量。在实际应用中,可根据具体场景选择合适的并行策略,或结合使用以达到最佳性能。通过合理配置和优化,nndeploy能够在复杂的部署环境中发挥出卓越的性能,为各类AI应用提供高效的支持。

希望本文的实战指南能够帮助开发者更好地理解和应用nndeploy的并行优化策略,实现AI模型的高效部署。更多详细信息和高级用法,请参考官方文档和相关源码。

【免费下载链接】nndeploy nndeploy is a cross-platform, high-performing, and straightforward AI model deployment framework. We strive to deliver a consistent and user-friendly experience across various inference framework backends in complex deployment environments and focus on performance. 【免费下载链接】nndeploy 项目地址: https://gitcode.com/gh_mirrors/nn/nndeploy

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐