MXNet 图优化与算子融合Graph Optimization and Quantization based on subgraph and MKL-DNN

Purpose

MKL-DNN引入了两个高级特性:融合计算和降精度核。这些特性可以显著地提高各种深度学习拓扑在CPU上的推理性能。

然而,MXNet由于图表示的局限性和以往缺乏图的优化,仍然不能从中受益。幸运的是,MXNet的新子图特性使这些改进现在成为可能。

本文说明基于子图的解决方案,以利用MKL-DNN在MXNet中的功能。一般来说,解决方案将MKL-DNN算子划分为子图,然后在子图中用融合的内核(如果可能)替代这些MKL-DNN算子。可以通过使用MKL-DNN的降精度核(如INT8核)来选择量化流,加速模型的推理过程。

Milestone

本文三个步骤可被视为本项目的里程碑,并用于跟踪过程。

•完成后,将子图分支转换为主分支

•完成,MKL-DNN融合实现到子图分支

•完成后,将量化流实现提交到主分支

Workflow

步骤1. 将MKL-DNN算子划分到子图中

这是子图的主要用途之一。可以列出所有支持的运算符MKL-DNN,并将其传递给DefaultSubgraphProperty。应用图划分后,所有MKL-DNN算子都将分组到子图节点中,子图边界上的数据格式将自动在MKL-DNN内部格式和NDArray默认格式之间转换。根据执行模式,子图边界有点不同。

1.         Symbolic mode

子图将尽量覆盖相邻的MKL-DNN算子。

2.         Imperative mode

命令式

每个MKL-DNN操作符将在一个独立的子图中执行,以确保MKL-DNN内部格式不会暴露在子图之外。

Step 2. MKL-DNN operator fusion

MKL-DNN算子融合

MKL-DNN库支持在一次执行中,运行多个特定的模式算子。比如卷积+relu。可以定义新的SubgraphSelector子图选择器,捕获这种操作符模式,并生成新的MKL-DNN特定算子来替换原来的算子。

新的融合算子是独立算子,表示定义的MKL-DNN库算子。例如,在MKL-DNN库中,卷积可以支持在卷积之后执行relu的post算子。因此,对于卷积+relu融合,将创建一个MKL-DNN卷积(命名为_sg_MKL-DNN_conv),并将relu描述为后算子。

NNVM_REGISTER_OP(_sg_MKL-DNN_conv)
.set_attr<FStatefulComputeEx>("FStatefulComputeEx<cpu>",  SgMKL-DNNConvOpForward)

In general, new fused operators follow the abstraction of MKL-DNN library, and subgraph fusion pass is the lowering process to convert NNVM common graph to MKL-DNN graph. Fusion pass only happens inside the subgraph created by step1, so won’t affect MXNet default operators.

一般来说,新的融合算子遵循MKL-DNN库的抽象,子图融合pass是NNVM common图到MKL-DNN图的降阶过程。融合pass只发生在由step1创建的子图中,不会影响MXNet默认算子。

Step 3. Quantization

MKL-DNN支持卷积神经网络中大多数精度较低的基元,尤其是融合基元。MXNet INT8推理包括两个步骤:

1.  INT8模型,量化参数,收集校准数据准备

只执行此步骤一次。为了在FP32模型的基础上建立INT8模型,在MKL-DNN支持的情况下,在子图内部运行QuantizeGraph pass,用INT8算子代替FP32算子,并在适当的位置插入dequantize解量化算子。

2.       Run INT8 inference

当INT8符号和参数准备好进行inference时,用户可以对与以前相同的新输入数据进行推理。

Accuracy Validation

在使用MKL-DNN时,无论量化程度如何,子图解本身都不会引入精度损失,反而会增强框架的稳定性。

NETWORK

FP32

FP32 with Fusion

Top1

Top5

Top1

Top5

Resnet-152 by MKL-DNN

77.16

92.98

77.16

92.98

Inception by MKL-DNN

72.36

90.58

72.36

90.58

在量化允许的情况下,MKL-DNN与采用熵模式校准的FP32相比,可以在不到0.5%的精度损失范围内获得巨大的性能改进。

