推理离线模型数据采集

简介

提供了传统小模型场景下tensor数据dump功能,获得精度数据,用于模型精度定位。适用于ONNX、OM模型,用户只需要通过参数指定原始模型对应的离线模型。

使用前准备

环境准备

安装msProbe工具,详情请参见《msProbe安装指南》。

采集OM模型数据依赖aisbench包和aclruntime包,用户使用前可通过以下命令安装这两个依赖包。

 msprobe install_deps -m offline --no_check

说明:--no_check参数,会跳过检查目标网站的证书信息,有一定的安全风险,用户需要谨慎使用并自行承担后果。

约束

仅支持ONNX、OM模型数据采集。

OM模型dump依赖CANN功能,用户可通过环境变量ASCEND_TOOLKIT_HOME修改CANN路径,默认路径为/usr/local/Ascend/cann。

安全风险提示

在模型文件传给工具加载前,用户需要确保传入文件是安全可信的,若模型文件来源官方有提供SHA256等校验值,用户必须要进行校验,以确保模型文件没有被篡改。

数据采集

功能说明

离线模型精度数据采集。

注意事项

仅支持ONNX、OM模型数据采集。

命令格式

 msprobe offline_dump --model_path <model_path> [options]

--model_path为必选参数,[options]代表可选参数,具体参数介绍请参见以下参数说明

参数说明

参数名 可选/必选 描述
--model_path 必选 .onnx或.om格式的模型文件路径,需使用绝对路径,且须指定到文件名,分别对应ONNX、OM模型。
--input_data 可选 模型的输入数据路径,需使用绝对路径,且须指定到文件名,默认根据模型的input随机生成,多个输入以逗号分隔,例如:/home/input_0.bin,/home/input_1.bin,/home/input_2.npy。注意:使用aipp模型时该输入为OM模型的输入,且支持自动将npy文件转为bin文件。
-o或--output_path 可选 输出文件路径,需使用绝对路径,默认为当前路径的output文件夹。
--input_shape 可选 模型输入为静态shape时使用。模型输入的shape信息,默认为空,例如"input_name1:1,224,224,3;input_name2:3,300",节点中间使用英文分号隔开。input_name必须是转换前的网络模型中的节点名称。
--rank 可选 指定运行设备[0,255],可选参数,默认0。
--dym_shape_range 可选 模型输入为动态shape时使用。动态shape的阈值范围。如果设置该参数,那么将根据参数中所有的shape列表进行依次推理和精度比对。如果模型转换时指定了某个维度值为-1,比对时需要指定特定范围,该维度在比对时不能设置为-1
配置格式为:"input_name1:1,3,200~224,224-230;input_name2:1,300"。
其中,input_name必须是转换前的网络模型中的节点名称;"~"表示范围,a~b~c含义为[a: b :c];"-"表示某一位的取值。
--output_size 可选 指定模型的输出size,有几个输出,就设几个值,每个值默认为90000000,如果模型输出超出大小,请指定此参数以修正。动态shape场景下,获取模型的输出size可能为0,用户需根据输入的shape预估一个较合适的值去申请内存。多个输出size用英文逗号隔开, 例如"10000,10000,10000"。
--onnx_fusion_switch 可选 onnxruntime算子融合开关,默认开启算子融合,如存在onnx dump数据中因算子融合导致缺失的,建议关闭此开关。仅当model_path传入ONNX格式模型时生效。使用方式:--onnx_fusion_switch False。

使用示例

 msprobe offline_dump --model_path /model_path/model.onnx -o /dump_output_path

 msprobe offline_dump --model_path /model_path/model.om -o /dump_output_path

输出说明

dump完成后会打印提示信息msprobe ends successfully. 输出结果会放置在配置的输出路径中,没有配置输出路径默认会放在当前路径的output文件夹。

输出结果文件说明

{output_path}/{timestamp}/{input_name-input_shape}  # {input_name-input_shape}用来区分动态shape时不同的模型实际输入,静态shape时没有该层
├-- dump_data
│   ├-- npu                          # npu dump数据目录
│   │   ├-- {timestamp}              # 模型所有npu dump的算子输出
│   │   │   └-- 0                    # Rank设备ID号
│   │   │       └-- {om_model_name}  # 模型名称
│   │   │           └-- 1            # 模型ID号
│   │   │               ├-- 0        # 针对每个Task ID执行的次数维护一个序号,从0开始计数,该Task每dump一次数据,序号递增1
│   │   │               │   ├-- Add.8.5.1682067845380164
│   │   │               │   ├-- ...
│   │   │               │   └-- Transpose.4.1682148295048447
│   │   │               └-- 1
│   │   │                   ├-- Add.11.4.1682148323212422
│   │   │                   ├-- ...
│   │   │                   └-- Transpose.4.1682148327390978
│   │   ├-- {timestamp}
│   │   │   ├-- output_0.bin
│   │   │   └-- output_0.npy
│   │   └-- {timestamp}_summary.json
│   └-- {onnx} # 原模型dump数据存放路径,onnx分别对应ONNX模型
│       ├-- Add_100.0.1682148256368588.npy
│       ├-- ...
│       └-- Where_22.0.1682148253575249.npy
├-- input
│   └-- input_0.bin                          # 随机输入数据,若指定了输入数据,则该文件不存在
└-- model
    ├-- {om_model_name}.json                    # 离线模型OM模型(.om)通过atc工具转换后的json文件
    └-- new_{onnx_model_name}.onnx              # 把每个算子作为输出节点后新生成的ONNX模型