最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

全球视点!MegEngine 动态执行引擎-Imperative Runtime 概述

来源:博客园

当我们谈论 MegEngine 时,我们在谈论什么

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

MegEngine自上向下包含三个层次:ImperativeMegBrainMegDNN。它们的角色定位分别是:


(资料图)

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

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

MegEngine 的底层计算引擎 —— MegDNN

MegDNNMegEngine中扮演的角色是底层计算引擎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 GraphSymbolVar以及许多op(算子,operator)组成。SymbolVar是在MegBrain层面Tensor的表示,可以理解为传递给op进行计算的数据。作个类比,op是类似加减乘除这样的计算操作(在深度学习中常用的有convolutionpooling等),SymbolVar就是我们用来进行加减乘除的“数”(在深度学习中就是Tensor)。

MegEngine 动态图接口——Imperative 登场

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

实际上,在MegBrainComputing Graph中已经有了非常多的算子实现,因此MegEngineImperative借助张量解释器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还是Imperativeop,最终都需要通过调用MegDNN kernel来完成计算。

既然MegDNN包揽了计算的活儿,那么在训练推理过程中那些与计算无关的工作,自然就落到了MegBrainImperative的头上。这些工作包括:求导、内存分配、对Tensorshape进行推导、图优化、编译等。

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

Graph Runtime负责静态图部分,主要提供C++训练推理接口。实际计算时需要调用MegDNN的实现。

Imperative Runtime负责动态图部分,主要为动态训练提供Python接口。实际计算时需要调用MegBrain的已有实现或者直接调用MegDNNkernel

附:

更多 MegEngine 信息获取,您可以:查看文档和GitHub 项目,或加入 MegEngine 用户交流 QQ 群:1029741705。欢迎参与 MegEngine 社区贡献,成为Awesome MegEngineer,荣誉证书、定制礼品享不停。

关键词: