深度学习
1. 训练框架:
Google的TensorFlow:项目部署落地
FaceBook的Pytorch:易用性
另外亚马逊的MxNet
百度的Paddle
旷视的MegEngine
华为的Mindspore
一流科技的OneFlow:分布式训练最快
2. 模型部署的设备:Intel CPU/Nvidia GPU/Intel GPU/Arm CPU/Arm GPU/FPGA/NPU(华为海思)/BPU(地平线)/MLU(寒武纪)
编译器:
每种硬件对应一门特定的编程语言,再通过特定的编译器产生机器码。随着硬件和语言的增多,编译器的维度愈发困难。为了解决这个问题,为编译器抽象出编译器前端,中端,后端,并引入IR(Intermediate Representation 中间代码表示)的概率。
-
编译器前端:接收C/C++/Java等不同语言,进行代码生成,吐出IR
-
编译器中端:接收IR,进行不同编译器后端可以共享的优化,如常量替换,死代码消除,循环优化等,吐出优化后的IR
-
编译器后端:接收优化后的IR,进行不同硬件的平台相关优化与硬件指令生成,吐出目标文件
深度学习编译器:
将各个训练框架训练出来的模型看作各种编程语言,然后将这些模型传入深度学习编译器之后吐出IR,由于深度学习的IR其实就是计算图,所以可以直接叫作Graph IR。针对这些Graph IR可以做一些计算图优化再吐出IR分发给各种硬件使用。
TVM:基于编译优化的深度学习推理框架
TVM核心为NNVM编译器,现已升级为Relay。
NNVM编译器支持直接接收深度学习框架的模型,如TensorFlow/Pytorch/Caffe/MxNet等,同时也支持一些模型的中间格式如ONNX、CoreML。这些模型被NNVM直接编译成Graph IR,然后这些Graph IR被再次优化,吐出优化后的Graph IR,最后对于不同的后端这些Graph IR都会被编译为特定后端可以识别的机器码完成模型推理。
将自己语言的源代码编译成LLVM中间代码(LLVM IR),然后由LLVM自己的后端对这个中间代码进行优化,并且编译到相应的平台的二进制程序。
样例:将pytorch resnet18模型通过relay构建TVM中的计算图,并进行图优化,再通过LLVM编译到Intel CPU上执行。
- 导入TVM和pytorch并加载resnet18模型,relay在解析pytorch模型时是解析torchscript格式的模型
- 载入测试图片,执行后处理过程,用transforms.Compose把多个步骤(如resize/normalize归一化/centercrop中间裁剪)整合到一起,新增batch维度
- relay导入torchscript模型并编译到llvm后端:将pytorch的graph导入到relay成为relay graph,然后将Gpath使用给定的配置编译到llvm目标硬件上
- 在目标硬件上进行推理,增加计时函数用来记录推理的耗时情况:graph_runtime.GraphModule, set_input, run, get_output
- 在1000类的字典里查询top1概率对应的类别并输出,对比pytorch跑原始模型看看两者的结果是否一致和推理耗时情况。
总结整理自:【从零开始学深度学习编译器】一,深度学习编译器及TVM 介绍 (qq.com) 感谢作者分享,受益匪浅!