看了下最新的TVM,已经到了0.8版本,整个TVM软件stack也发生了比较大的变化,准备追一下进行介绍。整体节奏大概是先做一篇Introduction,之后会翻译一些tutorial,后边会结合一些真实的Op进行。
整个TVM的结构现在已经变成了
从前到后可以分为这么几个部分(参考了其他博客的一些内容):
1. 输入是从TensorFlow、PyTorch、ONNX等框架导入的模型。
2. 转换为Relay:Relay是TVM自有的高级模型语言,它既支持传统的数据流表示风格,在使用了let-binding方式以后,也支持了类似于函数式编程作用域的风格;同时,在Relay层TVM会对模型进行高层的图级优化
3. 下降到TE(Tensor Expression)Relay经过高层优化后,会进行算子融合并将模型被划分为子图,最终转换成TE来表示这些子图;TE是一种专门用于描述张量计算的领域专用语言,它指定了一些调度原语来指定低级的循环优化,如平铺,向量化、并行化、循环展开等;为了帮助将Relay转换为TE的过程,TVM提供了TOPI(一种预定义的模板来提供公共tensor op)
4. 自动调优模块,包括AutoTVM和AutoScheduler 。TE之后会被传到自动调优模块进行算子调优;自动调优模块会针对给定的TE,使用算法生成不同调度配置,并基于给定代价模型和特定硬件后端进行评估;自动调优模块分为以下两种:
a) AutoTVM:基于模板的自动调优模块,针对用户指定的模板及相应搜索空间进行搜索和调优;
b) AutoScheduler:无需模板的自动调优模块,会针对给定计算自动生成所需模板及搜索空间;
5. 选择最优的配置。自动调优模块生成JSON格式的记录
6. 下降到Tensor Intermediate Representation (TIR),这一层是TVM的低级中间表示,一般提供包括LLVM IR在内的多种结构,多编译器和多个特定的硬件表示
7. 使用目标编译器进行编译:优化后的TIR会被转换并下发到目标硬件对应的编译器,如LLVM、NVCC等,进行编译并生成最终可执行的机器码;