最近从事AI编译器的工作,手头开发维护的编译器是公司自研的,不是开源的那种。种种原因,感觉学习起来非常头疼。现在主流的AI编译器,像TVM,在网上有大量技术博客,所以希望通过学习TVM,让自己能在这个领域尽快成长起来。
在网上看了很多TVM的技术博客,也只了解了个皮毛,连TVM都能干些啥都不知道。于是开始耐心的阅读官方文档。英文文档看起来还是很费劲的,于是干脆将看过的文档翻译保留,以便以后查阅。这里都是看过翻译的文档TVM官方文档翻译入口
然后就是动手扒代码。首先得搞个TVM环境,能跑下模型不是。环境搭建:
然后按照官方文档Introduction — tvm 0.9.dev0 documentation介绍的模型优化流程
图1.模型优化流程
分析每一步的代码实现。
首先是按照Quick Start Tutorial for Compiling Deep Learning Models — tvm 0.9.dev0 documentation
编写脚本跑模型:
这里我选择了TVM自带的mnist onnx模型。 脚本先是使用relay.frontend.from_onnx导入onnx模型。onnx模型的导入源码分析:
onnx模型导入就是图1中的步骤2,将onnx模型转换为Relay IR。这里面需要将onnx算子转换为tvm relay ir:
转换流程从代码架构上可以分两部分,一部分是python前端,一部分在C++里面。实际的转换,即relay ir的生成其实是在C++代码。C++部分relay ir实现:
【TVM源码学习笔记】2.2. C++侧的relay ir op
TVM在ctypes的基础上提供了一种机制可以方便的在python端调用C++代码,了解下有助于快速的找到python接口对应的C++代码,方便代码阅读:
【TVM源码学习笔记】附录1 TVM python调用C++的机制
一旦开始进入TVM的C++代码,就绕不开C++里面的Object类,它是TVM描述模型的基石,有必要深入的理解整个Object类及其继承体系。详细分析参见【TVM源码学习笔记】附录2 TVM的Object家族