如何快速分析DNN模型结构与算力细节

如何快速分析DNN模型结构与算力细节

  • 发布时间:2020-10-03 11:02
  • 访问量:

【概要描述】本文介绍了一种DNN模型结构和算力细节的评估方法及开源代码。该开源方法可分别针对现有pytorch和Tensoflow(keras)开源框架自动分析和估计DNN模型的网络结构和每层的算力消耗。

如何快速分析DNN模型结构与算力细节

【概要描述】本文介绍了一种DNN模型结构和算力细节的评估方法及开源代码。该开源方法可分别针对现有pytorch和Tensoflow(keras)开源框架自动分析和估计DNN模型的网络结构和每层的算力消耗。

  • 分类:研究院
  • 作者:壁仞科技研究院
  • 来源:
  • 发布时间:2020-10-03 11:02
  • 访问量:
详情

简介

本文介绍了一种DNN模型结构和算力细节的评估方法及开源代码。该方法面向AI应用与AI硬件设计,可自动分析深度神经网络(DNN)模型的结构,并评估每层的算力消耗。我们已经以该方法为基础搭建了开源项目,并在常见的DNN模型上进行了测试,分析结果可直接用于AI设计的参考。用户也可以用它分析自己定制的DNN模型。欢迎大家一起参与。

https://github.com/BirenResearch/NNparser

 

近年来,深度学习得到了广泛的应用。如何针对应用及相应的性能要求选取/设计合适的深度模型是算法开发人员需要考虑的一个重要问题。另一方面,在性能功耗面积(PPA)约束下,硬件设计者要根据需求设计一款均衡的硬件加速器,分析理解要适配的深度模型是首先要做的功课。

 深度模型结构和规模各异,所应用的学习框架也各不相同。对一个模型不是很熟悉的人想要快速理解模型的结构细节并不是一件轻松的事情。现有工具,类似Tensorboard等,提供了灵活强大的可视化模型调试与总结手段。然而它们往往需要对模型的代码做一定修改后才能获得用户想要的信息。这无疑增加了快速分析深度神经网络(DNN)模型的难度。

主流的深度学习框架会提供类似summary的功能来快速输出整个神经网络模型的结构,比如keras的summary和pytorch的print,以及第三方开发的torchsummary[1]等应用。尽管使用简单,但它们没有提供细节的不同算力信息。

在面向应用或AI加速器开发的DNN性能分析中,我们不但要关心DNN模型整体的性能,也会关注DNN每层的算子、带宽及算力等信息。此外我们一开始并不一定要深入代码细节,而是希望能够快速的对已有DNN模型做分析。

针对这类需求,我们进行了尝试。目标是在现有开源工作基础上,开发一个实现自动分析任意给定的DNN模型的工具。该工具应能够输出模型整体和每层算子的输入输出及权重的尺寸,相应的运算量需求,同时产生该模型的网络结构图。

 

1 概述

 

为了适配目前主流的学习框架,我们考虑了对基于Pytorch和Tensorflow的DNN模型的分析。其中Tensorflow版本的入口Keras2table利用了Tensorflow上层Keras API的特性,因此仅适用于以Keras API开发的Tensorflow模型。Pytorch版本的入口torch2table借鉴了其它一些开源项目的思路,利用hook机制,动态的提取DNN模型及算子的相关特性和参数。

 

2 分析的实现

 

如前所述,模型分析程序支持主流的Pytorch和Tensflow学习框架。程序整体的功能框图如下:

 

图1. 整体架构图

 

如图所述,程序根据DNN模型的框架选择不同的引擎分析DNN模型,分析结果以表格和图的形式保存。其中表格保存了DNN每层算子特征与计算参数,而图文件保存了DNN模型的拓扑结构。

现有的多数DNN模型分析工具没有区分运算类型,仅仅是统计了总的运算次数。与此不同,我们结合了DNN相关的计算类型来分析其算力需求。DNN相关的运算整体上可以分为三类:

