深度学习编译器

深度学习

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,进行不同硬件的平台相关优化与硬件指令生成,吐出目标文件

深度学习编译器_第1张图片

深度学习编译器:

将各个训练框架训练出来的模型看作各种编程语言,然后将这些模型传入深度学习编译器之后吐出IR,由于深度学习的IR其实就是计算图,所以可以直接叫作Graph IR。针对这些Graph IR可以做一些计算图优化再吐出IR分发给各种硬件使用。

深度学习编译器_第2张图片


 TVM:基于编译优化的深度学习推理框架

深度学习编译器_第3张图片

 

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上执行。

  1. 导入TVM和pytorch并加载resnet18模型,relay在解析pytorch模型时是解析torchscript格式的模型
  2. 载入测试图片,执行后处理过程,用transforms.Compose把多个步骤(如resize/normalize归一化/centercrop中间裁剪)整合到一起,新增batch维度
  3. relay导入torchscript模型并编译到llvm后端:将pytorch的graph导入到relay成为relay graph,然后将Gpath使用给定的配置编译到llvm目标硬件上
  4. 在目标硬件上进行推理,增加计时函数用来记录推理的耗时情况:graph_runtime.GraphModule, set_input, run, get_output
  5. 在1000类的字典里查询top1概率对应的类别并输出,对比pytorch跑原始模型看看两者的结果是否一致和推理耗时情况。


总结整理自:【从零开始学深度学习编译器】一,深度学习编译器及TVM 介绍 (qq.com) 感谢作者分享,受益匪浅!

你可能感兴趣的:(机器学习与深度学习,深度学习,人工智能)