Accuracy data from the internal branch are shown in below table .

FP32

INT8

No Calibration

Calibration using 5 batches

Calibration Method

NETWORK

Top1

Top5

Top1

Top5

Top1

Top5

Resnet-152 by GPU

77.19

93.01

75.56

92.32

75.58

92.24

Threshold by min/max

75.65

92.35

Threshold by entropy loss

Resnet-152 by MKL-DNN

77.16

92.98

76.59

92.71

76.44

92.69

Threshold by min/max

76.76

92.79

Threshold by entropy loss

Inception-bn by GPU

72.38

90.61

71.98

90.26

71.78

90.26

Threshold by min/max

71.98

90.36

Threshold by entropy loss

Inception-bn by MKL-DNN

72.36

90.58

72.21

90.50

72.16

90.43

Threshold by min/max

72.19

90.45

Threshold by entropy loss

Performance

On performance part, both fusion and quantization can provide the huge improvement on various kinds of topologies.

Below is the inference performance data(images/sec) from the internal branch based on SKX-8180 1 socket with batch size 64.

在性能方面,融合和量化都可以为各种拓扑结构提供巨大的改进。

以下是基于批处理大小为64的SKX-8180 套接字的内部分支的推理性能数据(图像/秒)。

Topology

Base

With Fusion

With Fusion + Quantization

resnet50-v1

208.17

348.80

568.25

resnet50-v2

198.87

256.10

vgg-16

92.11

101.00

150.92

inception-bn

475.74

658.75

836.94

inception-v3

175.97

227.29

327.39

inception-v4

88.99

109.15

inception-resnet-v2

104.13

124.75

mobilenet 1.0

668.71

1380.64

1788.95

squezenet

708.63

849.27

975.90

测试用例量化解决方案仍在开发中。准备好后会分享更多的数据。

测试需要包括两个部分。第一个是图形转换测试。需要确保:

Step

Criterion 

1

所有MKL-DNN算子按执行方式划分为一个或多个子图。

2

可以捕获所需的模式并创建所需的融合算子。

3

量化过程可以将期望的算子转换为具有正确数据连接的量化版本。

另一个是MKL-DNN特定融合算子的单元测试。测试应涵盖所有融合场景,以确保融合算子能够提供准确的结果。

Q & A

•用户将如何调用该功能-要使用的工作流、命令和API是什么?

此功能将在其成熟后启用。

•计划进行哪些API增强(或更改)?有关于向后兼容性的问题吗?

此更改应用了方案提供的API,没有向后兼容性问题。

•调度的单元和集成测试是什么?完整模型的E2E测试是好的,需要一些小测试,可以通过PR检查和常规回归来执行。

将进行完整的测试,包括单元测试和模型级测试。增加单元测试,检查生成的图形和融合运算器输出的正确性。

模型级测试将检查新变化的训练和推理精度。

•添加非CV测试用例。

测试了RNN,GAN,RL网络。例如,通过sockeye模型(GNMT、transformers)验证性能和功能。

•是否正确地假设用户选择完全独立于底层后端的算子?

不完全是。在这个阶段,后端流不会随子图而改变。

通过在runtime生成变量(USE \u MKLDNN,USE \u CUDNN)和ctx(gpu,cpu)来指定用户的后端。

•这是否意味着如果要卷积,例如,mxnet将自动在cpu、GPU和mkldnn之间进行选择?如果是的话,这到底是怎么做到的?

不,按照当前的MXNet后端使用情况,用户不能在不同的后端之间切换单个算子。

•认为重要的是,必须明确区分算子及其不同的实现。最后,用户应该能够定义一个网络图,有责任找到执行它的最佳方式。

同意。最后,应该达到这个状态,但这不是这一步的目标。

