文章目录
- 前言
- 一、深度学习中的并行
- 二、推理中的模型并行
- 二、推理中的数据并行
- 2.1 workload的分割
前言
深度学习模型的生成方式和传统的编程模型不一样,是根据数据和答案,生成一组规则,去描述现实中的某个场景;反之可以利用这组规则去推测一组数据对应的答案,这就是inference过程。而描述这组规则的,就是模型。
为了加速推理过程,出来CPU、GPU之外,还有其他各种各样的的xPU。不同架构的xPU,有不同的使用使用方法。本文以一文吃透AI芯片技术路线,清华尹首一教授演讲全文中提到的数据流处理器为例,聊聊相关的并处化方法。因为本司的xPU就是此种架构。
第二类是数据流AI处理器,这是一种计算行为由数据调度决定的数据流驱动的张量处理架构,其特点是优化数据复用和计算并行度。在典型的数据流处理器中,神经网络张量会被划分成不同的tile,每个tile内的计算被映射到一个处理单元(PE)阵列中。典型的数据流包括两种:一种称为权重稳定数据流,一种称为输出稳定数据流,分别对应着充分复用权重数据、充分复用输出数据,通过不同数据流提高数据复用、减少缓存,提高计算并行度,从而最终提高芯片的处理能力和处理能效
关于Weight Stationary 和 Output Stationary 可参见"Efficient Processing of Deep Neural Networks: from Algorithms to Hardware Architectures"中相关的描述。
本司其实用的是如下的方案:
此方案的优势在于:
为了发挥xPU的硬件能力,需要将workload尽量布置在尽可能多的计算单元上,充分利用硬件并行计算的特性,加快推理过程。这就对深度学习编译器提出了需求:根据xPU特性,做并行调度。
一、深度学习中的并行
并行化在深度学习分布式训练中提得比较多,但其实推理场景也有类似的需求。下面3个框图是经典的描述分布式训练的场景。
在xPU上做推理时需要做模型并行或数据并行的优化吗? 由以下设计目标可见,为了充分发布处理器的性能,需要让PE尽可能同时keep busy。
为增加Throughput和减少Latency,并行化是个优化方向, 如下图所示。
所以编译器的一个优化工作就是做workload的分割,将sub-workload分摊到各个PE,理想情况下就是让所有PE全速工作。另一个需要分割的原因就是片上ram大小的限制。
传统的计算体系结构会包含多层级的memory,同样在xPU上也有类似的层级,这都是由于片上内存过小的关系。片上ram可能无法同时容纳下"模型的meta数据+ weights + activations", 需要以分时的方式计算局部,最后汇总得到推理结果。 对编译器在编译模型时则有如下需求:
- 显式的控制流依赖操作
- 内存覆盖(Overlay)技术(在memory大小受限的场景下)
- 功能上相对独立的数据块
- 不会同时使用的数据块共享同一块片上内存区域
- 打破了必须将全部数据全装入片上内存后才能运行的限制
- 计算和数据搬移尽可能并行
二、推理中的模型并行
在一个机器中,如果除了CPU和GPU之外,还有xPU,那么怎么来压榨机器的算力呢? 一种方法就是各个处理器各自为战,相互之间是透明的;另外一个选择则是hybrid模式。采用hybrid模式,编译器会意识到有3个处理器,且知道各个处理器的NN处理能力。在编译阶段,根据各个layer或op的特性,挑选最合适的处理器做推理。为了减少数据的搬移,尽可能将op放在同一个处理器上,比如xPU。如果最终op会在xPU和GPU上运行,就是模型的并行运行。
可见模型的并行一般是在处理器之间,那么xPU内部可以做到模型的并行吗?那就是同一时间,各个PE跑了不同的op。但是由于xPU不足以同时容纳下所有的op,还得分时复用PE;且同时跑的PE间如果有数据依赖关系,也不能做到并行;另外就是如果PE间的数据不能够共享,则需要额外的数据搬移,效率更低。所以处理器内部一般不用模型并行的策略。
二、推理中的数据并行
处理器内部一般使用数据并行方式。根据MAC的组织结构,将workload一层层的分割下去,最终匹配MAC计算要求。
2.1 workload的分割
对一个图像检测或分类方面的深度学习模型而言,一般的规律是输入activation的长宽比较大,而channel比较少;层级越往后,feature map的长宽变小,但是channel会变得巨大。
参考上述的Weight Stationary 和 Output Stationary, 开始时应将activation按高度分割;而后期某一个层后,将weights按照输出channel分割。
分割的原则应该是正好匹配硬件所需要,不能切割得太碎片,否则得不偿失。