前言:
做一个推理应用,首先从模型转换开始(当然先得选好一个合适的模型)。在昇腾平台做模型推理,需要将Caffe,TensorFlow等开源框架网络模型转换成Davinci架构专用模型(OM格式)。昇腾张量编译器(Ascend Tensor Compiler,简称ATC)是异构计算架构CANN体系下的模型转换工具,模型转换过程中,ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作,对原始的深度学习模型进行进一步的调优,从而满足部署场景下的高性能需求,使其能够高效执行在昇腾AI处理器上。
一、基础知识
来源:https://www.hiascend.com
视频:https://www.bilibili.com/video/BV1ZL411X77S
1、ATC工具简介
ATC工具功能架构如下图所示:
ATC工具功能架构
从上图中,可以看出ATC工具可以转换“开源框架网络模型”和“单算子描述文件”。
1、开源框架网络模型场景:
1)开源框架网络模型经过Parser解析后,转换为中间态IR Graph。
2)中间态IR经过图准备,图拆分,图优化,图编译等一系列操作后,转成适配昇腾AI处理器的离线模型。
3)转换后的离线模型上传到板端环境,通过AscendCL接口加载模型文件实现推理过程。
2、单算子描述文件场景下:Ascend IR定义的单算子描述文件(json格式)通过ATC工具进行单算子编译后,转成适配昇腾AI处理器的单算子离线模型,然后上传到板端环境,通过AscendCL接口加载单算子模型文件用于验证单算子功能。
ATC工具还可以将开源框架网络模型转换后的离线模型、开源框架网络模型通转成json文件,方便查看。
使用ATC工具进行模型转换的运行流程下图所示:
1、使用ATC工具之前,需要现在开发环境安装CANN软件包,获取相关路径下的ATC工具。训练营提供的镜像已经安装好了CANN,并且已经配置好环境变量,可以直接使用ATC工具。ATC工具的安装路径为:
/home/HwHiAiUser/Ascend/ascend-toolkit/6.0.RC1.alpha001/x86_64-linux/bin
2、准备要进行转换的模型或单算子描述文件,并上传到开发环境。也可以通过wget命令将模型直接下载到ECS服务器上。
3、使用ATC工具进行模型转换,在配置相关参数时,根据实际情况选择是否进行AIPP配置。
二、ATC工具参数介绍及实际操作
下图列出了所有芯片共用的ATC参数(参数只在某些芯片下使用的未列出),其中黄色色块表示参数互斥,不能同时使用;关联参数表示需要相互配合或者某些场景下需要配合使用。
常用的参数:
1、--model:原始网络模型文件路径与文件名
当原始模型为Caffe框架时,需要和--weight参数配合使用。
2、--framework 原始网络模型框架类型
3、--input_format 输入数据格式
4、--input_shape 指定模型输入数据的shape
5、--output
1)如果是开源框架的网络模型:
存放转换后的离线模型的路径以及文件名,例如:$HOME/module/out/caffe_resnet50,转换后的模型文件名以指定的为准,自动以.om后缀结尾,例如:caffe_resnet50.om。
2)如果是单算子描述文件(json格式):
存放转换后的单算子模型的路径,例如:$HOME/singleop/out/op_model。转换后的模型文件命名规则为:序号_opType_输入的描述(dataType_format_shape)_输出的描述(dataType_format_shape)。
6、--insert_op_conf 插入算子的配置文件路径与文件名,例如aipp预处理算子。
若使用该参数后,则输入数据类型为UINT8。
7、--soc_version:指定模型转换时昇腾AI处理器的版本
昇腾310 AI处理器参数值:Ascend310
昇腾310P AI处理器参数值:Ascend310P*
昇腾910 AI处理器参数值:Ascend910*
其中:*可能根据芯片性能提升等级、芯片核数使用等级等因素会有不同的取值。
可以通过“npu-smi info”指令查看芯片类型,如下图所示
8、--singleop 单算子模型转换
单算子描述文件是基于Ascend IR定义的单个算子的定义文件,包括算子的输入、输出及属性信息;将单个算子描述文件(json格式)转换成适配昇腾AI处理器的离线模型,以便进行后续的单算子功能验证。
按照https://www.hiascend.com/document/detail/zh/canncommercial/601/inferapplicationdev/atctool/atctool_0036.html 编一个gemm.json
9、--mode=1 离线模型或原始模型文件转json,方便查看模型中的参数信息。
10、--mode=6 针对已有的离线模型,显示模型信息,包括模型占用的关键资源信息、编译与运行环境等信息。
11、--log 设置ATC模型转换过程中日志的级别
取值范围:1)debug:输出debug/info/warning/error/event级别的运行信息。
2)info:输出info/warning/error/event级别的运行信息。
3)warning:输出warning/error/event级别的运行信息。
4)error:输出/error/event级别的运行信息。
5)null:不输出日志。默认为null,不输出日志信息。
ATC支持下述三种方式。
1)日志落盘存储——加入--log参数,并且不设置为null时
执行后会在$HOME/ascend/log目录下留下日志信息
2)日志打屏——提前设置环境变量
除了加--log参数外,还需要提前设置环境变量:export ASCEND_SLOG_PRINT_TO_STDOUT=1
为了减少日志打屏的数量,将log设置成error,仅打印error和event信息,方便展示。
3)日志重定向到文件——设置环境,并将--log参数加上“>”,重定向到指定文件