出处:open ai lab
code:https://github.com/OAID/AutoKernel
1. 简介
随着人工智能的普及,深度学习网络的不断涌现,为了让各硬件(CPU, GPU, NPU,…)能够支持深度学习应用,各硬件芯片需要软件库去支持高性能的深度学习张量运算。目前,这些高性能计算库主要由资深HPC工程师(高性能计算优化工程师)进行开发,为了加快开发进程,缩短深度学习应用落地周期,自动化算子优化是一个趋势。
AutoKernel是由OPEN AI LAB提出的高性能算子自动优化工具,可以自动优化调度策略、生成底层优化代码,大幅减少各硬件芯片算子开发成本,提升算子优化效率,让工程师更快实现深度学习算法在各硬件芯片上的高性能部署。
2. autokernel初衷
是借助halide来实现各种AI op,然后实现了的op注册到Tengine中,利用Tengine来推理。首先需要明确Tengine中其实已经实现了各种OP,比如:conv,dwconv,pool…,各种平台,比如:x86,aarch32,aarch64,vulkan。如果再拓展一下,像ncnn,mnn还支持opencl,opengl,cuda等。
这就造成,需要写很多的代码,同时各种 op 还有不同的优化策略,这样就更加头大了。
这里就要说一下halide的作用了,Halide是业界广泛使用的自动代码生成项目,它首次提出将计算和调度分离。该模块的输入是和硬件无关的算子计算描述,输出是相应后端的优化汇编代码/目标文件。
总结就是,他将实现和优化分离,只要功能齐全时,用halide实现就行,需要追求速度的时候,就需要想办法优化了。这样有什么好处呢?因为深度学习推理都是一些固定op,这些op的实现是一样的,但是如果你用不同的硬件,需要针对不同的硬件做一些优化,比如x86和arm。这有点像设置模式中的抽象,将op的实现抽象出来,并和优化分离
3. autokernel真的万能吗?
这里说的万能,是自动优化出来的推理速度。
其实是没有的。
这里我们采用autokernel项目,测试自写的maxpool,avepool(官方有实现conv也可以试一下),具体代码:AutoKernel,这里我们用halide简单实现,未做优化
3.1 halide结果
[INFO]: using halide maxpooling....
Repeat [1] time 10422.00 us per RUN. used 10422 us
print output data
8 8 8 5 7 7 8 7 8 8 8 7 8 4 8 7 8 7 6 9 9 5 8 8 7 8 9 7 7 8 3 6 3 8 9 3 7 8 9 9 9 8 7 8 8 9 9 9 9 7
running avepool...
REPEAT COUNT= 1
Repeat [1] time 4412.00 us per RUN. used 4412 us
print output data
3.25 6.75 7.75 3.25 6 3.25 5 4.25 3.5 5 4 4.25 4.25 3 5.5 4.5 7.25 3 5.25 3.75 4 3 4.25 7.25 3.5 5.75
3.2 tengine结果
REPEAT COUNT= 1
Repeat [1] time 2970.00 us per RUN. used 2970 us
print output data
8 8 8 5 7 7 8 7 8 8 8 7 8 4 8 7 8 7 6 9 9 5 8 8 7 8 9 7 7 8 3 6 3 8 9 3 7 8 9 9 9 8 7 8 8 9 9 9 9 7
running avepool...
REPEAT COUNT= 1
Repeat [1] time 857.00 us per RUN. used 857 us
print output data
3.25 6.75 7.75 3.25 6 3.25 5 4.25 3.5 5 4 4.25 4.25 3 5.5 4.5 7.25 3 5.25 3.75 4 3 4.25 7.25 3.5 5.75
这里可以看到tengine的耗时是普通halide实现的 1/(4~5),那这样说来halide不是没用,还没有原版tengine快。当然是否定的,可以优化加速(还没实现)
4. autokernel环境配置
官方给了一个docker镜像,但是我就要自己搭。
整体流程为:
- 编译halide
- 编译tengine
- 编译autokernel
4.1 编译halide
地址:https://github.com/halide/Halide
- 安装依赖llvm
git clone --depth 1 --branch llvmorg-10.0.0 https://github.com/llvm/llvm-project.git
% mkdir llvm-build
% cd llvm-build
% cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../llvm-install \
-DLLVM_ENABLE_PROJECTS="clang;lld;clang-tools-extra" \
-DLLVM_TARGETS_TO_BUILD="X86;ARM;NVPTX;AArch64;Mips;Hexagon" \
-DLLVM_ENABLE_TERMINFO=OFF -DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_RTTI=ON -DLLVM_BUILD_32_BITS=OFF \
../llvm-project/llvm
% cmake --build . --target install -- -j4
- 编译halide
% mkdir Halide-build
% cd Halide-build
% cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_DIR=/path/to/llvm-install/lib/cmake/llvm /path/to/Halide
% cmake --build .
4.2 编译tengine
我前面弄好了,直接参考官方吧:https://github.com/OAID/Tengine
4.3 编译autokernel
- halide算子生成
cd AutoKernel/autokernel_plugin
chmod +x -R .
./scripts/generate.sh #自动生成算子汇编文件
- 编译autokernel
mkdir build
cd build
cmake ..
make -j4