乐趣区

关于深度学习:MegEngine-动态执行引擎Imperative-Runtime-概述

当咱们议论 MegEngine 时,咱们在议论什么

家喻户晓,开源深度学习框架旷视天元(MegEngine)是旷视自主研发的国产工业级深度学习框架,是旷视新一代 AI 生产力平台 Brain++ 的最外围组件,在 2020 年 3 月正式向寰球开发者开源。MegEngine 凭借其训练推理一体、超低硬件门槛和全平台高效推理 3 大外围劣势,帮忙企业与开发者大幅节俭产品从实验室原型到工业部署的流程,真正实现小时级的转化能力。

MegEngine 自上向下蕴含三个档次:ImperativeMegBrain 和 MegDNN。它们的角色定位别离是:

  • ImperativeMegEngine 为动静训练设计的一套新接口,负责解决动态图运行时(Imperative Runtime)。
  • MegBrain:负责解决动态图运行时(Graph Runtime)。
  • MegDNNMegEngine 的底层计算引擎。

上面再从下到上介绍一下这三个模块在 MegEngine 中的作用。

MegEngine 的底层计算引擎 —— MegDNN

MegDNN 在 MegEngine 中表演的角色是 底层计算引擎MegDNN 是一个跨平台的底层算子库,训练和推理过程中的所有计算操作最终都须要落到一个 MegDNN 的算子上进行,一个 MegDNN 算子可能会依据场景(如张量尺寸等)有一个或多个不同的实现(也叫 kernel)。

作为一个跨平台的计算库,MegDNN 为咱们提供丰盛的与 Tensor 相干的计算原语,比方 ConvolutionPoolingMatrixMulTranspose 等。目前 MegDNN 反对的平台有:x86armCUDARoCMOpenCLHexagon 等。

感兴趣的同学能够在这里看到 MegDNN 在各个平台下的 kernel 具体实现。

动态图运行时管家 —— MegBrain

为了确保训练推理一致性,Imperative 中复用了 MegBrain 的计算代码,因而咱们须要理解 MegBrain 做了什么。

MegBrain 负责解决动态图的运行时,次要提供 C++ 的训练和推理接口。

从上面的 MegEngine 整体架构图能够看出,Imperative 通过 Tensor Interpreter(张量解释器)复用了许多 MegBrain 的代码。比方 shape 推导、计算、求导、Trace 等。

在 MegBrain 中,一个 Computing Graph 由 SymbolVar 以及许多 op(算子,operator)组成。SymbolVar 是在 MegBrain 层面 Tensor 的示意,能够了解为传递给 op 进行计算的数据。作个类比,op 是相似加减乘除这样的计算操作(在深度学习中罕用的有 convolutionpooling 等),SymbolVar 就是咱们用来进行加减乘除的“数”(在深度学习中就是 Tensor)。

MegEngine 动态图接口 —— Imperative 退场

因为 MegEngine 是动静合一的深度学习框架,MegBrain 解决了动态图的训练和推理问题,还须要有一个“组件”负责解决动态图的训练和推理、以及 Python 侧的训练接口,于是便有了 Imperative,也就是说,Imperative Runtime 是为了动静训练而独自设计的一套新接口。

实际上,在 MegBrain 的 Computing Graph 中曾经有了十分多的算子实现,因而 MegEngine 的 Imperative 借助张量解释器 Tensor Interpreter 较多地复用了 MegBrain 中的 op。这样做的起因是:

  1. 重写算子代价高,且容易写错。
  2. 若 Imperative 的实现和 MegBrain 的实现不统一的话,容易导致训练推理不统一。

除了复用 MegBrain 的局部性能,Imperative 本身蕴含的模块次要有:Module(定义深度学习网络的根底类的实现)、Optimizer(一些优化器的实现)、Functional(提供 python 层的训练接口)、Interpreter(计算入口,底层会调用 kernel 或者 MegBrain 的算子实现)、DTR(动静重计算模块)、Tracer(记录计算图的计算过程)等。

这些模块会在之后的文章中有更具体的介绍,感兴趣的同学能够查阅 MegEngine 官网文档。

总结:Imperative 与 MegDNN / MegBrain 的关系

简略来说,MegDNN 负责 MegEngine 中所有的计算操作在各个平台(CUDA 等)的最终实现,无论是 MegBrain 还是 Imperative 的 op,最终都须要通过调用 MegDNN kernel 来实现计算。

既然 MegDNN 包揽了计算的活儿,那么在训练推理过程中那些与计算无关的工作,天然就落到了 MegBrain 和 Imperative 的头上。这些工作包含:求导、内存调配、对 Tensor 的 shape 进行推导、图优化、编译等。

MegEngine 整体上是有两局部 Runtime 以及底层的一些公共组件组成的。这两局部的 Runtime 别离叫做 Graph Runtime(对应 MegBrain)和 Imperative Runtime(对应 Imperative)。

Graph Runtime 负责动态图局部,次要提供 C++ 训练推理接口。理论计算时须要调用 MegDNN 的实现。

Imperative Runtime 负责动态图局部,次要为动静训练提供 Python 接口。理论计算时须要调用 MegBrain 的已有实现或者间接调用 MegDNN 的 kernel

附:

更多 MegEngine 信息获取,您能够:查看文档和 GitHub 我的项目,或退出 MegEngine 用户交换 QQ 群:1029741705。欢送参加 MegEngine 社区奉献,成为 Awesome MegEngineer,荣誉证书、定制礼品享不停。

退出移动版