背景
越来越多的现实应用使用深度学习模型实现预测功能,这需要大量计算和内存的使用。如此规模的资源的耗费常常会给强大的服务器带来负担,更不用说低功耗的边缘设备了。如何合理使用资源以达到高效计算成为了热点问题。不同的技术方法(从算法,软件,硬件考虑)得到发展来减少实际问题中模型的计算和内存消耗,进而方便模型的开发和部署。目前来看,这些技术中量化是一个广泛被研究且有前景的方法,量化是将深度学习模型中的普遍使用的 32 位浮点数 转化为 8 位整数 进行存储,直观上能将内存占用减少 4 倍。除了更少的计算和内存资源的占用,量化的另外一个特点是保证了模型准确率与非量化模型相比不会有大的波动。这两个优点使得 量化在实际应用中已经被大量采用,许多硬件平台(如 Intel CPUS,Nvidia GPUS,ARM CPUS)纷纷引入了低精度指令来支持 数据类型的计算。现有的工作主要集中在探索新的量化方法来更好的使量化模型保持精度。在模型推理问题中,除了保持精度,降低推理时延也是一项重要衡量指标。量化技术相关的另一项研究被提出,关于如何广泛部署和高效执行这些量化后的模型,即如何将不同深度学习框架下的预量化模型执行在异构的硬件平台上。
挑战
上面讲述了量化的优点,那么量化模型的使用是否拿来就能用呢?当时不是。对于深度学习框架,量化模型的应用受限于 kernel 库的依赖,其他算子的相互作用以及不同硬件平台的适配;对于深度学习编译器,绝大部分是基于 类型的,尽管一些编译器支持量化运算符的生成和优化,但没有一个专注于编译和执行预量化模型。那么如何构建这样一种机制来使得开发者可以容易且快速地使用量化后的模型呢?主要存在如下挑战:
多框架结构:当下主流的深度学习框架有 TensorFlow, TFLite, MXNet, 和PyTorch,所以需要提出的方法可以处理不同框架下的神经网络模型。
多量化方法:不同的量化方法有均匀量化(使用最多),对称量化,非对称量化,per-channel量化等等,不同的方法在不同的问题带来不同的结果。所以提出的方法需要包含所有的这些方法。
多硬件平台:提出的方法需要可以将预量化模型运行在大量的异构设备上,并且支持使用快速整数指令,例如 Intel VNNI 或 Nvidia DP4A 指令。
表 1 展示了当下不同框架受限的硬件支持和量化方法支持。
方法
尽管流行的深度学习框架不能解决上述挑战,但 DL 编译器提供了可能性。深度学习编译器拥有框架无关的图级别的 IR(中间表示),可以将任何由任何框架编写的模型转化到这个 IR,而不同的量化方法可自然在编译器中得到使用,最后编译器依赖 LLVM 和 NVCC 等成熟的代码生成器来覆盖广泛的硬件平台,于是三个问题可迎刃而解。由于编译器原本是被设计来编译 模型的,并不支持量化算子和相关优化,而直接增加算子需要在图级别和 tensor 级别整个工具链进行更新支持,这些工作是繁琐且耗时的,这便引发一个新的问题,如何让开发者可以快速简易的的将量化之后的模型应用在不同的硬件平台上。
通过观察发现,量化算子的计算可以很容易地表示为一系列更简单的、熟悉的算子。尽管这些分解会造成初始计算图的体积增大,但现存编译器在图级别和算子级