矩阵运算:比如卷积、矩阵乘等。在现代AI加速器中往往由专门的单元完成此类操作。比如GPU的tensor core,NVDLA中的conv单元[2]。

向量运算:向量与向量或者向量与矩阵的运算,也可看做是element-wise操作。在AI加速器中有SIMD等单元完成。NVLDA也有专门的elemen-wise模块完成这类操作。

特殊函数:不能由简单乘加完成的运算,比如超越函数,排序等。简单的AI加速器类似NVDLA,往往通过查表、拟合实现,或者转由host的CPU完成。对于更复杂的GPU,由专门的特殊计算单元SFU完成。DNN中大多数的激活函数都属于此类。

 

图2. AI加速器的不同运算单元:Huawei DaVinci[3]

 

针对不同的应用及设计思路,现代AI加速器的架构各不相同。比如华为的DaVinci架构[3],NVDLA硬件结构[2]等等。

 

图3.AI加速器的不同运算单元:NVDLA[2]

 

从上面这些例子可以看出,尽管架构不同,但为了提高DNN运算效率,各类AI加速器往往会集成不同的硬件单元来分别实现上述类型计算的加速。因此,我们也将DNN所需的算力分为三部分来分析,详见下文。
支持的深度模型

我们在模型分析程序中集成了许多主流DNN模型。使用者只需要在程序输入对应的模型名字即可得到相应的输出。我们尽量利用了深度框架中自带的预定义模型,已经集成的模型包括:

·基础卷积模型:vgg, resnet, desnet等

·目标检测类模型:maskrcnn, ssd等

·RNN类模型:lstm,gru等

·推荐类模型:DIN,DLRM等

·NLP类模型:gnmt, bert等

具体已集成的模型可参见项目的readme。事实上,除了强化学习模型minigo, 我们已经验证并在项目加入了ML Perf training v0.7 中绝大多数模型的分析结果。
定制模型的分析

此外,我们利用python函数提供了一个简单的API工具方便使用者分析新的或者自己定制的模型。用户只需要提供定义模型的代码文件, 程序就可以解析模型并同样输出分析结果。

 

3. 分析结果的理解

 

我们尝试结合AI加速器的基本硬件特征来进行分析:即数据操作分为读写两类,而DNN模型的计算分为矩阵、向量和特殊三类。分析的结果自动保存在outputs文件夹中。每一个模型的结果包括同名的excel表格和pdf格式的结构图文件。


3.1 表格

每个Excel文件中包括了两个表格:分层细节details和整体总结summaries。其中,Summaries表格中统计了该模型总的权重和输出数据大小,总的运算次数。而 details表格是对DNN模型中神经网络(NN)算子性能的逐层分析,每个layer/ NN算子对应表格中的一行。每行信息分为三个部分:
基本特征:

·layer名称

每层对应一个NN layer的名称。除名称的单元,Pytorch版本的表格中这一部分还包含了多列空白单元,用来表达网络模型的层级结构以及该layer在DNN模型中的层级。以resnet为例,该模型的部分网络的层级结构如下:

├─Sequential: 1-5

└─BasicBlock: 2-1

└─Conv2d: 3-1

└─BatchNorm2d: 3-2

└─ReLU: 3-3

该模型一个第一级的sequential模块包括1个或多个二级的bottleneck, 而一个bottlneck又包括了三级的conv2d、batchNorm、Relu等layer。

该层级结构在NN Parser的对应输出如下图的表格中左边三列:

图4.输出表格的理解

 

·输入/输出tensor尺寸

本层NN layer的输入/输出数据的张量尺寸。每个tensor有3个值顺序对应(Channel x Height x Width)。为与模型的原始顺序一致,Tensorflow中顺序 三个值对应(Height x Width x Channel)。表格中仅列出了头一个输入输出tensor的尺寸,更多tensor的信息在杂项(misc)中列出。

对于卷积类算子,这一部分还包括了卷积核相关特征:Kernel 尺寸,Stride步长, Padding尺寸。

 

