吹拉弹唱


  • Home
  • Archive
  • Categories
  • Tags
  • Books
  •  

© 2022 Kleon

Theme Typography by Makito

Proudly published with Hexo

机器学习系统 1-2 - 后端硬件指令集

Posted at 2021-01-13Updated at 2021-01-13 机器学习  机器学习 FPGA 

定制计算硬件的一个重要任务是确定指令集1。对于深度学习模型,则要首先确定模型集,继而确定算子集,最后统计出指令集。

# 划分

总体上看,指令按计算密度分为计算密集型算子指令与长尾算子指令。

计算密集型算子指令通常就是指矩阵乘加计算,其他密集型算子(比如深度学习定义的卷积运算)可以通过变换转化为矩阵乘加。

因此矩阵乘加是定制硬件的核心,也是模型优化的核心。

换句话说,定制硬件(包括GPGPU)的主要设计工作在于如何在面积功耗约束下放下更多的矩阵乘加单元,同时提供匹配算力的存储访问带宽。

模型优化的主要内容就是在于如何合理排布硬件的矩阵计算指令和存储访问指令,使矩阵计算模型的实际利用率(有效计算时间占总运行时间)尽可能接近硬件的理论算力上限。

长尾算子指令则是针对出现在模型中但计算量不太大的算子设计的指令,但总体而言模型的复杂程度和改进速度都比硬件开发速度快,不可能浪费芯片面积支持所有的长尾算子,因此设计目标按优先级排序是:

  1. 如果长尾算子不在模型首尾,而出现在两个密集算子之间,并且CPU计算开销(通常指耗时)相比交换给CPU计算(内存交换以及中断/轮询)的开销小,就应该尽量使用硬件计算。
  2. 归纳必须支持的算子,抽象出更通用的计算逻辑,尽量最小化占用的芯片面积。适配计算密集型指令算力和长尾指令算力,在多种目标场景中统计,长尾指令尽量不成为性能瓶颈。
  3. 评估大型模型(不能完全放在芯片内存中,需要和CPU主存交换)在目标承载系统中的算力适配程度,如CPU算力是否能支持内存拷贝开销,中断开销,硬件不支持的长尾算子的计算开销,系统其他服务开销。

# 粒度

指令是硬件向软件开放的“操作接口”,指令的粒度则决定了软件对硬件控制深度。

定制硬件的早期,尤其是针对某个特定模型的特定设计,软件和硬件都是及其专用的。硬件基本包揽了模型端到端的所有计算,甚至连模型结构也以一种“硬编码”的方式写在了驱动中。

硬件的整体架构只有两部分:一部分是寄存器,给软件配置来启动计算步骤,另一部分是一条巨大的流水线,归纳了整个模型最基本的计算结构,比如对于ResNet50,就是卷积-元素积-仿射变换-激活ReLU-池化。

软件运行时(Runtime)部分几乎就是很薄的一层,甚至可以大部分写在驱动中。驱动主要负责启动DMA读写数据以及配置查询寄存器。运行时只需要从某个地址读入输入数据,配置一个寄存器,接收到中断信号后读回数据写到另一个地址。

如果把配置寄存器也看作指令的话,那这就是***最粗粒度*的指令,软件没有控制的余地,指令可以写作RESNET50 🙂 。

逐渐地,需要支持更多相似模型,不同层数,不同长尾算子,则需要按层来配置卷积大小,长尾算子是否计算,有无pypass,内存数据如何存放等。硬件的流水线也配置了更多寄存器开关支持不同的计算路径。

这就是***单层粒度*的指令,软件可以通过一大组寄存器灵活配置每层的属性,也有了多模型interleaving(同时交叉)计算的空间。此时的指令可以写作LOAD-CONV-ELTMUL-AFF-RELU-POOLING-STORE 🙂 。类似粒度的硬件可以参考NVDLA2。

软件的功能逐渐增多,在运行时(Runtime)上增加编译器部分,将相近的算子变换为硬件支持的指令。硬件后端支持的模型更多了,但实际计算效率可能有所下降。这也是一个常识————通用性会牺牲专用性的性能,比如Windows和MacOS,CPU和GPU。但群体智慧的迭代可以逐步弥补通用性带来的损失,比如RISC与CISC,Android与iOS。

随着硬件的通用化,几乎不可避免地会向主流已验证设计靠拢,卷积计算将不再特例化,不断增加的变种支持会使硬件复杂度越来越来高。最终不得不回归本源————矩阵乘加,原本的超长流水线设计也会自然分化成两部分————密集计算单元与长尾计算单元指令。

密集计算单元由于去除了特例化设计,密度可以进一步提高;长尾计算单元将进一步整合,提高通用性。此时的指令进一步细化为LOAD,MATMUL,MULT,ADD,EXP,STORE等。指令操作的精细程度也进一步提高,类似SIMD操作。

多个计算单元和局部缓存构成一个计算引擎或者计算核,多个核可以由软件或者硬件直接调度(指令发射顺序),编译器的复杂度进一步上升,可以在更细粒度调整指令顺序,考虑缓存以及内存带宽匹配(Memory-Bound)。到了这个粒度的指令离GPGPU也不远了。

指令集基本划定了硬件可能的应用边界,不过实际硬件设计实现过程中还有其他要考虑的因素,取决于芯片后端与FPGA后端需求,略。


  • [1] 指令集架构
  • [2] NVIDIA Deep Learning Accelerator

Share 

 Previous post: 机器学习系统 1-3 - 后端硬件描述语言 Next post: 机器学习系统 1-1 - 后端硬件初探 

© 2022 Kleon

Theme Typography by Makito

Proudly published with Hexo