MXNet 图优化与算子融合的更多相关文章

  1. TVM图优化与算子融合

    TVM图优化与算子融合 计算图的定义 Computational graphs: a common way to represent programs in deep learning framewo ...

  2. SystemML大规模机器学习,优化算子融合方案的研究

    SystemML大规模机器学习,优化算子融合方案的研究 摘要 许多大规模机器学习(ML)系统允许通过线性代数程序指定定制的ML算法,然后自动生成有效的执行计划.在这种情况下,优化的机会融合基本算子的熔 ...

  3. TVM图优化(以Op Fusion为例)

    首先给出一个TVM 相关的介绍,这个是Tianqi Chen演讲在OSDI18上用的PPThttps://files.cnblogs.com/files/jourluohua/Tianqi-Chen- ...

  4. g2o:一种图优化的C++框架

    转载自 Taylor Guo g2o: A general framework for graph optimization 原文发表于IEEE InternationalConference on ...

  5. 深入理解图优化与g2o:g2o篇

    内容提要 讲完了优化的基本知识,我们来看一下g2o的结构.本篇将讨论g2o的代码结构,并带着大家一起写一个简单的双视图bundle adjustment:从两张图像中估计相机运动和特征点位置.你可以把 ...

  6. 深入理解图优化与g2o:图优化篇

    前言 本节我们将深入介绍视觉slam中的主流优化方法——图优化(graph-based optimization).下一节中,介绍一下非常流行的图优化库:g2o. 关于g2o,我13年写过一个文档,然 ...

  7. CF 291E. Tree-String Problem [dfs kmp trie图优化]

    CF291E 题意:一棵树,每条边上有一些字符,求目标串出现了多少次 直接求目标串的fail然后一边dfs一边跑kmp 然后就被特殊数据卡到\(O(n^2)\)了... 因为这样kmp复杂度分析的基础 ...

  8. 『The Captain 最短路建图优化』

    The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...

  9. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

随机推荐

  1. ubuntu 14.04.5 编译Android 4.4.4 r1源码(最新)

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/54426189 吐槽:ubuntu系统真是让人又爱又恨,也有可能是VMware Wo ...

  2. Netcat瑞士军刀的简单使用

    目录 Netcat 常用参数: 常见的用法: 端口扫描: 聊天 文件传输 反弹shell 蜜罐 Netcat Netcat 常称为 nc,拥有"瑞士军刀"的美誉.nc 小巧强悍,可 ...

  3. Docker用Commit给容器做快照

    关于 commit 镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础. 镜像是多层存储,每一层是在前一层的基础上进行修改:而容器同样也是多层存储,是在以镜像为 ...

  4. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  5. Android adb不是内部或外部命令 问题解决

    就是没有配置环境变量, 这个只需要将android安装:例如C:\Program File\android-sdk-windows\tools加入到系统变量Path中,需要注意的是Path中会配置的有 ...

  6. 一起来看看java并发中volatile关键字的神奇之处

    并发编程中的三个概念: 1.原子性 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. 2.可见性 对于可见性,Java提供了volati ...

  7. IDEA安装插件时搜索不到,一直在转圈刷新,无法安装

    方法一:更换一个网络(我自己没有测试过) 参考链接:https://blog.csdn.net/m0_37856386/article/details/110389028 方法二:打开settings ...

  8. Linux(CentOS-8)安装MySQL8.0.11

    CentOS安装MySQL8.0.11 总的思路就是:安装MySQL,编写配置文件,配置环境变量,成功开启服务,登陆并修改ROOT密码 开启远程访问的思路就是:授权用户所有IP都可以访问,系统的数据库 ...

  9. WM_PAINT 与 WM_ERASEBKGND消息的深入分析

    当WM_PAINT消息不是由函数InvalidateRect产生的时(即通过最大话,最小化,移动,下拉菜单等),系统会先产生连续产生若干个WM_ERASEBKGND消息,紧接着在产生WM_PAINT消 ...

  10. 分布式RPC框架Dubbo实现服务治理:集成Kryo实现高速序列化,集成Hystrix实现熔断器

    Dubbo+Kryo实现高速序列化 Dubbo RPC是Dubbo体系中最核心的一种高性能,高吞吐量的远程调用方式,是一种多路复用的TCP长连接调用: 长连接: 避免每次调用新建TCP连接,提高调用的 ...