数据尺寸:

这一部分按照参与运算数据的性质分为三类:

Input: 该layer所有输入tensor的尺寸总和。

Weight:该layer所有参数的尺寸总和。

Output: 该层所有输出tensor的尺寸总和。

上述参数的值还取决于数据格式,由命令行参数’-e’调整。

 

算力:

如前文所述,每层NN layer所需的运算量分三种来计算:

GEMM: 矩阵运算次数ElemWise: 向量类运算次数Activation: 激活函数运算次数。为简单起见,NN parser把所有activation函数的运算均按特殊运算进行统计,包括Relu

目前我们已经完成了神经网络模型前向(inference)过程的算力估算,计划下一步实现用于训练的反向过程算力的计算。


3.2 模型结构图

 模型拓扑结构图对于研究者快速理解模型的整体架构与连接关系也有很大帮助。我们将分析产生的结构图保存在与模型同名的pdf文件中。该图以算子及数据为节点,以模型前向运算的数据流为边连接各节点,展现了模型的拓扑结构。Pytorch版本与tensorflow版本结构图的产生均借鉴了框架原生的代码,因此两个版本的结构图有所不同。

下图是pytorch版本产生的resnet18头几层的结构图。如图所示,蓝色框为输入权重参数,比如,(64,3,7,7)是输入3 channels, 输出64 channels,7x7的卷积算子。灰色框是模型中执行的算子,与NN算子对应。

图5. Resnet(部分)结构图

 

TensorFlow(Keras)版本的结构图来自框架自带plot功能,其输出与pytorch版本有所不同,但基本内容类似,此处不再赘述。

 

4 总结及未来计划

 

我们对快速有效分析DNN软硬件性能进行了尝试,并结合开源代码用python完成了一个DNN模型分析的验证程序,可以在我们的github项目中下载、尝试(https://github.com/BirenResearch/NNparser)。它能够快速分析主流的DNN模型的结构及算力细节特征,可用于深度模型推理应用的快速评估,或者用于AI加速器设计的初始需求分析。希望能够对算法、ML编译器软件人员和AI硬件开发者有所帮助。

我们还计划进一步丰富和拓展该项目功能。

首先,增加对深度模型后向过程的算力、带宽的运算功能,从而帮助使用者分析深度模型训练中的算力消耗。

其次,及时跟踪深度学习发展,增加对新型NN模型和算子的解析。其中,一个正在开展的工作是对图神经网络(GNN)的分析。

我们也欢迎有兴趣的伙伴加入到我们的项目中来。
 

参考资料

[1] Tyler Yep, torch-summary,https://github.com/TylerYep/torch-summary

[2] NVDLA Hardware Architectural Specificationl,http://nvdla.org/hw/contents.html

[3] H.Liao, et.al., DaVinci:A Scalable Architecture for Neural Network Computing, Hot Chips 2019

 

题图来自网络,版权归原作者所有

 

 

 

 

近期文章

流体力学与物理导引神经网络

流体力学与物理导引神经网络

现代科学中众多复杂的关键应用依赖着对流体运动的精确预测。然而,由于流体力学方程数值求解的复杂性,基于传统数值方法的高分辨率长周期数值模拟运算量大且难以保证数值稳定性。本文将深入介绍PINN方法在流体计算中的应用并分析其与传统数值方法的差别。
2021-10-25
物理导引神经网络方法分析

物理导引神经网络方法分析

随着GPU能力的提升,支撑深度学习的软硬件生态得到了快速发展。通过深度学习来解决科学计算问题成了一种趋势,其中用深度学习来求解偏微分方程的方法也逐渐兴起。尤其引人注意的是一种称为物理导引神经网络的方法,其为科学计算领域注入了新的活力。
2021-10-18

联系我们

这是描述信息

招贤纳士

公众号二维码
这是描述信息

 版权所有   ©   上海壁仞科技有限公司   |    沪ICP备19047354号