深度学习引擎

深度学习引擎

[TOC]

本文目的

高效的Inference框架

主流框架的问题

Training

TensorFlow,PyTorch

Inference

已有框架

TensorFlow等这样的框架孱弱,Intel的OpenVINO,ARM的ARM NN,NV的TensorRT

为什么复杂,以及问题

历史类似问题

曾经出现了很多种编程语言,有很多种硬件,历史上最开始也是一种语言对应一种硬件,从而造成编译器的维护困难与爆炸

解决方案:

抽象出编译器前端,编译器中端,编译器后端等概念,引入IR (Intermediate Representation)

类似这样的架构:

img

深度学习解决方案

img

更详尽,更漂亮的一张图:

img

TVM

特点

竞争对手

TVM的IR

偏算子端的IR

Program -> Stmt Program | Null 

Stmt -> RealizeStmt |
        ProduceStmt | 
        ForStmt | 
        AttrStmt  | 
        IfThenElseStmt | 
        ProvideStmt | 
        LetStmt
        Expr 

Realize -> realize TensorVar(RangeVar) {Program}
ProduceStmt -> produce TensorVar {Program}
ForStmt -> for (IterVar, Expr, Expr) {Program} 
AttrStmt -> TensorVar Attribute {Program} 
IfThenElseStmt -> if (Expr) then {Program} | 
                  if (Expr) then {Program} else {Program} 
ProvideStmt -> TensorVar(Params)=Expr 
LetStmt -> let ScalarVar=Expr {Program} 

Expr -> Const | 
        TensorVar | 
        ScalarVar | 
        IterVar | 
        RangeVar |
        Binary | 
        Unary | 
        Call  

偏计算图端的部分

是Relay(NNVM的后继),

Relay部分提供了DAG和A-Normal两种类型表达计算图的方式,

其中A-Normal是lambda表达式计算续体传递风格(CPS)的一种管理性源码规约,分别供偏好于深度学习和计算语言的人员使用,两者是基本等价的。

可以看到,TVM对于图部分的IR和算子部分的IR,有明显的分层

XLA的IR

HLO IR相比TVM IR最大的区别是:

eg代码优化

eg做深度学习推理引擎很适合做编译器、体系结构、HPC的人

Q:

NVPTX

nvcc

halide语言的

阿里最近开源的推理框架MNN

CuDNNTensorRT

PlaidML

Gemfield

深度学习编译和传统编译的技术路线差别

  传统编译器 深度学习编译器
优化需求 传统编译器注重于优化寄存器使用和指令集匹配,其优化往往偏向于局部 深度学习编译器的优化往往需要涉及到全局的改写,包括之前提到的内存,算子融合等。目前深度学习框架的图优化或者高层优化(HLO)部分和传统编译的pass比较匹配,这些优化也会逐渐被标准的pass所替代。但是在高层还会有开放的问题,即高层的抽象如何可以做到容易分析又有足够的表达能力。TVM的Relay,XLA和Glow是三个在这个方向上的例子
自动代码生成 传统编译器的目标是生成比较优化的通用代码 深度学习编译器的目标是生成接近手写或者更加高效的特定代码(卷积,矩阵乘法等)
解决的问题    

方法

ref:

Powered by Jekyll and Theme by solid

本站总访问量