昇腾社区首页
中文
注册

模型下沉调度

特性简介

在AI模型运行中,通常需要CPU和AI专用处理器(如NPU,又称昇腾AI处理器)协同工作。CPU所在位置称为主机端(Host),而NPU所在位置称为设备端(Device)。主机端擅长处理复杂的逻辑计算,而设备端擅长进行高并行计算。通过高效的计算调度机制,实现Host和Device之间的高效协同是提高AI模型性能的关键,能够显著提升异构系统资源的利用率。

Host CPU将模型中的算子依次下发到Device执行(如下图中的标号①所示),每一个算子在执行流上以1个或多个Task的形式存在,昇腾AI处理器依次拉取执行流上的Task执行。这种Host调度带来的问题是,需要Host和Device频繁交互,在实际的训练或推理场景中,模型会运行多次,每次运行都会触发Host把模型上的所有算子遍历下发一遍。

图1 Host调度示意图

对于输入tensor shape固定不变的静态Shape的模型,在编译时即可确定所有算子的输入输出shape,结合昇腾内存复用算法,可完成模型级内存编排;静态shape模型在编译时还可提前完成所有算子的Tiling计算等Host侧计算。因此,GE提供了静态图下沉调度模式,让模型中的算子在加载阶段提前以整图的形式下发到Device上,在执行时,只需在Host侧下发一个模型执行的Task即可触发模型在Device上调度执行。相比于Host调度模式,下沉调度模式可大大降低Host侧调度开销,有效减少Host和Device之间的交互。

图2 静态图下沉调度示意图

实现原理

模型下沉调度分为两个阶段,模型加载和模型执行。

  • 模型加载:模型加载的具体动作和Host调度类似,即遍历图中的所有算子并将其整体下发至Device流上,区别在于下发到流上不立即执行。模型加载是一次性的动作,在首次模型执行时完成模型加载,如上图中的过程①所示。
  • 模型执行:模型加载完成之后,可以像下发单算子Task一样,向执行流下发一个模型执行Task,昇腾AI处理器调度到该Task时(如上图 “执行流”中的E),执行模型中所有Task(如上图中的过程③)。如果需要多次运行模型,仅需多次下发模型执行Task,如上图中的过程②所示。

Host Bound调度和模型下沉调度的时序比较如下图所示,可以看出模型下沉执行的开始有一个模型下发的头开销,模型下沉执行E2E会有一个相对于Host调度的收益,模型的下沉头开销越小,收益将越大。

模型下沉调度Host/Device时序分析如下所示。

每次模型下发时,支持更新模型的Feature Map内存地址和输入输出内存地址,如果模型的Feature Map内存和模型输入输出内存发生了更新,则在模型下沉头开销(即上图中的m_l_t,后文有介绍)中会完成模型内算子相关地址的刷新。