人工智能技术干货请关注AIZOO、Jack Cui
机器人与自动驾驶课程请关注深蓝学院
我是来自山区、朴实、不偷电瓶的AI算法工程师阿chai,给大家分享人工智能、自动驾驶、机器人、3D感知相关的知识
哈喽小伙伴们,阿chai今天给大家介绍一个超级好用的自动算子优化工具AutoKernel,可更快实现深度学习算法在各硬件芯片上的高性能部署,下面我们进入正题。随着人工智能的普及,为了让各硬件(CPU, GPU, NPU,...)能够支持深度学习应用,各硬件芯片需要软件库去支持高性能的深度学习张量运算。目前,这些高性能计算库主要由资深HPC工程师进行开发,为了加快开发进程,缩短深度学习应用落地周期,自动化算子优化是一个趋势。
AutoKernel简介
AutoKernel是由OPEN AI LAB提出的高性能算子自动优化工具,可以自动优化调度策略、生成底层优化代码,大幅减少各硬件芯片算子开发成本,提升算子优化效率,让工程师更快实现深度学习算法在各硬件芯片上的高性能部署。
github:https://github.com/OAID/AutoKernel
AutoKernel的三个模块:
算子生成器:该模块使用了开源项目Halide;Halide是业界广泛使用的自动代码生成项目,它首次提出将计算和调度分离。该模块的输入是和硬件无关的算子计算描述,输出是相应后端的优化汇编代码/目标文件。
自动搜索模块:该模块可以通过最优化算法/搜索算法/机器学习/强化学习搜索出相应后端的最优算子的调度策略参数(该模块仍在开发中);
算子部署插件:Tengine是OPEN AILAB开源的深度学习推理框架,实现了AI算法在不同硬件的快速高效部署。该模块实现了将自动生成的优化算子代码以plugin的形式一键集成到Tengine中,实现自动优化算子的一键部署。
开发环境搭建
官方已经把docker而制作好了,是不是很贴心?这里可能会有小伙伴们问docker是什么,这个就是一个容器工具,类似我们玩的沙盒,在所有的东西都装在里面,在环境部署与迁移的时候非常方便。下面阿chai先教大家如何配置docker。
阿chai用的是Ubuntu 18.0.4,不同的系统与版本有区别,出现问题可私信我。
# 更新源sudo apt-get update# 安装依赖sudo apt-get install apt-transport-https ca-certificates curl software-properties-common# 添加阿里的密钥,具体你懂的,那个网速啊。。。curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -# 验证命令sudo apt-key fingerprint 0EBFCD88# 设置阿里的docker源sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"# 更新源sudo apt-get update# 安装最新版本的dokersudo apt-get -y install docker-ce
如果想要安装特定版本的docker,那就使用如下命令。
# 更新docker下载源后查看版本sudo apt-cache madison docker-ce# 安装指定版本sudo apt-get install -y docker-ce=
可以选择添加阿里云的docker资源,会提高速度,操作过程在阿里云中搜索即可。
AutoKernel使用教程
1.AutoKernel环境搭建
官方给我们提供了docker容器,我们直接在docker中配置环境即可。
# 下载镜像,需等待一会docker pull openailab/autokernel# 启动该docker环境docker run -it openailab/autokernel /bin/bash# 下载AutoKernel项目,慢的话使用码云git clone https://github.com/OAID/AutoKernel.git
2.自定义OP算子
运用AutoKernel开发一个Tengine可以用算子,具体可分为两个步骤:
生成:编写算法描述和调度策略,生成相应后端的优化算子代码
部署:将生成的优化算子代码通过plugin的形式集成进Tengine
阿chai以Relu算子为例,演示如何快速开发Tengine可用的自动优化算子。
项目中提供了一个自定义生成的模板,使用如下命令使用:
# 进入目标路径cd AutoKernel/autokernel_plugin# 设定权限chmod +x -R . # 启动生成脚本./scripts/register_op.sh
Terminal中会有提示输入内容,请输入如下字符串:
op_name: reluop_type: OP_RELU
得到的文件目录如下所示:
src/relu/relu.cppsrc/relu/relu.hsrc/relu/relu_gen.ccsrc/relu/build/sh
该文件用于生成算子汇编代码。使用Halide语言描述算子的计算过程和调度策略schedule。该示例中,schedule默认为空。
class halide_relu:public Halide::Generator{public: // args Input input{"input", 4}; Input param{"param"}; Output output{"output", 4}; void generate() { /* THE ALGORITHM */ Var w("w"), h("h"), c("c"), n("n"); Func halide_relu("halide_relu"); halide_relu(w, h, c, n) = input(w, h, c, n); output(w, h, c, n) = select(param >= 0, max(param, halide_relu(w, h, c, n)), halide_relu(w, h, c, n)); } void schedule() { /* THE SCHEDULE */ }};
Rule的测试方法与其他demo的测试一起在下面介绍。
3. 测试DEMO
编译器前需要生成对应的测试文件:
# 进入项目路径cd AutoKernel/autokernel_plugin# 设置权限chmod +x -R .#自动生成算子汇编文件,这里官方少了个s,要注意,阿chai昨天在这折腾了好久才发现./scripts/generate.sh
编译项目,四步走:
mkdir buildcd buildcmake ..make -j4
测试效果:
# 进入项目文件cd AutoKernel/autokernel_plugin# 运行生成测试文件./build/tests/tm_classification -n squeezenet
AutoKernel plugin initedfunction:autokernel_plugin_init executed...Repeat 1 times, avg time per run is 55.932 msmax time is 55.932 ms, min time is 55.932 ms--------------------------------------0.2732 - "n02123045 tabby, tabby cat"0.2676 - "n02123159 tiger cat"0.1810 - "n02119789 kit fox, Vulpes macrotis"0.0818 - "n02124075 Egyptian cat"0.0724 - "n02085620 Chihuahua"--------------------------------------ALL TEST DONE
算法很重要,但是只是项目中的一部分。没有服务器没法训练,没有承载设备无法部署,大量工程师的开发连算法的库都没有,我们要人情现实,不要盲人摸象。