MobiSys'21 | nn-Meter: Towards Accurate Latency Prediction of Deep-Learning Model Inference on Diverse Edge Devices
简介
该论文是MobiSys 2021的最佳论文。该论文提出了nn-Meter。nn-Meter 是一个模型推理时间预测系统。该系统可高效、准确地预测 DNN 模型在不同边缘设备上的推理延迟,其关键思想是将整个模型划分为内核(kernel),即设备上的执行单元,然后执行内核级预测。
背景
随着越来越多深度神经网络出现,预测网络推理性能的系统要有泛化性才能适应。
- 如果要进行模型级别的预测,搜索空间太大。
- 如果用算子级别的预测,就不能捕捉图级别的优化。
深度学习推理框架通常会经过图级别的优化(例如算子融合),这种优化可能和后端有关,也可能和后端无关。针对这种图级别的性能优化,nn-Meter提出了内核级预测方法,从而检测不同后端的不同融合规则。
动机
- 内核是基本的调度和执行单位。
- 在现在的深度学习中基本算子和内核的类型是很有限的。内核级预测可以足够通用以支持未来新的网络架构。
挑战
- 如何将模型在不同设备上划分成不同内核。由于很多设备会有运行时优化,导致不同的设备的内核是不一样的。
- 如何对一个内核的性能(延迟)进行预测。内核的可配置参数维度高,预测的搜索空间大,内核的优化在不同设备上多种多样。
方法设计
nn-Meter基于内核检测和自适应数据采样进行内核级预测。开源框架(e.g. Tensorflow)的后端无关优化的输出结果作为预测过程的输入。
基本假设
内核的运行的顺序的。在边缘设备上并没有太多资源可以并行运行多个内核,而并发运行多个内核并没有太多好处。由此预测时间可以看作内核预计运行时间之和。
评估数据集
构建一个适用于通道检测地核NAS的大范围预测的数据集。在 ImageNet2012 上收集了十二个 SOTA 的CNN模型。并且根据输出通道大小和内核大小为每个模型生成2000多个变体。此外,研究员们还从 NASBench201 选取了2,000个在 CIFAR10 上测试精度最高的模型,其中每个模型都有一组不同的连接结构。
内核检测
用于把目标模型划分成内核的集合。
检测的挑战
- 很多边缘平台的后端推理是闭源的
- CNN 模型是任意的
融合原则
算子的类型和算子的连接方法都会影响内核融合。
类型:像激活函数容易融合。
连接方法:如图4所示:
- 对于(a)类算子是容易融合的
- 对于(b)类算子,如果算子345融合了自然是最好的。如果只有算子34融合,那算子3和算子4的输出都需要被保留。
- 对于(c)类算子,如果只有算子68融合,那是不会带来额外开销的。
需要确保融合不带来环形依赖。
Test cases
测试样例需要覆盖算子类型和连接,以检测不同后端的融合规则。对于单入单出的情况,如果满足下列不等式,就把算子1和算子2融合。其中$\alpha$是一个参数,在实验中设为了0.5。
$$ T_{O p 1}+T_{O p 2}-T_{(O p 1, O p 2)}>\alpha * \min \left(T_{O p 1}, T_{O p 2}\right) $$
对于多入多出模型,选择 $T_{O p 6}+T_{O p 7}+T_{O p 8}$、$T_{O p 6 \# O p 8}+T_{O p 7}$、$T_{O p 6}+T_{O p 7 \# O p 8}$ 里最接近实际运行时间的组合,然后作为融合规则。
这些检测到的融合规则以 JSON 文件记录。这些记录可以很容易地被其他算法读取或者添加更新的记录。
融合算法
使用的是 DFS 的算法搜索可以融合的算子。
原文有更具体的例子演示这个算法。
自适应数据采样
根据作者的实验,延迟随着某些参数(输出 channel)的变化并不是线性变化的,而是回出现“阶梯”。因此本文提出了自适应数据采样算法采集更多的“阶梯点”附近的数据。
方法效果
相比于用 FLOPs 和 FLOPs + memory access cost (MAC) 数据做线性回归和BRP-NAS,本文提出的方法的效果有显著提升。
nn-Meter 在 CPU 和 GPU 上表现很好。然而在VPU的表现稍差,特别是在一些推理延迟较高和推理延迟较低的模型下。原因:在推理延迟低的模型下会对内核预测错误非常敏感,而且对于一些大配置的算子 VPU 会有特殊的优化。
Microbenchmark 展示了内核级的预测和自适应采样都非常有效。
使用 Adreno 640 GPU 训练的预测器在 Adreno 630 GPU 上做推理,不是卷积主导的模型会有很好的准确率。然而在卷积主导的模型上,预测器的跨设备泛化能力较差。
讨论
- 只支持 CNN 模型而不支持卷积模型。
- 后端仍是黑盒,对于后端的变化有必要重新构建和训练预测器。
- 预测器是离线的,能否弄成在线的?
- 多个内核同时执行要怎么重新设计?
- 做功率预测?