0. 前言
- 在B站黄雍涛博士发了几个深度学习编译器的视频,感觉说得挺好,所以记录一下。
深度学习编译器(一)综述
-
视频链接:
-
深度学习编译器的作用:加速推理。
-
深度学习编译器总架构
- 一般分为前端与后端。
- 前端:把各种各样的模型转换为编译器认识的形式(如TVM的Relay,一般都是DAG的形式),再进行各类图优化、算子融合等(都属于经典的《编译原理》的一部分)。
- 后端:内核库(说白了就是加速矩阵乘法)以及代码生成(如LLVM/CUDA)
- 前端和高层IR
- IR,Intermediate representation,就是中间表达
- 从图论、数学的角度来考虑深度学习加速问题。
- 图的表示方法
- DAG:有向无环图
- Let-binidng:直接指向重要节点的输出。更多信息可参考这里
- 图计算的优化举例:Conv+BN+Relu
src/relay/transforms/fuse_ops.cc
- 具体算法是“支配树算法”
- 后端和低层IR
- 从计算机低层的角度来考虑加速问题,如硬件设备、指令集、内核库。
- 各大厂有各自实现的内核库,如 intel 的 mkl+dnnl/openvino,nvidia的 cuda+cudnn/tensorrt
- 代码生成器:LLVM
- 看结构与TVM非常类似(第一代前端就是叫NNVM,致敬LLVM)
- 如果在CPU上进行模型优化,肯定会用到llvm
- 低层运算IR
- 有两种形式:Halide和Polyhedral
- TVM使用的就是Halide,有自动调节(Autotuner)功能,即有split/vectorize/parallelize等加速方法。
- Polyhedral(多面体模型),感觉就是更好地利用缓存?
深度学习编译器(二)Auto TVM
-
视频链接
-
参考资料:
-
TVM 总体结构(图来自官网)
- 1:训练框架结果以及ONNX
- 2:TVM 高层表达 Relay IR
- 3:TE 张量表达
- 4:优化张量计算的具体执行流程
- 5:TE Schedule 调度
- 6:硬件底层可识别的 TIR
- 7:硬件(如图中的x86)
- TVM 与 NCNN/MNN 等的区别
- NCNN/MNN等:手写汇编
- TVM:AutoTVM
- AutoTVM
- 在用户定义的 Search Space 中具体执行 TE 的优化,tuning整个过程,通过 Cost Model 找到消耗最少的模型,生成json文件。
- 两个疑问
- Search Space 介绍(自动调度优化了什么)
- 举了一个矩阵乘法的例子
- 左边是普通方式计算,上面是代码,下面是计算流程
- 中间是使用了 loop tiling 进行优化,本事就是分治。
- 右边可以看到,在分块后,每块利用高效算子(充分利用缓存等资源)计算
- AutoTVM 流程
- 构建 Runner 和 Builder,运行tune以及构建Task
- 创建搜索任务,模版中可选参数和搜索任务绑定。
- 使用tune进行本地测试,记录测试结果。
- 调用测试结果,将最优结果填入模版,生成调度,实际计算。
深度学习编译器(三) Auto Schedule
- 使用过程与AutoTVM没啥区别,具体参考官方样例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)