深度解读昇腾 CANN 模型下沉技术,提升模型调度性能
![深度解读昇腾CANN模型下沉技术,提升模型调度性能](https://static001.geekbang.org/infoq/c6/c6b5406bef08f89f70e5a6a4fca192c5.jpeg)
本文分享自华为云社区《深度解读昇腾CANN模型下沉技术,提升模型调度性能》,作者:昇腾 CANN。
AI 模型的运行通常情况下需要 CPU 和 NPU(昇腾 AI 处理器)等 AI 专用处理器协同工作,CPU 所在位置称为主机端(Host),而 NPU 所在位置称为设备端(Device)。对于采用 Host 调度的 AI 模型来说,Host 下发 Task 的时序和 Device 执行 Task 的时序是异步的,如果 Device 执行 Task 的速度比 Host 下发 Task 的速度快,则 Device 会处于空闲状态。比如,大模型场景的增量推理或训练的 FineTune 阶段,都是计算量较小的场景,此时很容易出现单个算子的 Host 下发时间比 Device 上的算子执行时间还长,从而导致 Device 间歇处于空闲状态。这种现象通常称为 Host Bound,这种模型也称为 Host Bound 模型。
如何减少 Host Bound 模型的 Device 空闲时间,从而优化模型执行性能显得尤其重要,GE(Graph Engine)图引擎通过图模式的 Host 调度和模型下沉调度的方式,可提升模型调度性能,缩短模型 E2E 执行时间。
1 模型 Host 调度
Host CPU 将模型中的算子依次下发到 Device 执行(如下图中的标号①所示),每一个算子在执行流上以 1 个或多个 Task 的形式存在,昇腾 AI 处理器依次拉取执行流上的 Task 执行(如下图中的标号②所示),我们称这个过程为 Host 调度。Host 调度需要 Host 和 Device 频繁交互,在实际的训练或推理场景中,模型会运行多次,每次运行都会触发 Host 把模型上的所有算子遍历下发一遍。
图 1 Host 调度:
![](https://static001.geekbang.org/infoq/02/02a1afe6702c5ff39a5da74c5210b734.png)
1.1 Device Bound 与 Host Bound
如果 Device 上 Task 执行速度比 Host 下发慢,则 Device 上 Task 调度开销和算子执行时间成为瓶颈,这种模型通常称为 Device Bound 模型,如图 2 所示。Device Bound 的模型,Task 的下发开销会被已下发 Task 的执行时间掩盖起来。
图 2 Host 调度场景 Device Bound 执行时序分析:
![](https://static001.geekbang.org/infoq/d7/d7112a76793426a57f5761e8e9fed5ab.png)
如果 Device 上 Task 执行速度比 Host 下发快,则 Host 调度开销成为瓶颈,这种模型通常被称为 Host Bound 模型,如图 3 所示。Host Bound 的模型,Task 的下发开销不能完全被已下发 Task 的执行时间掩盖,Device 执行时序上存在间歇的空闲状态。
图 3 Host 调度场景 Host Bound 执行时序分析:
![](https://static001.geekbang.org/infoq/98/98ee948f5e23e21460d739f851c3a4c8.png)
1.2 单算子模式 Host 调度与图模式 Host 调度
在前面几期介绍中,我们知道当前业界主流的深度学习框架提供了 Eager 执行(Eager Execution,即时执行)模式与图执行模式。Eager 模式也叫单算子模式,它是一种 Host 调度模式,由 Host CPU 逐个下发算子,一个算子的下发流程包含 Python 处理、Python 到 C++数据结构转换、Tiling 计算,申请算子的 Workspace 内存和输出内存,Launch 等 Host 操作。为了加速单算子 Host 调度,在 PyTorch 中,昇腾适配层采用了生产者—消费者双线程模式加速,生产者线程主要负责 Launch 之前的处理动作,消费者线程主要负责 Launch 算子。
相比于单算子模式,图模式的 Host 调度可以避免总是返回 Python 调用栈,避免冗余流程与数据结构转换,并且可以直接使用图编译阶段完成的 Infer Shape 与 Tiling 计算结果。因此,图模式 Host 单线程调度与单算子模式 Host 双线程调度相比,调度性能持平或略优。
2 模型下沉调度
图模式调度可以降低 Host 侧的调度耗时,并一定程度减少模型执行 E2E 耗时,但如何降低 Device 上执行时序的空闲时间仍是需要考虑的问题。对于静态 shape 模型,昇腾支持下沉调度,可大幅优化 Host 调度性能。
所谓静态 shape 模型,是指模型每次执行的输入 tensor shape 是固定不变的,模型中的所有算子,给定输入 shape 后,都可以确定自己的输出 shape,那么该模型为静态 shape 模型。
静态 shape 模型在编译时即可确定所有算子的输入输出 shape,结合昇腾内存复用算法,可完成模型级内存编排;静态 shape 模型在编译时还可提前完成所有算子的 Tiling 计算等 Host 侧计算。综上,静态 shape 模型可以在编译时完成所有执行时的 Host 调度工作,这是静态 shape 模型下沉调度的理论基础。
2.1 下沉调度原理
模型下沉调度分为两个阶段,模型加载和模型执行。
图 4 模型下沉示意图:
![](https://static001.geekbang.org/infoq/95/957a7ebf221b896b1fcebadcc3303089.png)
模型加载
模型加载的具体动作和 Host 调度类似,即遍历图中的所有算子并将其整体下发至 Device 流上,区别在于下发到流上不立即执行。模型加载是一次性的动作,在首次模型执行时完成模型加载,如图 4 中的过程①所示。
模型执行
模型加载完成之后,可以像下发单算子 Task 一样,向执行流下发一个模型执行 Task,昇腾 AI 处理器调度到该 Task 时(如图 4 “执行流”中的 E),执行模型中所有 Task(如图 4 中的过程③)。如果需要多次运行模型,仅需多次下发模型执行 Task,如图 4 中的过程②所示。
Host Bound 调度和模型下沉调度的时序比较如图 5 所示,可以看出模型下沉执行的开始有一个模型下发的头开销,模型下沉执行 E2E 会有一个相对于 Host 调度的收益,模型的下沉头开销越小,收益将越大。
图 5 模型下沉调度 Host/Device 时序分析:
![](https://static001.geekbang.org/infoq/e7/e780294c9948f3229be91b23eb3b8035.png)
每次模型下发时,支持更新模型的 Feature Map 内存地址和输入输出内存地址,如果模型的 Feature Map 内存和模型输入输出内存发生了更新,则在模型下沉头开销(即上图中的 m_l_t,后文有介绍)中会完成模型内算子相关地址的刷新。
2.2 下沉效果
模型下沉执行存在如下优势:
减少 CPU 的负载
对于模型下沉执行的方式,执行时不需要 Host 和 Device 频繁交互,调度的开销仅包含模型下沉的头开销和 Task 从流上调度到加速器上的开销。总的来说,模型下沉执行的方式,Host CPU 的负载降低了,在一定程度上整机、集群的功耗也会降低。
减少 Rank 之间的通信抖动
对于 Host 调度执行方式,集群场景下由于不同卡上的 Host 下发时序不一定完全同步,卡间集合通信可能存在一定程度上的抖动。而下沉执行方式则不存在该问题,因为 Task 已提前排布到 Device 上。
提升 E2E 的收益
由于 Task 已提前下沉到了 Device,对于 Host Bound 的模型,E2E 会有性能提升。以 Host Bound 的 LLaMA-7B 模型的推理场景为例,图 6 是 Host 调度的 Profiling 性能数据,图 7 是模型下沉执行的 Profiling 性能数据。通过 Profiling 结果可以看出该模型是一个 Host Bound 模型,采用 Host 调度方式,Device 上计算时间和空隙的时间比例接近 1:1,采用模型下沉执行方式,Device 空隙大幅减少,并且端到端有 18ms 的收益,吞吐量整体提升 37%。
图 6 LLaMA-7B Decoding Host 调度 Profiling:
![](https://static001.geekbang.org/infoq/57/57e9b46d55a81a45931410b818c554d4.png)
图 7 LLaMA-7B Decoding 模型下沉 Profiling:
![](https://static001.geekbang.org/infoq/df/dfee43a6a98602237efdb7517f49755e.png)
2.3 下沉头开销
下沉执行头开销包括以下几部分:
1、模型输入输出 Tensor 到内部 InputData/OutputData 数据结构转换。如图 8 中的 stage1_t。
2、如果模型的 Feature Map 内存和模型输入输出内存有变更,刷新相关联算子的相关地址。如图 8 中的 stage2_t。
3、如果模型的输入不支持零拷贝,(如模型的输入为 Host 内存),则下发异步拷贝 Task。如图 8 中的 stage3_t。
4、下发模型执行 Task。如图 8 中的 stage4_t。
图 8 模型下沉头开销拆分:
![](https://static001.geekbang.org/infoq/6d/6d23bc2ad82fd7aa6e402f46d36e1240.png)
以盘古 71B 增量推理模型为例(模型输入输出总个数约 1600 个,模型内节点总数约 6300 个,模型运行时,Feature Map 内存地址不变更,10 个输入输出内存地址变更),当前模型下沉的头开销约 2ms,关于头开销的性能优化在持续进行中。
3 更多介绍
GE 模型下沉技术的相关介绍就到这里,欢迎大家关注后续技术分享。如需获取更多学习资源请登录昇腾社区。
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/d866596109c85bbdaf982ccfe】。文章转载请联系作者。
评论