离线模型生成

以卷积神经网络为例,在深度学习框架下构造好相应的网络模型,并且训练好原始数据,再通过离线模型生成器进行算子调度优化、权重数据重排和压缩、内存优化等,最终生成调优好的离线模型。离线模型生成器主要用来生成可以高效执行在昇腾AI处理器上的离线模型。

离线模型生成器的工作原理如上图所示,在接收到原始模型后,对卷积神经网络模型进行模型解析、量化、编译和序列化四个步骤:

1.解析

在解析过程中,离线模型生成器支持不同框架下的原始网络模型解析,提炼出原始模型的网络结构、权重参数,再通过图的表示法,由统一的中间图(IR Graph)来重新定义网络结构。中间图由计算节点和数据节点构成,计算节点有不同功能的TBE算子组成,而数据节点专门接收不同的张量数据,为整个网络提供计算需要的各种输入数据。这个中间图是由计算图和权值构成,涵盖了所有原始模型的信息。中间图为不同深度学习框架到昇腾AI软件栈搭起了一座桥梁,使得外部框架构造的神经网络模型可以轻松转化为昇腾AI处理器支持的离线模型。

2.量化

如上图所示,解析完成后生成了中间图,如果模型还需要进行量化处理,则可以基于中间图的结构和权重,通过自动量化工具来进行量化。在算子中,可以对权重、偏置进行量化,在离线模型生成过程中,量化后的权重、偏置会保存在离线模型中,推理计算时可以使用量化后的权重和偏置对输入数据进行计算,而校准集用于在量化过程中训练量化参数,保证量化精度。如果不需要量化,则直接进行离线模型编译生成离线模型。

量化方式分为数据偏移量化和无偏移量化,需要输出量化度(Scale)和量化偏移(Offset)两个参数。在数据量化过程中,指定无偏移量化时,数据都采用无偏移量化模式,计算出量化数据的量化度;如果指定数据偏移量化,则数据采用偏移模式,则会计算输出数据的量化度和量化偏移。在权重量化过程中,由于权重对量化精度要求较高,因此始终采用无偏移量化模式。比如根据量化算法对权重文件进行INT8类型量化,即可输出INT8权重和量化度。而在偏置量化过程中,根据权重的量化度和数据的量化度,可将FP32类型偏置数据量化成INT32类型数据输出。

在对模型大小和性能有更高要求的时候可以选择执行量化操作。离线模型生成过程中量化会将高精度数据向低比特数据进行量化,让最终的离线模型更加轻量化,从而达到节约网络存储空间、降低传输时延以及提高运算执行效率的目的。在量化过程中,由于模型存储大小受参数影响很大,因此离线模型生成器重点支持卷积算子、全连接算子以及深度可分离卷积(ConvolutionDepthwise)等带有参数算子的量化。

3.编译

在完成模型量化后,需要对模型进行编译,编译分为算子编译和模型编译两个部分,算子编译提供算子的具体实现,模型编译将算子模型聚合连接生成离线模型结构。

  • 算子编译

算子编译进行算子生成,主要是生成算子特定的离线结构。算子生成分为输入张量描述、权重数据转换和输出张量描述三个流程。在输入张量描述中,计算每个算子的输入维度、内存大小等信息,并且在离线模型生成器中定义好算子输入数据的形式。在权重数据转换中,对算子使用的权重参数进行数据格式(比如FP32到FP16的转换)、形状转换(如分形重排)、数据压缩等处理。在输出张量描述中,计算算子的输出维度、内存大小等信息。

算子生成流程如上图所示,算子生成过程中需要通过TBE算子加速库的接口对输出数据的形状进行分析确定与描述,通过TBE算子加速库接口也可实现数据格式的转换。离线模型生成器收到神经网络生成的中间图并对中间图中的每一节点进行描述,逐个解析每个算子的输入和输出。离线模型生成器分析当前算子的输入数据来源,获取上一层中与当前算子直接进行衔接的算子类型,通过TBE算子加速库的接口进入算子库中寻找来源算子的输出数据描述,然后将来源算子的输出数据信息返回给离线模型生成器,作为当前算子的具体输入张量描述。因此了解了来源算子的输出信息就可以自然的获得当前算子输入数据的描述。

