文章转载于: Tengine开发者社区
作者:小O妹
算子自动优化的发展趋势
随着AI技术的快速发展,深度学习在各个领域得到了广泛应用。深度学习模型能否成功在终端落地应用,满足产品需求,一个关键的指标就是神经网络模型的推理性能。于是,一大波算法工程师为了算法的部署转岗算子优化工程师。然而,优化代码并不是一件简单的事,它要求工程师既要精通计算机体系架构,又要熟悉算法的计算流程,于是,稍微有经验的深度学习推理优化工程师都成了各家公司争抢的“香饽饽”。人才少,需求多,算子优化自动化是未来的大趋势。
AutoKernel是什么?
最近,一个致力于降低优化门槛,提升优化开发效率的算子自动优化工具AutoKernel开源了。
AutoKernel是一个高性能算子自动优化工具,可以自动优化调度策略、生成底层优化代码,大幅减少各硬件芯片算子开发成本,提升算子优化效率,让工程师更快实现深度学习算法在各硬件芯片上的高性能部署。
AutoKernel的定位
为了方便大家进一步理解AutoKernel,我们需要先了解一下深度学习推理计算平台的层级。
深度学习的推理计算平台可以分为以下几个层级:
1、最上层对接各个深度学习训练框架训练出来的算法模型(Tensorflow, Caffe, Pytorch, Mxnet等);
2、 Hign-level IR是计算图(Computation Graph)层级。神经网络可以理解为计算图(graph),一个计算图由多个算子(opterator)节点组成,这些节点可以是卷积算子(Convolution), 池化算子(Pooling), 全连接算子(Fc)等。这个层级可以进行一些图层级的优化,算子融合,子图切分的操作等;
3、接下来就是算子(Operator/Kernel)层级。这个层级需要支持每个硬件后端的每个算子实现。目前的高性能算子计算库主要是由资深HPC工程师(高性能计算优化工程师)进行手工开发。AutoKernel就是算子层级的一个自动优化工具,自动生成适应不同后端的算子优化代码;
4、最后是各硬件后端:GPU, ARM CPU, X86 CPU, NPU等。
AutoKernel目前属于算子层级的自动优化工具。
AutoKernel如何实现部署优化?
部署优化之前,我们先了解一下AutoKernel的三大特性:
· 低门槛: 无需底层优化汇编的知识门槛
· 简单易用: 提供docker环境,无需安装环境,plugin一键集成到推理框架
· 高效率: 无需手写优化汇编,一键生成优化代码,一键部署
作为算子层级的一个自动优化工具,AutoKernel支持将自动优化的算子代码集成进部署推理框架,主要流程分为两步:
1. 生成:编写算法描述和调度策略,生成相应后端的优化算子代码;
2. 部署:将生成的优化算子代码通过插件plugin的形式集成进推理框架Tengine。
AutoKernel的算子生成模块(Op Generator)使用了业界广泛使用的自动代码生成项目Halide。Halide是一个DSL(domain specific language) 编程语言,它将算法和硬件后端分离。本模块输入Halide语言的算法描述和优化调度策略,指定硬件后端,就可以自动生成优化代码。为了减少开发者配置环境的遇到问题,AutoKernel提供了docker镜像,docker里面已经安装好Halide, 并且配置好Halide的Python的API,方便开发者使用。
AutoKernel的部署模块Autokernel Plugin是一个相对独立的插件,只依赖于Tengine的算子头文件,不依赖于Tengine库。它实现了将AutoKernel Generator生成优化的算子代码,以Plugin的形式集成进Tengine推理框架中,实现自动优化算子的一键部署。整个过程不需要重新编译Tengine库,只需要独立编译Plugin的动态库,在运行时加载Autokernel Plugin的库,就能调用自动生成的算子实现。下面的图展示了使用AutoKernel前后的变化,只需要在运行时添加一行代码,加载autokernel plugin的动态库:
AutoKernel还有一个模块叫AutoSearch,该模块通过强化学习/机器学习/遗传算法搜索出相应后端的最优算子的调度策略参数。该模块目前仍在开发中。
AutoKernel使用教程
下图是展示了在Intel(R) Core(TM) i9-9900K CPU @ 3.60GHz的电脑上的优化效果,无需手工撸代码,无需编写繁杂冗长的底层汇编代码,只需十几行简洁的调度代码, 就能性能优化200+倍~
推荐阅读
更多Tengine相关内容请关注Tengine-边缘AI推理框架专栏。