一、现有的框架有哪些
(1)Google的TensorFlow
(2)FaceBook的Pytorch
(3)亚马逊的MxNet
(4)百度的Paddle
(5)旷视的MegEngine
(6)华为的Mindspore
(7)一流科技的OneFlow
二、怎么解决编译器对多种语言的适配问题
(1)解决方法:把编译器抽象的分为编译器前端,编译器中端,编译器后端,并引入
•编译器前端:接收C/C++/Java等不同语言,进行代码生成,吐出IR
•编译器中端:接收IR,进行不同编译器后端可以共享的优化,如常量替换,死代码消除,循环优化等,吐出优化后的IR
•编译器后端:接收优化后的IR,进行不同硬件的平台相关优化与硬件指令生成,吐出目标文件
(2)编译器抽象图(借用蓝色(知乎ID)大佬的图:)
(3)深度学习编译器抽象图

二、TVM
2.1 什么是TVM
TVM是一个基于编译优化的深度学习框架
2.2 TVM的框架图

从图中可以看到,TVM架构的核心是NNVM编译器(最新的TVM已经将NNVM编译器升级为realy编译器了)。NNVM编译器直接支持深度学习框架模型,如tensorflow/pytorch/caffe/mxnet等,同时也支持一些模型的中间格式如NNMX,coreML。这些模型被编译成graph IR,然后这些graph IR会在被优化后输出graph IR,最后通过编译这些IR生成后端可识别的模型推理机器码。
2.3 导入TVM和Pytorch并加载ResNet18模型

需要注意的是relay在解析pytorch模型的时候是解析torchscript格式的模型,所以使用torch.jit.trace跑原始的pytorch模型并且导出torchscript模型
2.4 载入测试图片
加载一张图片,并执行一些后处理过程
2.5 Relay导入TorchScript模型并编译到LLVM后端
接下来我们将PyTorch的graph导入到Relay成为Relay Graph,这里输入层的名字可以任意指定。然后将Gpath使用给定的配置编译到LLVM目标硬件上。
2.6 在目标硬件上进行推理并输出分类结果
这里加了一个计时函数用来记录推理的耗时情况。
接下来我们在1000类的字典里面查询一下Top1概率对应的类别并输出,同时也用Pytorch跑一下原始模型看看两者的结果是否一致和推理耗时情况。