如果在中间图中的节点不是算子,而是数据节点,则不需要进行输入张量描述。如果算子带有权值数据,如卷积算子和全连接算子等,则需要进行权重数据的描述和处理。如果输入权重数据类型为FP32,则需要通过离线模型生成器调用类型转化(ccTransTensor)接口,将权重转换成FP16数据类型,满足AI Core的数据类型需求。完成类型转换后,离线模型生成器调用形状设置(ccTransFilter)接口对权重数据进行分形重排,让权重的输入形状可以满足AI Core的格式需求。在获得固定格式的权重后,离线模型生成器调用TBE提供的压缩优化(ccCompressWeight)接口,对权重进行压缩优化,缩小权重存储空间,使得模型更加轻量化。在对权重数据转换完后返回满足计算要求的权重数据给离线模型生成器。

权重数据转化完成后,离线模型生成器还需要对算子的输出数据信息进行描述,确定输出张量形式。对于高层次复杂算子,如卷积算子和池化算子等,离线模型生成器可以直接通过TBE算子加速库提供的计算接口,并结合算子的输入张量信息和权重信息来获取算子的输出张量信息。如果是低层次简单算子,如加法算子等,则直接通过算子的输入张量信息来确定输出张量信息,最终再存入离线模型生成器中。按照上述运行流程,离线模型生成器遍历网络中间图中所有算子,循环执行算子生成步骤,对所有算子的输入输出张量和权重数据描述,完成算子的离线结构表示,为下一步模型生成提供算子模型。

  • 模型编译

编译过程中完成算子生成后,离线模型生成器还要进行模型生成,获取模型的离线结构。离线模型生成器获取中间图,对算子进行并发的调度分析,将多个中间图节点进行执行流拆分,获得多个由算子和数据输入组成的执行流,执行流可以看作是算子的执行序列。对于没有相互依赖的节点,直接分配到不同的执行流中。如果不同执行流中节点存在依赖关系,则通过rtEvent同步接口进行多执行流间同步。在AI Core运算资源富余的情况下,多执行流拆分可以为AI Core提供多流调度,从而提升网络模型的计算性能。但是如果AI Core并行处理任务较多时,会加剧资源抢占程度,恶化执行性能,一般默认情况下采用单执行流对网络进行处理,可防止因多任务并发执行导致阻塞的风险。

同时,基于多个算子的执行序列的具体执行关系,离线模型生成器可以进行独立于硬件的算子融合优化以及内存复用优化操作。根据算子输入、输出内存信息,进行计算内存复用,将相关复用信息写入模型和算子描述中,生成高效的离线模型。这些优化操作可以将多个算子执行时的计算资源进行重新分配,最大化减小运行时内存占用,同时避免运行过程中频繁进行内存分配和释放,实现以最小的内存使用和最低的数据搬移频率来完成多个算子的执行,提升性能,而且降低对硬件资源的需求。

4.序列化

编译后产生的离线模型存放于内存中,还需要进行序列化。序列化过程中主要提供签名及加密功能给模型文件,对离线模型进行进一步封装和完整性保护。序列化完成后可以将离线模型从内存输出到外部文件中以供异地的昇腾AI芯片调用和执行。

更多信息请关注昇腾开发者社区

作者:Torrenza

【昇腾学院】昇腾AI处理器软件栈--框架管理器(Framework)离线模型生成相关推荐

  1. 昇腾AI处理器软件栈--运行管理器(Runtime)

    神经网络构造中,算子组成了不同应用功能的网络结构.而张量加速引擎(Tensor Boost Engine)作为算子的兵工厂,为基于昇腾AI处理器运行的神经网络提供算子开发能力,用TBE语言编写的TBE ...

  2. 昇腾AI处理器软件栈--流程编排器(Matrix)

    功能简介 昇腾AI处理器对网络执行层次进行划分,将特定功能的执行操作看做基本执行单位--计算引擎(Engine).每个计算引擎在流程编排过程中对数据完成基本操作功能,如对图片进行分类处理.输入图片预处 ...

  3. 昇腾AI处理器软件栈--任务调度器(TS)

    任务调度器与运行管理器工程组成软硬件之间的大坝系统.在执行时,任务调度器对硬件进行任务的驱动,为昇腾AI处理器提供具体的目标任务,与运行管理器一起完成任务调度流程,并将输出数据回送给运行管理器,充当了 ...

  4. 【华为云技术分享】昇腾AI处理器软件栈--总览

    昇腾AI软件栈提供了计算资源.性能调优的运行框架以及功能多样的配套工具,是一套完整的解决方案,可以使昇腾AI处理器发挥出极佳的性能. 昇腾AI软件栈可以分为神经网络相关软件模块.工具链以及其它软件模块 ...

  5. 昇腾AI处理器软件栈--神经网络软件架构

    为完成一个神经网络应用的实现和执行,昇腾AI软件栈在深度学习框架到昇腾AI处理器之间架起了一座桥梁,为神经网络从原始模型,到中间计算图表征,再到独立执行的离线模型提供了快速转化的捷径.昇腾AI软件栈围 ...

  6. 昇腾AI处理器软件栈--张量加速引擎(TBE)

    神经网络构造中,算子组成了不同应用功能的网络结构.而张量加速引擎(Tensor Boost Engine)作为算子的兵工厂,为基于昇腾AI处理器运行的神经网络提供算子开发能力,用TBE语言编写的TBE ...

  7. 昇腾AI处理器软件栈--数字视觉预处理(DVPP)

    数字视觉预处理模块作为昇腾AI软件栈中的编解码和图像转换模块,为神经网络发挥着预处理辅助功能.当来自系统内存和网络的视频或图像数据进入昇腾AI处理器的计算资源中运算之前,由于Davinci架构对输入数 ...

  8. AutoCAD 出现“安全系统(软件锁许可管理器)不起作用或未正确安装”的解决方法...

    感谢高飞鸟提供解决方案. 当AutoCAD或自动桌子公司的其它产品在启动过程中突然停电或其它原因造成操作系统重启时,可能会造成这些产品的许可出错而无法再运行. 一般出错后第一次进入时,会提示你&quo ...

  9. AutoCAD 出现“安全系统(软件锁许可管理器)不起作用或未正确安装”的解决方法

    AutoCAD 出现"安全系统(软件锁许可管理器)不起作用或未正确安装"的解决方法 参考文章: (1)AutoCAD 出现"安全系统(软件锁许可管理器)不起作用或未正确安 ...

最新文章

  1. colorAccent,colorPrimary,colorPrimaryDark 作用的地方
  2. WCF学习之旅—WCF服务的WAS寄宿(十二)
  3. 烧钱大战数以亿计 无人驾驶无法突破局限?
  4. Apache与Tomcat 区别联系​
  5. mysql 取出20条数据_“取出数据表中第10条到第20条记录”的sql语句+select top 使用方法...
  6. linux cer证书转为jks,常见SSL证书格式介绍以及SSL证书格式转化方法
  7. 如何打开Cookies网页
  8. WPF使用Webbrowser操作网页的主要代码
  9. 线性代数【14】线性变换 linear transformation
  10. 大数据技术在各行业中的挑战有哪些
  11. POJ 3268 Silver Cow Party 单向最短路
  12. hdu 2546 饭卡 01背包
  13. CPU指令系统寻址方式
  14. namenode节点无法启动解决方法
  15. minist数据集训练与测试
  16. 自定义数据类型的指针的含义
  17. string entitlement = Application.dataPath+ “/Editor/Entitle Unity工程到处iOS工程,用脚本把Push Notifications打开
  18. TIBCO Rendezvous
  19. java模拟器怎么调中文_电脑java模拟器(javagame模拟器)
  20. python3学习笔记---类

热门文章

  1. 基于固定坐标与基于参考坐标系得到的机械手的微分运动不同
  2. linux ssh非交互脚本,Linux expect非交互式执行脚本
  3. ddos攻击发送端 接收端_什么是DDOS攻击?
  4. matplotlib 显示批量图片_matplotlib入门
  5. 钉钉运营商服务器在哪,钉钉应用服务商
  6. 同级中断可以嵌套吗_这可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套...
  7. c++利用初始化列表在类内部和类外部定义构造函数的区别
  8. 洛谷P4720 【模板】扩展卢卡斯
  9. 关于MySQL buffer pool的预读机制
  10. sql 基础增删改查语句