跳转至

MindCmd使用指南

前言

概述

本文介绍如何使用MindCmd工具,以及如何通过工具进行一键推理、数据预处理、开源框架推理、模型压缩、模型转换、仿真推理、上板推理、精度比对、性能分析等功能。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

Hi3519D

V500

Hi3516D

V500

Hi3516C

V608

Hi3516C

V610

须知:

MindCmd仅作为开发调试工具,不建议在实际产品中集成。 本文未有特殊说明,Hi3516DV500与Hi3519DV500、Hi3516CV608与Hi3516CV610内容完全一致。

读者对象

本文档(本指南)主要适用于以下工程师:

  • 算法工程师
  • 技术支持工程师
  • 软件开发工程师

修改记录

文档版本

发布日期

修改说明

00B01

2026-06-30

第1次临时版本发布。

简介

MindCmd命令行工具主要关注一键化、自动化、聚焦部署侧的全流程开发效率的大幅提升。

针对网络模型的开发,MindCmd集成了离线模型转换工具、模型量化工具、模型精度比对工具、模型性能分析工具,提升了网络模型移植、分析和优化的效率。

功能框架图

如图1所示,工具目前包含数据预处理、开源框架推理、模型压缩、模型转换、功能仿真、指令仿真、性能仿真、上板推理、性能分析、精度比对以及Oneclick一键推理。

图 1 MindCmd功能框架

工具功能

MindCmd中主要几个功能特性如下:

  • 一键推理:提供一键推理功能,一键式端到端执行数据预处理、开源框架推理、模型压缩、模型转换、功能仿真、指令仿真、性能仿真、上板推理、Dump、精度比对、性能分析等功能。参见“一键推理”。
  • 数据预处理:提供数据预处理功能,在进行模型压缩、模型转换等功能之前通过数据预处理将数据处理成与模型匹配的数据。参见“数据预处理”。
  • 开源框架推理:提供开源框架推理功能。获取Ground Truth数据。参见“开源框架推理”。
  • 模型压缩:提供模型压缩功能,对模型的权重(weight)和数据(activation)进行低比特处理,让最终生成的网络模型更加轻量化,从而达到节省网络模型存储空间、降低传输时延、提高计算效率,达到性能提升与优化的目标,参见“模型压缩”。
  • 模型转换:提供模型转换功能,将训练好的模型转换为离线模型,参见“模型转换”。
  • 功能仿真:提供功能仿真推理功能,参见“应用工程”。
  • 指令仿真:提供指令仿真推理功能,参见“应用工程”。
  • 性能仿真:提供性能仿真推理功能,参见“应用工程”。
  • 上板推理:提供上板推理功能,参见“应用工程”。
  • 精度比对:提供精度比对功能,可以用来比对模型转换后SoC支持的算子运行结果与标准算子的运行结果,以便用来确认运算误差发生的原因,参见“精度比对”。
  • 性能分析:提供性能分析功能,用于采集和分析SoC推理业务各个运行阶段的关键性能指标,参见“性能分析”。
  • 工具模块:提供可单独调用的工具,包括原始Caffe模型子网导出、数据格式转换、模型Uninplace、ATC命令行转cfg文件,参见“Tools”。

安装

MindCmd软件包可以安装在Linux服务器上,可以使用Linux服务器上原生桌面自带的终端gnome-terminal进行安装,也可以在Windows服务器上通过SSH登录到Linux服务器进行安装。

图 1 Linux分部署

图 2 Linux共部署

MindCmd安装流程如图3所示。

图 3 安装流程

软件包获取

说明:

本文UbuntuXX.XX-x86_64中的XX.XX为:

  • 18.04(Hi3519DV500)
  • 22.04(Hi3516CV610)

MindCmd工具只支持在XX.XX x86_64架构服务器安装。安装前,请先获取MindCmd工具软件包。

当前MindCmd工具的模型转换、模型推理依赖CANN软件包。模型压缩依赖AMCT软件包。具体说明请参见表1。

表 1 软件包说明

软件包

必选/可选

说明

mindcmd-<version>-py3-none-linux_x86_64.tar.gz

必选

MindCmd工具主要用于端到端一键执行数据预处理、模型量化、模型转换、仿真推理、模型推理、精度比对和性能分析。各子模块支持单独调用,参见MindCmd子命令。

Ascend-cann-toolkit_{6.x}_linux.x86_64.run

必选

CANN软件包为MindCmd工具提供模型转换、模型推理支持,包含开发应用程序所需的头文件、共享库等。

hotwheels_amct_caffe_-<version>-py3-none-linux_x86_64.whl

可选

模型压缩工具(AMCT)为MindCmd工具提供网络模型量化的支持,让最终生成的网络模型更加轻量化,从而达到节省网络模型存储空间、降低传输时延、提高计算效率,达到性能提升与优化的目标。

当前MindCmd工具支持 8bit PTQ(Post-Training Quantization,训练后量化)量化。

hotwheels_amct_pytorch-<version>-py3-none-linux_x86_64.tar.gz

可选

其中_<version>_表示软件版本号。

安装前准备

UbuntuXX.XX-x86_64系统

环境要求

安装MindCmd的环境,所要求的硬件以及操作系统要满足以下条件。

表 1 Ubuntu系统配套版本信息

类别

版本限制

说明

Hi3519DV500

Hi3516CV610

硬件

  • 内存:最小4GB,推荐8GB
  • 磁盘空间:最小6GB
  • 若Linux宿主机内存为4G,在MindCmd中进行模型转换时,建议Model文件大小不超过350M,如果超过此规格,操作系统可能会因为超过安全内存阈值而工作不稳定。
  • 若Linux宿主机配置升级,比如8G内存,则相应支持的操作对象规格按比例提升。

    例如,内存由4G升级到8G,则Model文件建议大小不超过700M。

操作系统

版本:18.04 64位x86操作系统

版本:22.04 64位x86操作系统

Python

3.7.5

3.9.11/3.10.12

系统语言

en_US.UTF-8

  • 当前仅支持系统语言为英文。
  • 请以任意用户使用locale命令在任意路径下查询编码格式,若系统返回“LANG=en_US.UTF-8”,则表示正确;否则,请以root用户使用“vim/etc/default/locale”命令修改“LANG=en_US.UTF-8”,重启(使用reboot命令)使之生效。

准备安装用户(可选)

  • 如果已安装Ascend-cann-toolkit开发套件包,请使用Ascend-cann-toolkit开发套件包的安装用户安装MindCmd。
  • 如果未安装Ascend-cann-toolkit开发套件包,请参考如下示例准备安装用户。

您可以使用任意用户(含root或非root用户)进行安装。

  • 若使用root用户安装,则不需要操作该章节,不需要对root用户做任何设置。
  • 若使用已存在的非root用户安装,须保证该用户对$HOME目录具有读写以及可执行权限。
  • 若使用新的非root用户安装,请参考如下步骤进行创建,如下操作请在root用户下执行。本手册以该种场景为例执行MindCmd的安装。

    1. 执行以下命令创建用户组和MindCmd安装用户并设置该用户的$HOME目录。

      groupadd usergroup
      useradd -g usergroup -d /home/username -m username -s /bin/bash
      

      例如以MindCmdUser群组为例,可执行如下命令创建MindCmd安装用户并加入到群组中。

      groupadd MindCmdUser
      useradd -g MindCmdUser -d /home/username -m username -s /bin/bash
      

      说明:

      用户所属的属组必须和Driver运行用户所属组相同;如果不同,请用户自行添加到Driver运行用户属组。

    2. 执行以下命令设置密码。

      passwd username
      

      _username_为安装MindCmd的用户名,该用户的umask值为0027:

      • 若要查看umask的值,则执行命令:umask
      • 若要修改umask的值,则执行命令:umask 新的取值

        如果用户通过上述方式修改了umask取值,则修改后的取值只在当前窗口有效,用户也可以通过修改~/.bashrc文件方式设置永久umask取值:

        1. 在任意目录下执行如下命令,打开.bashrc文件:

          vi ~/.bashrc
          

          在文件最后一行后面添加umask 新的取值内容。

        2. 执行:wq!命令保存文件并退出。

        3. 执行source ~/.bashrc命令使其立即生效。

检查源

安装过程需要下载相关依赖,请确保服务器能够连接网络。

请在root用户下执行如下命令检查源是否可用。

apt-get update

说明:

如果命令执行报错,则检查网络是否连接或者把/etc/apt/sources.list文件中的源更换为可用的源。

安装依赖

使用MindCmd工具前,需要完成相关环境搭建。开发人员可根据不同组件的使用需求进行环境搭建,使用一键推理,需要完整搭建各组件依赖的环境。

支持在Docker中使用MindCmd,解决方案提供了Dockerfile文件,构建镜像请参考《驱动和开发环境安装指南》“通过Dockerfile构建镜像”章节,启动容器请参考Docker容器中使用MindCmd。

表 2 各组件依赖

组件

依赖

数据预处理

python依赖:opencv-python>=X.X.X.X。

模型压缩

Caffe模型压缩参见《AMCT使用指南(Caffe)》"安装AMCT"。(可选)

PyTorch模型压缩参见《AMCT使用指南(PyTorch)》"工具安装"。(可选)

模型转换

请参见《驱动和开发环境安装指南》"命令行方式开发环境安装",完成依赖环境、工具链、CANN包安装。

开源框架推理

安装python依赖:skl2onnx>=1.13.0, packaging>=18.0。

Caffe模型推理需参见《AMCT使用指南(Caffe)》"安装AMCT"。

PyTorch模型推理参见《AMCT使用指南(PyTorch)》"工具安装"。

ONNX模型推理参见《AMCT使用指南(PyTorch)》"工具安装"。

上板推理

python依赖:paramiko>=2.10.5。

请参见《驱动和开发环境安装指南》"板端环境安装" 和 "OpenSSH服务搭建"。

请参见《驱动和开发环境安装指南》"命令行方式开发环境安装",完成依赖环境、工具链、CANN包安装。

功能仿真运行

请参见《驱动和开发环境安装指南》"命令行方式开发环境安装",完成依赖环境、工具链、CANN包安装。

指令仿真运行

请参见《驱动和开发环境安装指南》"命令行方式开发环境安装",完成依赖环境、工具链、CANN包安装。

性能仿真运行

请参见《驱动和开发环境安装指南》"命令行方式开发环境安装",完成依赖环境、工具链、CANN包安装。

精度比对

Hi3519DV500请参见《精度比对工具使用指南》"安装依赖",完成依赖环境安装。

性能分析

Hi3519DV500请参见《Profiling工具使用指南》"环境准备",完成性能分析环境搭建。

Hi3516CV610请参见《驱动和开发环境安装指南》"板端环境安装" 和 "OpenSSH服务搭建"。

Hi3516CV610请参见《驱动和开发环境安装指南》"命令行方式开发环境安装",完成依赖环境、工具链、CANN包安装。

安装MindCmd

  1. 在MindCmd工具软件包所在目录下,执行如下命令安装。

    pipX.X.X install mindcmd-<version>-py3-none-linux_x86_64.tar.gz --user
    
  2. 若出现如下信息则说明工具安装成功。

    Successfully installed mindcmd-<version>
    

    用户可以在pythonX.X.X软件包所在路径下(例如:$HOME/.local/lib/pythonX.X.X/site-packages)查看已经安装的MindCmd工具,例如

    drwxr-xr-x 9 mindcmd mindcmd 4096 Oct 13 23:16 mindcmd/ 
    drwxr-xr-x 2 mindcmd mindcmd 4096 Oct 13 23:16 mindcmd-<version>.dist-info/
    

    其中,mindcmd即为MindCmd工具所在安装路径,下文中均用{MINDCMD_INSTALL_PATH}表示MindCmd安装路径。

    说明:

    卸载 用户通过如上方式成功安装MindCmd工具后,可执行如下命令卸载MindCmd工具。

    pipX.X.X uninstall mindcmd
    
    若出现如下信息则说明卸载成功。
    Successfully uninstalled mindcmd-<version>
    
    MindCmd工具升级时可以先卸载再重新安装:
    pipX.X.X uninstall mindcmd
    pipX.X.X install mindcmd-<version>-py3-none-linux_x86_64.tar.gz
    

说明:

如果安装过程中出现下载依赖连接超时的情况,请用户检查pip环境是否正常可用,如需网络代理或更换镜像源,请用户自行配置。

全局配置

MindCmd提供子命令查看和修改全局配置。

查看全局配置列表,结果如图1所示。

mindcmd config --list

图 1 全局配置列表

mindcmd config --global base_config.cann_install_path

图 2 查看某一个配置项的值

修改某一个配置项的值(以修改“base_config.cann_install_path”为例),结果如图3所示:

mindcmd config --global base_config.cann_install_path=~/Ascend/ascend-toolkit/svp_latest

图 3 修改某一个配置项的值

说明:

mindcmd config 子命令不展示atc_args_append部分的配置参数,不支持在命令行修改atc_args_append的配置参数。

MindCmd命令行工具为用户提供全局配置文件,配置文件路径为:{MINDCMD_INSTALL_PATH}/mindcmd.ini,或通过运行命令 mindcmd config --list , 控制台会打印配置文件路径,如图4中高亮部分所示。

图 4 查看全局配置文件

工具安装完毕后,需要在MindCmd全局配置文件中指定CANN软件包安装路径,如表1。

表 1 MindCmd配置

配置

描述

可选/必选

参数

参数描述

base_config

该配置为MindCmd的基础配置

必选

CANN_INSTALL_PATH

CANN软件包的安装路径,如:CANN_INSTALL_PATH=/home/user/Ascend/ascend-toolkit/<version>/

必选

TARGET_VERSION

目标解决方案的版本,如:TARGET_VERSION=Hi3516DV500

需要根据实际解决方案版本替换。

可选

DEFAULT_WORKSPACE

默认工作空间,如:DEFAULT_WORKSPACE=/home/user/mindcmd_workspace

若DEFAULT_WORKSPACE=NA,则会在用户主目录下创建MindCmd-WorkSpace文件夹作为默认工作路径。

可选

SSH_CFG_PATH

上板推理默认配置文件,若需要执行上板推理,则需要配置此参数。详细配置项参考ssh.cfg文件配置。

可选

CROSS_COMPILER

交叉编译链选项,可配置上板所用的交叉编译链。可选值包括:musl(默认)、musl_codesize

oneclick_switch

一键推理场景开关,1表示打开,0表示关闭

可选

IS_CLEAN_PREVIOUS_OUTPUT

运行前先删除工作路径下一键推理的历史输出目录,默认值为1。

可选

IS_AMCT_RUN

模型压缩开关,默认值为1。

可选

IS_GT_RUN

开源框架推理开关,默认值为1。

可选

IS_NPU_RUN

上板推理开关,默认值为0。

可选

IS_FUNC_RUN

功能仿真运行开关,默认值为1。

可选

IS_INST_RUN

指令仿真运行开关,默认值为0。

可选

IS_PERF_RUN

性能仿真运行开关,默认值为0。

可选

IS_DUMP_OPEN

推理程序Dump模型中间结果开关,默认值为1。

可选

IS_COMPARE_OPEN

Dump数据精度比对开关,默认值为1。

可选

IS_BOARD_PROFILING_OPEN

Profiling数据采集开关,默认值为1。

可选

IS_PROFILE_DISPLAY_OPEN

Profiling数据展示开关,默认值为0。

可选

IS_QUANT_ANALYSIS_OPEN

AMCT PyTorch量化误差分析开关,默认值为0。具体功能描述及生成件参见《AMCT使用指南(PyTorch)》“量化误差分析”章节。

可选

IS_PRINT_PROCESS_DETAIL

控制台打印详细执行日志开关,默认值为0。

atc_args_append

ATC扩展参数

可选

log_level

在一键推理流程执行到ATC组件时,追加ATC支持的命令参数,每个命令按行隔开,具体命令参见《ATC工具使用指南》。需要满足key=value格式,工具会转换为--key=value。例如配置:log_level=0

工具会将其转换为 --log_level=0,追加到ATC执行命令末尾。

说明:

  • mindcmd.ini中的所有配置项前不可加空格。
  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

Sample介绍

工具内置一个PyTorch 模型pooling算子快速上手的用例,位于{MINDCMD_INSTALL_PATH}/testcase。请参考安装MindCmd完成安装,再参考全局配置完成MindCmd工具配置。

参考以下命令:

mindcmd oneclick pytorch -m mindcmd.testcase.pooling.Model --input_shape 1,3,224,224 

一键推理

功能介绍

支持一键式端到端完成模型的数据预处理、AMCT(模型压缩)、GT(Ground Truth)、ATC、仿真、上板推理、Dump、精度比对和Profiling功能。目前支持的开源框架模型包括:Caffe、PyTorch和ONNX。

说明:

AMCT子模块当前仅支持训练后量化(Post-Training Quantization)场景。

Caffe模型一键推理

Caffe模型一键推理流程如图1所示。

图 1 Caffe模型一键推理流程图

命令行格式说明

Caffe模型一键推理的命令行格式如下:

mindcmd oneclick caffe -m MODEL -w WEIGHT 

Caffe模型一键推理的命令行参数说明如表1所示。

表 1 Caffe模型一键推理命令行参数说明

参数

必选/可选

描述

caffe子命令

–m, --model

必选

指定模型定义文件(*.prototxt)。

-w, --weight

可选

指定权重文件(*.caffemodel)。未指定此参数时,工具将根据模型定义文件生成随机权重文件,位于模型定义文件所在路径下。

说明:

权重随机生成时精度比对结果可能全为1.0,这个是由于Caffe将权重默认初始化成0导致,可以通过调整模型定义(.prototxt)文件里面的weight_filler来规避。

–i, --image_list

可选

指定推理数据。支持图片列表(.txt)和feature map(.txt/.bin/.npy)格式。

工具根据传入路径参数后缀和文件内容区分图片列表或者feature map,具体规则如下:

  • 当txt文件内每行文本内容为一张图片的路径时,将输入 .txt 后缀文件识别为图片列表。支持图片格式包括:

    ".bmp", ".jpeg", ".jpg", ".jpe", ".jp2", ".png"。

  • 当txt文件内任意一行不是路径时,将输入.txt后缀文件识别为txt格式的feature map。
  • txt格式的feature map,需要满足如下格式:数据间以空格分隔,txt文件内每一行的数据个数为channel × height × width。一行表示一个batch的数据量,总数据量应该与模型输入shape的N*C*H*W乘积一致。
  • .txt文件内不支持写feature map路径。
  • .bin或者.npy 后缀识别为feature map。

多输入模型按照输入顺序指定,使用英文双引号""包含,并用英文分号;作为分割,如 --image_list="/home/MindCmdUser/image_list1.txt;/home/MindCmdUser/image_list2.txt"。

当未指定此参数时,工具将生成随机数feature map作为输入数据并用于推理。

说明:
  • 当推理数据为图片场景,Calibration数据和Validation数据分离,工具使用最后一张图片作为Validation数据,其他图片用做Calibration数据。
  • 当推理数据为feature map场景,每路输入只支持传入单个feature map文件,且传入的数据同时用于模型的Calibration和Validation。
  • 输入数据经过预处理后,保存在${work_dir}/output/project_xxx/preprocess/路径下。

--aipp

可选

指定数据预处理配置文件,参见数据预处理配置文件样例。

数据预处理完整配置方式请参考《ATC工具使用指南》--insert_op_conf 章节。

--input_type

可选

指定推理数据的数据类型,只用于Feature map输入,不能用于图片输入。支持数据类型FP16, FP32, INT16, INT8, S16, S8, U16, U8, UINT16, UINT8。模型多路输入时,使用英文分号隔开,用英文双引号括住。eg.:--input_type="INT8;FP16"。

--quant_config

可选

指定AMCT的简易量化配置文件(*.cfg)或量化配置文件(*.json)。配置方式请参考《AMCT使用指南(Caffe)》。

说明:

json或者cfg中配置线性4bit量化时,MindCmd不会进行精度优化,仅推荐用于性能评估;

不支持非均匀4bit 。

-q, --quant_param_file

可选

指定AMCT量化参数文件,当传入的模型为AMCT量化后模型时,此参数要求必传,且一键推理时AMCT模块将自动跳过。

-r, --rpndata

可选

指定rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且AMCT和GT不执行。

指定多个rpn文件时使用英文双引号""包含,并用英文分号;作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量。多输入多batch模型只需指定较大的那个batch值。如双路输入的模型,其中一路支持32batch,一路不支持多batch,则输入 --batch_num=32。

-g, --gpu_id

可选

指定caffe推理使用的GPU id,默认CPU模式。

-h, --help

可选

展示caffe模型一键推理 help 信息,eg. mindcmd oneclick caffe -h。

oneclick子命令

-k, --work_dir

可选

指定工作目录,否则使用默认工作路径 $HOME/MindCmd-WorkSpace/XXX,XXX根据运行的模型动态生成。

如果开启了上板推理开关(IS_NPU_RUN=1),则工作目录不能超出ssh.cfg文件配置小节中“HOST_MOUNT_PATH”配置的路径。

-s, --ssh_config

可选

指定板端ssh挂载配置文件。ssh挂载需先进行NFS环境搭建,可参考NFS环境搭建。

ssh挂载配置文件的模板,可参考ssh.cfg文件配置。

--clean

可选

输入一个前缀${prefix},用于删除${work_dir}/output/目录下所有名为“${prefix}_xxxxx”的文件夹。删除oneclick模块的历史输出目录。

例如:输入 --clean project 将会删除${work_dir}/output/目录下所有名为“project_xxxxx”的文件夹。

-h, --help

可选

展示命令行 help 信息,eg. mindcmd oneclick -h。

说明:

  • 输入各参数的位置要求位于其所属子命令之后,例如:
    mindcmd oneclick -k {WORK_DIR} caffe -m xxx.prototxt
    
  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。
  • 多输入场景支持feature map和图片列表混输,eg. -i="${图片列表};${feature_map}"。

执行样例

  • 模型和数据准备。

    将推理所需的Caffe模型文件(.prototxt)、权重文件(.caffemodel)以及所需的数据等上传到开发环境任意路径,参考目录结构如下:

    ├── test_case
    │   ├── ssh.cfg # 可选,否则需要关闭上板推理
    │   ├── caffe_resnet50
    │   │   ├── resnet50.prototxt   # 必选
    │   │   └── resnet50.caffemodel  # 可选,否则工具自动创建随机权重
    │   ├── data # 可选,否则工具自动使用随机数推理
    │   │   ├── dog1_1024_683.jpg
    │   │   ├── dog2_1024_683.jpg
    │   │   ├── insert_op.cfg  # 数据预处理配置文件
    │   │   └── image_ref_list.txt  # 图片列表
    

    说明:

    • 推理数据的shape应该与模型所需输入数据的shape相同,如:模型resnet50的shape为(3,224,224),图片的shape也应为(3,224,224)。否则需要自定义数据预处理方式,通过--aipp参数指定数据预处理配置文件样例,数据预处理完整配置方式请参考《ATC工具使用指南》“--insert_op_conf ”章节。
    • 当推理数据为图片且未指定数据预处理配置文件时,工具会自动将所有图片Resize成模型所需输入数据的shape。
  • 选择一键推理场景

    执行一键推理前在全局配置中配置一键推理场景开关

    [oneclick_switch]
    # 是否清理当前工作目录下的历史输出结果
    IS_CLEAN_PREVIOUS_OUTPUT=1
    
    # 是否开启模型压缩
    IS_AMCT_RUN=1
    
    # 是否开启GT推理,支持Caffe、ONNX
    IS_GT_RUN=1
    
    # 是否开启上板推理,开启需要配置ssh
    IS_NPU_RUN=0
    
    # 是否开启功能仿真
    IS_FUNC_RUN=1
    
    # 是否开启指令仿真
    IS_INST_RUN=0
    
    # 是否开启性能仿真
    IS_PERF_RUN=0
    
    # 是否在模型推理时开启Dump网络中间结果,作用于功能仿真、指令仿真、上板推理
    IS_DUMP_OPEN=1
    
    # 是否开启Dump数据精度比对
    IS_COMPARE_OPEN=1
    
    # 是否开启上板性能数据采集
    IS_BOARD_PROFILING_OPEN=1
    
    # 是否在控制台展示性能数据报告
    IS_PROFILE_DISPLAY_OPEN=0
    
    # 是否使用AMCT PyTorch量化误差分析
    IS_QUANT_ANALYSIS_OPEN=0
    
    # 是否在控制台打印详细的执行日志
    IS_PRINT_PROCESS_DETAIL=0
    
  • 执行一键推理

    执行以下命令进行一键推理:

    cd test_case
    mindcmd oneclick caffe -m ./caffe_resnet50/resnet50.prototxt -w ./caffe_resnet50/resnet50.caffemodel -i ./data/image_ref_list.txt
    
  • 执行结果

    Caffe模型一键推理执行结束后会在工作路径下生成相应的文件,主要的目录结构如下:

    ├── work_space
    │   ├── bin                                   # 可执行文件路径
    │   ├── data                                  
    │   │   ├── inference_data_XXX.txt           # 图片数据/推理数据
    │   │   ├── insert_op.cfg                    # aipp配置
    │   ├── model                                 # om离线模型保存路径
    │   ├── output                
    │   │   ├── project_XXX                
    │   │   │   ├── amct                        # 模型压缩输出路径
    │   │   │   ├── atc                         # 模型转换输出路径
    │   │   │   ├── cmp                         # 精度比对结果保存路径
    │   │   │   ├── dump                        # dump结果保存路径
    │   │   │   │    ├── float                 # 原始模型浮点dump数据,用于精度比对
    │   │   │   │    ├── fake_quant            # 量化后模型dump数据,用于精度比对
    │   │   │   │    ├── funcsim               # 离线模型功能仿真dump数据,用于精度比对
    │   │   │   │    │    └── trap
    │   │   │   │    ├── instsim               # 离线模型指令仿真dump数据,用于精度比对
    │   │   │   │    │    ├── layer
    │   │   │   │    │    └── trap
    │   │   │   │    └── npu                   # 离线模型上板推理dump数据,用于精度比对
    │   │   │   │    │    └── trap
    │   │   │   ├── log                         # 一键推理执行日志所在文件夹
    │   │   │   ├── profiling                   # 性能分析结果保存路径
    │   │   │   └── preprocess                  # 数据预处理结果保存路径
    │   │   └── latest_result                    # 最后一次执行的oneclick输出路径 
    │   ├── acl_dump_XXX.json                     # acl配置文件(下发dump配置)     
    │   ├── acl_XXX.json                          # acl配置文件(下发release配置)
    │   ├── acl_profiling_XXX.json                # acl配置文件(下发profiling配置)
    │   ├── acl_perfsim_XXX.json                  # acl配置文件(下发性能仿真配置)
    │   └── project.cfg                           # 工程参数配置文件
    

    说明:

    • 当IS_DUMP_OPEN值为0时,trap目录中只会保存模型尾层输出。
    • 指令仿真的尾层输出会保存在layer目录中,且精度比对使用layer dump数据进行比对。不存在layer目录时使用trap进行比对。
    • 当IS_PERF_RUN值为1,IS_INST_RUN值为0时,一键推理会将性能仿真的推理结果输出到指令仿真的目录${work_dir}/output/project_XXX/dump/instsim中。

PyTorch模型一键推理

PyTorch模型一键推理流程如图1所示。

图 1 PyTorch模型一键推理流程图

命令行格式说明

PyTorch模型一键推理的命令行格式如下:

mindcmd oneclick pytorch -m MODEL -i IMAGE_LIST --input_shape INPUT_SHAPE

PyTorch模型一键推理的命令行参数说明如表1所示。

表 1 PyTorch模型一键推理命令行参数说明

参数

必选/可选

描述

pytorch子命令

-m, --model

必选

指定可初始化PyTorch模型的对象, 如:package.module.class。

确保参数路径在PYTHONPATH环境变量下。

--input_shape

必选

指定模型输入的shape。多输入模型按照输入顺序指定,用英文分号作为分割,用英文双引号括住,如 --input_shape="1,3,224,224;1,3,224,224"。

说明:

当-i/--image_list参数传入npy格式的feature map数据时,此参数非必选,工具自动解析输入feature map的shape信息当做模型的shape。

-w, --weight

可选

指定权重( *.pt,*.pth,*.pth.tar )文件。

–i, --image_list

可选

指定推理数据。支持图片列表(.txt)和feature map(.txt/.bin/.npy)格式。

工具按照传入路径参数后缀和文件内容区分图片列表或者feature map,具体规则如下:

  • 当txt文件内每行为一张图片的路径时,将输入 .txt 后缀文件识别为图片列表。支持图片格式包括:

    ".bmp", ".jpeg", ".jpg", ".jpe", ".jp2", ".png"。

  • 当txt文件内任意一行不是路径时,将输入.txt后缀文件识别为txt格式的feature map。
  • .txt文件内不支持写feature map路径。
  • txt格式的feature map,数据间以空格分隔,txt文件内每一行的数据个数为channel × height × width。一行表示一个batch的数据量,总数据量应该与模型输入shape的N*C*H*W乘积一致。
  • .bin或者.npy 后缀识别为feature map。
  • 输入为图片、.bin或者.txt格式的feature map必须同时指定--input_shape参数使用。

多输入模型按照输入顺序指定,使用英文双引号包含,并用英文分号作为分割,如 --image_list="/home/MindCmdUser/image_list1.txt;/home/MindCmdUser/image_list2.txt"。

当未指定此参数时,工具将根据--input_shape参数所指定的shape信息,生成随机数feature map作为输入数据并用于推理。

说明:
  • 当推理数据为图片场景,Calibration数据和Validation数据分离,工具使用最后一张图片作为Validation数据,其他图片用做Calibration数据。
  • 当推理数据为feature map场景,每路输入只支持传入单个feature map文件,且传入的数据同时用于模型的Calibration和Validation。
  • 输入数据经过预处理后,保存在${work_dir}/output/project_xxx/preprocess/路径下。

--aipp

可选

指定数据预处理配置文件,参考数据预处理配置文件样例。

数据预处理完整配置方式请参考《ATC工具使用指南》“--insert_op_conf ”章节。

--input_type

可选

指定待处理数据的数据类型,只用于Feature map输入,不能用于图片输入。支持数据类型FP16, FP32, INT16, INT8, S16, S8, U16, U8, UINT16, UINT8。指定多个输入数据类型时,使用英文分号隔开,用英文双引号括住。eg.:--input_type="INT8;FP16"

--quant_config

可选

指定AMCT的简易量化配置文件(*.yml,*.yaml)或量化配置文件(*.json)。配置方式请参考《AMCT使用指南(PyTorch)》“静态图简易量化配置功能说明”章节。

说明:

json、yml或者yaml中配置线性4bit量化时,MindCmd不会进行精度优化,仅推荐用于性能评估;

不支持非均匀4bit 。

-r, --rpndata

可选

rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且不执行AMCT和GT。

指定多个rpn文件时使用英文双引号包含,并用英文分号作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量。多输入多batch模型只需指定较大的那个batch值。如双路输入的模型,其中一路支持32batch,一路不支持多batch,则输入 --batch_num=32。

--realquant

可选

真量化开关,指定此参数即表示开启。

-h, --help

可选

展示PyTorch模型一键推理 help 信息,eg. mindcmd oneclick pytorch -h。

oneclick子命令

-k, --work_dir

可选

指定工作目录,否则使用默认工作路径 $HOME/MindCmd-WorkSpace/XXX,XXX根据运行的模型动态生成。

指定的工作目录要求已存在。

如果开启了上板推理开关(IS_NPU_RUN=1),则工作目录不能超出ssh.cfg文件配置小节中HOST_MOUNT_PATH配置的路径。

-s, --ssh_config

可选

指定板端ssh挂载配置文件。ssh挂载需先进行NFS环境搭建,可参考NFS环境搭建。

ssh挂载配置文件的模板,可参考ssh.cfg文件配置。

--clean

可选

输入一个前缀${prefix}用于删除${work_dir}/output/目录下所有名为“${prefix}_xxxxx”的文件夹,删除oneclick模块的历史输出目录。

例如:输入 --clean project 将会删除${work_dir}/output/目录下所有名为“project_xxxxx”的文件夹。

-h, --help

可选

展示命令行 help 信息,eg. mindcmd oneclick -h。

说明:

  • 输入各参数的位置要求位于其所属子命令之后,例如:
    mindcmd oneclick -k {WORK_DIR} pytorch -m {package.model.class} --input_shape {INPUT_SHAPE}
    
  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。
  • 多输入场景支持featuremap和图片列表混输,eg. -i="${图片列表};${feature_map}"。
  • PyTorch模型默认使用GPU进行推理,若需要指定具体GPU卡号可通过环境变量CUDA_VISIBLE_DEVICES配置,例如:
    方式一:
    CUDA_VISIBLE_DEVICES=1 mindcmd oneclick -k {WORK_DIR} pytorch -m {package.model.class} --input_shape {INPUT_SHAPE}
    方式二:
    export CUDA_VISIBLE_DEVICES=1
    mindcmd oneclick -k {WORK_DIR} pytorch -m {package.model.class} --input_shape {INPUT_SHAPE}
    

执行样例

  • 模型和数据准备。

    将推理所需的PyTorch模型文件以及所需的数据等上传到开发环境任意路径, 如/home/MindCmdUser/test_case,参考目录结构如下:

    ├── test_case
    │   ├── ssh.cfg   # 可选,否则需要关闭上板推理
    │   ├── pytorch_resnet50
    │   │   ├── __init__.py
    │   │   ├── resnet.py  # 必选
    │   │   └── resnet50-19c8e357.pth
    │   ├── data  # 可选,否则工具自动使用随机数推理
    │   │   ├── dog1_1024_683.jpg
    │   │   ├── dog2_1024_683.jpg
    │   │   ├── insert_op.cfg
    │   │   └── image_ref_list.txt
    

    配置PYTHONPATH环境变量:

    export PYTHONPATH=/home/MindCmdUser/test_case:$PYTHONPATH
    

    说明:

    • 推理数据的shape应该与模型所需输入数据的shape相同,如:模型resnet50的shape为(3, 224, 224),图片的shape也应为(3, 224, 224)。否则需要自定义数据预处理方式,通过--aipp参数指定数据预处理配置文件样例,数据预处理完整配置方式请参考《ATC工具使用指南》“--insert_op_conf ”章节。
    • 当推理数据为图片且未指定数据预处理配置文件时,工具会根据--input_shape参数值,将所有图片Resize成模型所需输入数据的shape。
  • 选择一键推理场景

    执行一键推理前可以在mindcmd.ini文件中配置一键推理开关[oneclick_switch]

    [oneclick_switch]
    # 是否清理当前工作目录下的历史输出结果
    IS_CLEAN_PREVIOUS_OUTPUT=0
    
    # 是否开启模型压缩
    IS_AMCT_RUN=1
    
    # 是否开启GT推理,支持Caffe、ONNX
    IS_GT_RUN=1
    
    # 是否开启上板推理,开启需要配置ssh
    IS_NPU_RUN=0
    
    # 是否开启功能仿真
    IS_FUNC_RUN=1
    
    # 是否开启指令仿真
    IS_INST_RUN=0
    
    # 是否开启性能仿真
    IS_PERF_RUN=0
    
    # 是否在模型推理时开启Dump网络中间结果,作用于功能仿真、指令仿真、上板推理
    IS_DUMP_OPEN=1
    
    # 是否开启Dump数据精度比对
    IS_COMPARE_OPEN=1
    
    # 是否开启上板性能数据采集
    IS_BOARD_PROFILING_OPEN=1
    
    # 是否在控制台展示性能数据报告
    IS_PROFILE_DISPLAY_OPEN=0
    
    # 是否使用AMCT PyTorch量化误差分析
    IS_QUANT_ANALYSIS_OPEN=0
    
    # 是否在控制台打印详细的执行日志
    IS_PRINT_PROCESS_DETAIL=0
    
  • 执行一键推理

    执行以下命令进行一键推理:

    cd test_case
    mindcmd oneclick pytorch -m pytorch_resnet50.resnet.resnet50 -i ./data/image_ref_list.txt --input_shape 1,3,224,224 --realquant
    
  • 执行结果

    PyTorch模型一键推理执行结束后会在工作路径下生成相应的文件,主要的目录结构如下:

    ├── work_space
    │   ├── bin                                   # 可执行文件路径
    │   ├── data                                  
    │   │   ├── inference_data_XXX.txt           # 推理数据
    │   │   ├── insert_op.cfg                    # aipp配置
    │   ├── model                                 # om离线模型保存路径
    │   ├── output                
    │   │   ├── project_XXX                
    │   │   │   ├── amct                        # 模型压缩输出路径
    │   │   │   ├── atc                         # 模型转换输出路径
    │   │   │   ├── cmp                         # 精度比对结果保存路径
    │   │   │   ├── dump                        # dump结果保存路径
    │   │   │   │    ├── float                 # 原始模型浮点dump数据,用于精度比对
    │   │   │   │    ├── fake_quant            # 量化后模型假量化dump数据,用于精度比对
    │   │   │   │    ├── real_quant            # 量化后模型真量化dump数据,用于精度比对
    │   │   │   │    ├── funcsim               # 离线模型功能仿真dump数据,用于精度比对
    │   │   │   │    │    └── trap
    │   │   │   │    ├── instsim               # 离线模型指令仿真dump数据,用于精度比对
    │   │   │   │    │    ├── layer
    │   │   │   │    │    └── trap
    │   │   │   │    └── npu                   # 离线模型上板推理dump数据,用于精度比对
    │   │   │   │    │    └── trap
    │   │   │   ├── log                         # 一键推理执行日志所在文件夹
    │   │   │   ├── profiling                   # 性能分析结果保存路径
    │   │   │   └── preprocess                  # 数据预处理结果保存路径
    │   │   └── latest_result                    # 最后一次执行的oneclick输出路径 
    │   ├── acl_XXX.json                          # acl配置文件(下发release配置)
    │   ├── acl_dump_XXX.json                     # acl配置文件(下发dump配置)
    │   ├── acl_profiling_XXX.json                # acl配置文件(下发profiling配置)
    │   ├── acl_perfsim_XXX.json                  # acl配置文件(下发性能仿真配置)
    │   └── project.cfg                           # 工程参数配置文件
    

    说明:

    • 当IS_DUMP_OPEN值为0时,trap目录中只会保存尾层输出。
    • 指令仿真的尾层输出会保存在layer目录中,且精度比对使用layer dump数据进行比对。不存在layer目录时使用trap进行比对。
    • 当IS_PERF_RUN值为1,IS_INST_RUN值为0时,一键推理会将性能仿真的推理结果输出到指令仿真的目录${work_dir}/output/project_XXX/dump/instsim中。

量化后模型一键推理

工具支持传入量化后的权重文件和量化配置文件执行量化后模型一键推理,流程如图1所示。命令行格式如下:

mindcmd oneclick pytorch -m MODEL -w WEIGHT  -i IMAGE_LIST --input_shape INPUT_SHAPE --quant_config QUANT_CONFIG

图 1 量化后模型一键推理流程图

说明:

当且仅当同时输入量化后的权重文件和量化配置文件时,才会执行量化后模型一键推理。

硬件感知一键推理

工具支持硬件感知一键推理流程,流程如图1所示。命令行格式如下:

mindcmd oneclick pytorch -m MODEL -i IMAGE_LIST --realquant

图 1 硬件感知一键推理流程图

说明:

当参数--quant_config传入量化配置文件(*.json)时,不会执行硬件感知一键推理。

ONNX模型一键推理

ONNX模型一键推理流程如图1所示。

图 1 ONNX模型一键推理流程图

命令行格式说明

ONNX模型一键推理的命令行格式如下:

mindcmd oneclick onnx -m MODEL -i IMAGE_LIST 

ONNX模型一键推理的命令行参数说明如表1所示。

表 1 ONNX模型一键推理命令行参数说明

参数

必选/可选

描述

onnx子命令

–m, --model

必选

指定ONNX模型文件。

–i, --image_list

可选

指定推理数据。支持图片列表(.txt)和feature map(.txt/.bin/.npy)格式。

工具按照传入路径参数后缀和文件内容区分图片列表或者feature map,具体规则如下:

  • 当txt文件内每行为一张图片的路径时,将输入 .txt 后缀文件识别为图片列表。支持图片格式包括:

    ".bmp", ".jpeg", ".jpg", ".jpe", ".jp2", ".png"。

  • 当txt文件内任意一行不是路径时,将输入.txt后缀文件识别为txt格式的feature map。
  • .txt文件内不支持写feature map路径。
  • txt格式的feature map,数据间以空格分隔,txt文件内每一行的数据个数为channel × height × width。一行表示一个batch的数据量,总数据量应该与模型输入shape的N*C*H*W乘积一致。
  • .bin或者.npy 后缀识别为feature map。

多输入模型按照输入顺序指定,使用双引号""包含,并用英文分号;作为分割,如 --image_list="/home/MindCmdUser/image_list1.txt;/home/MindCmdUser/image_list2.txt"。

当未指定此参数时,工具将生成随机数feature map作为输入数据并用于推理。

说明:
  • 当推理数据为图片场景,Calibration数据和Validation数据分离,工具使用最后一张图片作为Validation数据,其他图片用做Calibration数据。
  • 当推理数据为feature map场景,每路输入只支持传入单个feature map文件,且传入的数据同时用于模型的Calibration和Validation。
  • 输入数据经过预处理后,保存在${work_dir}/output/project_xxx/preprocess/路径下。

--aipp

可选

指定数据预处理配置文件,参考数据预处理配置文件样例。

数据预处理完整配置方式请参考《ATC工具使用指南》“--insert_op_conf ”章节。

--input_type

可选

指定待处理数据的数据类型,只用于Feature map输入,不能用于图片输入。支持数据类型FP16, FP32, INT16, INT8, S16, S8, U16, U8, UINT16, UINT8。指定多个输入数据类型时,使用英文分号隔开,用双引号括住。eg.:--input_type="INT8;FP16"

-q, --quant_param_file

可选

指定AMCT量化参数文件,当传入的模型为AMCT量化后模型时,此参数要求必传,且一键推理时AMCT模块将自动跳过。

-r, --rpndata

可选

rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且不执行AMCT和GT。指定多个rpn文件时使用英文双引号""包含,并用英文分号;作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量。多输入多batch模型只需指定较大的那个batch值。如双路输入的模型,其中一路支持32batch,一路不支持多batch,则输入 --batch_num=32。

-h, --help

可选

展示ONNX模型一键推理 help 信息,eg. mindcmd oneclick onnx -h。

oneclick子命令

-k, --work_dir

可选

指定工作目录,否则使用默认工作路径 $HOME/MindCmd-WorkSpace/XXX,XXX根据运行的模型动态生成。

如果开启了上板推理开关(IS_NPU_RUN=1),则工作目录不能超出ssh.cfg文件配置小节中HOST_MOUNT_PATH配置的路径。

-s, --ssh_config

可选

指定板端ssh挂载配置文件。ssh挂载需先进行NFS环境搭建,可参考NFS环境搭建。

ssh挂载配置文件的模板,可参考ssh.cfg文件配置。

--clean

可选

输入一个前缀${prefix}用于删除${work_dir}/output/目录下所有名为“${prefix}_xxxxx”的文件夹,删除oneclick模块的历史输出目录。

例如:输入 --clean project 将会删除${work_dir}/output/目录下所有名为“project_xxxxx”的文件夹。

-h, --help

可选

展示命令行 help 信息,eg. mindcmd oneclick -h。

说明:

  • 输入各参数的位置要求位于其所属子命令之后,例如:
    mindcmd oneclick -k {WORK_DIR} onnx -m  *.onnx
    
  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。
  • 多输入场景支持feature map和图片列表混输,eg. -i="${图片列表};${feature_map}"。
  • ONNX模型仅支持使用CPU进行推理。

执行样例

  • 模型和数据准备。

    将推理所需的ONNX模型文件以及所需的数据等上传到开发环境任意路径,参考目录如下:

    ├── test_case
    │   ├── ssh.cfg  # 可选,否则需要关闭上板推理
    │   ├── onnx_resnet50
    │   │   └── resnet50.onnx  # 必选
    │   ├── data  # 可选,否则工具自动使用随机数推理
    │   │   ├── dog1_1024_683.jpg
    │   │   ├── dog2_1024_683.jpg
    │   │   ├── insert_op.cfg
    │   │   └── image_ref_list.txt
    

    说明:

    • 推理数据的shape应该与模型所需输入数据的shape相同,如:模型resnet50的shape为(3, 224, 224),图片的shape也应为(3, 224, 224)。否则需要自定义数据预处理方式,通过--aipp参数指定数据预处理配置文件样例,数据预处理完整配置方式请参考《ATC工具使用指南》“--insert_op_conf ”章节。
    • 当推理数据为图片且未指定数据预处理配置文件时,工具会将所有图片Resize成模型所需输入数据的shape大小。
  • 选择一键推理场景

    执行一键推理前可以在mindcmd.ini文件中配置一键推理开关[oneclick_switch]

    [oneclick_switch]
    # 是否清理当前工作目录下的历史输出结果
    IS_CLEAN_PREVIOUS_OUTPUT=0
    
    # 是否开启模型压缩
    IS_AMCT_RUN=1
    
    # 是否开启GT推理,支持Caffe、ONNX
    IS_GT_RUN=1
    
    # 是否开启上板推理,开启需要配置ssh
    IS_NPU_RUN=0
    
    # 是否开启功能仿真
    IS_FUNC_RUN=1
    
    # 是否开启指令仿真
    IS_INST_RUN=0
    
    # 是否开启性能仿真
    IS_PERF_RUN=0
    
    # 是否在模型推理时开启Dump网络中间结果,作用于功能仿真、指令仿真、上板推理
    IS_DUMP_OPEN=1
    
    # 是否开启Dump数据精度比对
    IS_COMPARE_OPEN=1
    
    # 是否开启上板性能数据采集
    IS_BOARD_PROFILING_OPEN=1
    
    # 是否在控制台展示性能数据报告
    IS_PROFILE_DISPLAY_OPEN=0
    
    # 是否使用AMCT PyTorch量化误差分析
    IS_QUANT_ANALYSIS_OPEN=0
    
    # 是否在控制台打印详细的执行日志
    IS_PRINT_PROCESS_DETAIL=0
    
  • 执行一键推理

    执行以下命令进行一键推理:

    cd test_case
    mindcmd oneclick onnx -m ./onnx_resnet50/resnet50.onnx -i ./data/image_ref_list.txt
    
  • 执行结果

    ONNX模型一键推理执行结束后会在工作路径下生成相应的文件,主要的目录结构如下:

    ├── work_space
    │   ├── bin                                   # 可执行文件路径
    │   ├── data                                                              
    │   │   ├── inference_data_XXX.txt           # 推理数据
    │   │   ├── insert_op.cfg                    # aipp配置
    │   ├── model                                 # om离线模型保存路径
    │   ├── output                
    │   │   ├── project_XXX                
    │   │   │   ├── atc                         # 模型转换输出路径
    │   │   │   ├── cmp                         # 精度比对结果保存路径
    │   │   │   ├── dump                        # dump结果保存路径
    │   │   │   │    ├── float                 # 原始模型浮点dump数据,用于精度比对
    │   │   │   │    ├── funcsim               # 离线模型功能仿真dump数据,用于精度比对
    │   │   │   │    │    └── trap
    │   │   │   │    ├── instsim               # 离线模型指令仿真dump数据,用于精度比对
    │   │   │   │    │    ├── layer
    │   │   │   │    │    └── trap
    │   │   │   │    ├── atc_fake_quant        # ATC量化dump数据,用于精度比对
    │   │   │   │    └── npu                   # 离线模型上板推理dump数据,用于精度比对
    │   │   │   │    │    └── trap
    │   │   │   ├── log                         # 一键推理执行日志所在文件夹
    │   │   │   ├── profiling                   # 性能分析结果保存路径
    │   │   │   └── preprocess                  # 数据预处理结果保存路径
    │   │   └── latest_result                    # 最后一次执行的oneclick输出路径 
    │   ├── acl_dump_XXX.json                     # acl配置文件(下发dump配置)
    │   ├── acl_XXX.json                          # acl配置文件(下发release配置)      
    │   ├── acl_profiling_XXX.json                # acl配置文件(下发profiling配置)
    │   ├── acl_perfsim_XXX.json                  # acl配置文件(下发性能仿真配置)
    │   └── project.cfg                           # 工程参数配置文件
    

    说明:

    • 当IS_DUMP_OPEN值为0时,trap目录中只会保存尾层输出。
    • 指令仿真的尾层输出会保存在layer目录中,且精度比对使用layer dump数据进行比对。不存在layer目录时使用trap进行比对。
    • 当IS_PERF_RUN值为1,IS_INST_RUN值为0时,一键推理会将性能仿真的推理结果输出到指令仿真的目录${work_dir}/output/project_XXX/dump/instsim中。

Deployed模型一键推理

针对单独调用AMCT PTQ或QAT生成的定点模型流程如图1所示。

图 1 Deployed一键推理流程图

说明:

Deployed模型的一键推理命令格式请参考:Caffe模型一键推理、PyTorch模型一键推理和ONNX模型一键推理。

数据预处理

功能介绍

此功能对数据进行预处理,生成AMCT/ATC/仿真/上板的推理数据(.npy 和 .bin格式)。

当前支持图像裁剪(crop)、图像边缘填充(padding)、图像缩放(resize)、色域转换、通道数据交换、减均值、乘系数。

命令行格式说明

数据预处理命令行格式如下:

mindcmd preprocess --model_input_shape MODEL_INPUT_SHAPE -i IMAGE_LIST

命令行参数说明如表1 所示

表 1 数据预处理命令行参数说明

参数

必选/可选

描述

-shape, --model_input_shape

必选

指定输入数据经过预处理后,输出数据的目标shape。

-i, --image_list

可选

  • 指定待处理的图片列表(.txt)路径,多输入场景支持传入多个图片列表,如下所示。

eg. -i="image_list_1.txt;image_list_2.txt"。

txt文件内每一行定义一张图片的路径,支持的文件格式包括:

".bmp", ".jpeg", ".jpg", ".jpe", ".jp2", ".png"。

  • 指定待处理的feature map路径,多输入场景,支持传入多个feature map路径,如下所示。

eg. -i="feature_map_1.bin;feature_map_2.bin"

支持的文件格式包括:"*.bin", "*.npy", "*.txt"。feature map为.txt格式的文本内容时,数据间以空格分隔,txt文件内每一行的数据个数为channel × height × width。一行表示一个batch的数据量,总数据量应该与模型输入shape的N*C*H*W乘积一致。

  • 未指定此参数时,将在输出路径下random_data子目录中自动生成随机数feature map作为输入数据。

--input_type

可选

指定待处理数据的数据类型,只用于Feature map输入,不能用于图片输入。支持数据类型FP16, FP32, INT16, INT8, S16, S8, U16, U8, UINT16, UINT8。指定多个输入数据类型时,使用英文分号隔开,用双引号括住。eg.:--input_type="INT8;FP16"

--aipp

可选

指定自定义aipp配置文件路径,aipp完整配置方式请参考《ATC工具使用指南》“--insert_op_conf ”章节。当-i/--image_list传入图片列表路径,并且没有指定aipp配置文件时,则使用默认aipp配置:

aipp_op {

related_input_rank : ${index}

aipp_mode : static

input_format : BGR_PLANAR

model_format : BGR

}

-o, --output

可选

预处理结果输出路径,默认为-i/--image_list的路径。-o/--output和-i/--image_list均未指定时,预处理结果保存在执行路径下。

-h, --help

可选

展示命令行 help 信息。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。
  • 多输入场景支持feature map和图片列表混输,eg. -i="${图片列表};${feature_map}"。

执行样例

  • 模型和数据准备。

    需要进行预处理的数据可进行如下准备:

    ├── data
    │   ├── dog1.jpg
    │   ├── dog2.jpg
    │   ├── insert_op.cfg
    │   └── image_ref_list.txt
    
  • 执行数据预处理

    执行以下命令进行数据预处理:

    cd data
    mindcmd preprocess --model_input_shape 1,3,224,224 --aipp ./insert_op.cfg -i ./image_ref_list.txt -o ./preprocess_output/
    
  • 执行结果

    数据预处理执行结束后会在指定输出路径下生成数据,主要目录结构如下:

    ├── preprocess_output
    │   ├── calibration_dataset                                    # 校准数据集
    │   │   ├── bin                                               # bin格式数据
    │   │   │   └── input_0_dog1_shape_1_3_224_224_FP32.bin
    │   │   ├── npy                                               # npy格式数据
    │   │   │   └── input_0_dog1_shape_1_3_224_224_FP32.npy
    │   │   └── original                                          # 原始输入数据
    │   │   │   └── dog1.jpg
    │   ├── validation_dataset                                     # 验证数据集
    │   │   ├── bin                                               # bin格式数据
    │   │   │   └── input_0_dog2_bgr_planar_shape_1_3_224_224_U8.bin
    │   │   ├── npy                                               # npy格式数据
    │   │   │   └── input_0_dog2_shape_1_3_224_224_FP32.npy
    │   │   └── original                                          # 原始输入数据
    │   │   │   └── dog2.jpg
    │   ├── input_format                                           # 按input_format解析的原始输入数据
    │   ├── input0_calibration_npy_FP32.txt                        # 保存了npy格式校准数据的路径
    │   ├── input0_validation_bin_FP32.txt                         # 保存了bin格式验证数据的路径
    │   ├── input0_validation_npy_FP32.txt                         # 保存了npy格式验证数据的路径
    │   └── insert_op.cfg                                          # 数据预处理配置文件
    

    说明:

    • 当用户传入的-i/--image_list有多组数据且每组的数据个数不等时,MindCmd将采用最小的数据个数作为预处理操作的图片个数。示例:
      mindcmd preprocess --model_input_shape "1,3,2,2;1,3,4,4" --image_list "./pic1.txt;./pic2.txt"
      
      如果pic1.txt中有4张图片,pic2.txt中有2张图片,那么MindCmd执行预处理时pic1.txt中的最后两张图片不会被处理,以保证每路输入的数据个数是相同的。
    • 关于校准数据集和验证数据集的说明: 如果输入为N张图片,那么MindCmd将使用前N-1张数据作为校准集数据,第N张图片作为验证集数据(当只有一张图片时,该图片既作为校准集数据,也作为验证集数据)。
    • 预处理的输出生成件命名与实际配置的insert_op相关,上述执行结果中的示例仅供参考,生成件文件名描述的shape、input_format等以实际配置为准。

开源框架推理

功能介绍

该功能支持开源框架(Caffe/ONNX)推理,生成的dump数据可用于精度比对。

Caffe模型推理

命令行格式说明

Caffe模型推理的命令行格式如下:

mindcmd gt caffe -w WEIGHT -m MODEL -i IMAGE_LIST

命令行参数说明如表1所示

表 1 Caffe模型推理命令行参数说明

参数

必选/可选

描述

caffe

必选

指定Caffe开源框架。

-m , --model

必选

指定Caffe模型的模型定义文件( .prototxt)路径。

-w, --weight

可选

指定Caffe模型的权重文件(.caffemodel)路径,未指定将根据-m/--model参数指定的模型定义文件生成随机权重文件,位于-o/--output指定的数据输出路径下。

说明:

权重随机生成时精度比对结果可能全为1.0,这个是由于Caffe将权重默认初始化成0导致,可以通过调整模型定义(.prototxt)文件里面的weight_filler来规避。

-i, --image_list

可选

执行推理模型所需的数据集(.txt)。txt文件内要求为.npy、.bin或者.txt格式的feature map推理数据,每行定义一条推理数据的路径。

未指定将根据-m/--model参数指定的模型定义文件生成随机数据,位于-o/--output指定的数据输出路径下。

-g, --gpu_id

可选

是否使用gpu,eg. -g=0 使用第0个gpu 。

-o, --output

可选

指定Ground Truth dump数据输出路径,默认与模型定义文件所在的路径相同。

-h,--help

可选

展示命令行 help 信息。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 数据准备

    执行开源框架前需要提前准备推理数据(参考“数据预处理”),参考文件结构如下:

    ├── test_case
    │  ├── caffe_resnet50
    │  │   ├── resnet50.caffemodel
    │  │   └── resnet50.prototxt
    │  ├── data
    │  │     ├── data_dog1_shape_1_3_224_224_float32.npy
    │  │     ├── data_dog2_shape_1_3_224_224_float32.npy
    │  │     └── image_ref_list.txt
    
  • 执行模型推理

    执行以下命令进行模型推理:

    cd test_case
    mindcmd gt caffe -m ./caffe_resnet50/resnet50.prototxt -w ./caffe_resnet50/resnet50.caffemodel -i ./data/image_ref_list.txt -o ./gt_output/
    
  • 执行结果

    执行结束后会在指定输出路径中生成Ground Truth dump数据,主要文件结构示例如下:

    ├── gt_output
    │   ├── ${时间戳}_ops 
    │   │   ├── 0                          # 第0个推理过程中每一层的dump文件(.npy)
    │   │   └── 1                          # 第1个推理过程中每一层的dump文件(.npy)
    

ONNX模型推理

命令行格式说明

ONNX模型推理的命令行格式如下:

mindcmd gt onnx -m MODEL -i IMAGE_LIST

命令行参数说明如表1所示

表 1 ONNX模型推理命令行参数说明

参数

必选/可选

描述

onnx

必选

指定ONNX开源框架。

-m,--model

必选

ONNX模型(.onnx)的路径。

-i, --image_list

可选

执行推理模型所需的数据集(.txt)。txt文件内要求文件格式 .npy/.bin,每行定义一条推理数据的路径。

未指定将根据-m/--model参数指定的模型定义文件生成随机数据,位于-o/--output指定的数据输出路径下。

-o, --output

可选

指定Ground Truth dump数据输出路径,默认与模型所在的路径相同。

-h,--help

可选

展示命令行 help 信息。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 数据准备

    执行开源框架前需要提前准备推理数据(处理方法参考“数据预处理”),参考文件结构如下:

    ├── test_case
    │  ├── onnx_resnet50
    │  │   └── resnet50.onnx
    │  ├── data
    │  │     ├── npy_data
    │  │     ├── data_dog1_shape_1_3_224_224_float32.npy
    │  │     ├── data_dog2_shape_1_3_224_224_float32.npy
    │  │     └── image_ref_list.txt
    
  • 执行模型推理

    执行以下命令进行模型Ground Truth推理:

    cd test_case
    mindcmd gt onnx -m ./onnx_resnet50/resnet50.onnx -i ./data/image_ref_list.txt -o ./gt_output/
    
  • 执行结果

    执行结束后会在指定输出路径中生成Ground Truth dump数据,主要文件结构示例如下:

    ├── gt_output
    │   ├── ${时间戳}_ops 
    │   │   ├── 0                          # 第0个推理过程中每一层的dump文件(.npy)
    │   │   └── 1                          # 第1个推理过程中每一层的dump文件(.npy)
    

模型压缩

功能介绍

该功能支持对开源框架(Caffe/PyTorch)的模型压缩,从而达到节省网络模型存储空间、降低传输时延、提高计算效率,达到性能提升与优化的目标。

Caffe模型压缩

命令行格式说明

Caffe模型压缩的命令行格式如下:

mindcmd amct caffe -w WEIGHT -m MODEL -i IMAGE_LIST -o OUTPUT

Caffe模型压缩的命令行参数说明如表1所示

表 1 Caffe模型压缩命令行参数说明

参数

必选/可选

描述

caffe

必选

指定caffe框架。

-m, --model

必选

Caffe模型的模型定义文件( .prototxt)路径。

-o, --output

必选

量化后定点模型和权重的保存路径。

-w, --weight

可选

Caffe模型的权重文件( .caffemodel)路径。未指定将根据-m/--model参数指定的模型定义文件生成随机权重文件,位于模型定义文件所在路径下。

说明:

权重随机生成时精度比对结果可能全为1.0,这个是由于Caffe将权重默认初始化成0导致,属于正常现象,可以通过调整模型定义(.prototxt)文件里面的weight_filler来规避。

-i, --image_list

可选

执行模型推理所需的数据集(.txt)。txt文件内每行定义一条推理数据的路径,推理数据支持.npy/.bin后缀。

未指定将根据-m/--model参数指定的模型定义文件生成随机数据,位于-o/--output指定的数据输出路径下。

-b, --batch_num

可选

Batch数目,用于AMCT量化的batch_num。

--quant_config

可选

指定AMCT的简易量化配置文件(*.cfg)或量化配置文件(*.json)。配置方式请参考《AMCT使用指南(Caffe)》。

说明:

通过--quant_config可以先对模型进行调试,符合预期后将量化的deployed模型使用Caffe模型一键推理部署。

json或者cfg中配置线性4bit量化时,MindCmd不会进行精度优化,仅推荐用于性能评估;

不支持非均匀4bit 。

-g, --gpu_id

可选

是否使用gpu,eg. -g=0 使用第0个gpu,默认CPU模式。

-h,--help

可选

展示命令行 help 信息。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 模型和数据准备。

    将需要进行模型压缩的Caffe模型文件(.prototxt)、权重文件(.caffemodel)以及所需的数据(feature_map)等上传到服务器工作路径,参考目录结构如下:

    ├── test_case
    │   ├── caffe_resnet50
    │   │   ├── resnet50.caffemodel
    │   │   └── resnet50.prototxt
    │   ├── data
    │   │   ├── data_dog1_shape_1_3_224_224_float32.npy
    │   │   ├── data_dog2_shape_1_3_224_224_float32.npy
    │   │   └── image_ref_list.txt
    
  • 执行模型压缩

    执行以下命令进行模型压缩:

    cd test_case 
    mindcmd amct caffe -m ./caffe_resnet50/resnet50.prototxt -w ./caffe_resnet50/resnet50.caffemodel -i ./data/image_ref_list.txt -o ./amct_output
    
  • 执行结果

    Caffe模型压缩执行结束后会在输出路径下生成相应的文件,主要文件结构示例如下:

    ├── amct_output
    │   ├── resnet50_tmp
    │   ├── amct_log
    │   │   └── amct_caffe.log
    │   ├── resnet50_config.json
    │   ├── resnet50_deploy_model.prototxt
    │   ├── resnet50_deploy_weights.caffemodel
    │   ├── resnet50_fake_quant_model.prototxt
    │   ├── resnet50_fake_quant_weights.caffemodel
    │   ├── resnet50_quant.json
    │   ├── resnet50_quant_param_record.bin
    │   ├── resnet50_quant_param_record.txt
    │   └── resnet50_uninplace.prototxt
    

    对应文件的描述如表1所示:

    表 1 Caffe模型压缩结果文件描述

    文件

    描述

    activation_modified_model.caffemodel

    中间模型文件。

    activation_modified_model.prototxt

    modified_weights.caffemodel

    modified_weights.prototxt

    scale_offset_record.txt

    记录量化因子的文件(不带BN融合),请参考《AMCT使用指南(Caffe)》“量化因子记录文件说明”。

    scale_offset_record_update.txt

    记录量化因子的文件(带BN融合),请参考《AMCT使用指南(Caffe)》“量化因子记录文件说明”。

    resnet50_config.json

    描述了如何对模型中的每一层进行量化。

    resnet50_deploy_model.prototxt

    量化后可在SoC部署的模型文件。

    resnet50_deploy_weights.caffemodel

    量化后可在SoC部署的权重文件。

    resnet50_fake_quant_model.prototxt

    量化后可在Caffe环境进行精度仿真模型文件。

    resnet50_fake_quant_weights.caffemodel

    量化后可在Caffe环境进行精度仿真权重文件。

    resnet50_quant.json

    融合文件,记录图在量化前后的节点对应关系,用于浮点与仿真模型精度比对。

    resnet50_quant_param_record.bin

    量化参数文件二进制形式,用于ATC生成om模型。

    resnet50_quant_param_record.txt

    量化参数文件文本格式(推荐使用),用于ATC生成om模型。

    resnet50_uninplace.prototxt

    解除inplace后的Caffe模型定义文件。

PyTorch模型压缩

命令行格式说明

PyTorch模型压缩的命令行格式如下:

mindcmd amct pytorch -m MODEL  -i IMAGE_LIST -o OUTPUT

PyTorch模型压缩的命令行参数说明如表1所示。

表 1 PyTorch模型压缩命令行参数说明

参数

必选/可选

描述

pytorch

必选

指定PyTorch框架。

-m, --model

必选

pytorch子命令所属参数。指定可初始化PyTorch模型的对象, 如:package.module.class。

确保参数路径在PYTHONPATH环境变量下。

-o, --output

必选

量化后定点模型的保存路径。

-w, --weight

可选

pytorch子命令所属参数。指定权重( .pt,.pth,.pth.tar )文件。

-i, --image_list

可选

执行模型推理所需的数据集(.txt)。txt文件内每行定义一条推理数据的路径,推理数据支持.npy/.bin后缀。

.bin格式的feature map必须同时指定--input_shape参数使用。

--input_shape

可选

指定模型的shape。多输入模型按照输入顺序指定,用分号;作为分割,用双引号括住,如 --input_shape="1,3,224,224;1,3,224,224"。

当未指定-i, --image_list参数时,此参数要求必传,工具将根据输入的shape信息生成随机数feature map,位于-o, --output指定的数据输出路径下。

-b, --batch_num

可选

Batch数目,用于AMCT量化的batch_num。

工具以简易量化配置文件(*.yml, *.yaml)或量化配置文件(*.json)中的batch_num为准,不推荐通过该参数配置。

--quant_config

可选

指定AMCT的简易量化配置文件(*.yml, *.yaml)或量化配置文件(*.json)。配置方式请参考《AMCT使用指南(PyTorch)》“静态图简易量化配置功能说明”章节。

说明:

通过--quant_config可以先对模型进行调试,符合预期后将量化的deployed模型使用oneclick部署。

json、yml或者yaml中配置线性4bit量化时,MindCmd不会进行精度优化,仅推荐用于性能评估;

不支持非均匀4bit 。

--quant_analysis

可选

量化误差分析,具体功能描述及生成件参见《AMCT使用指南(PyTorch)》“量化误差分析”章节。

-h, --help

可选

展示命令行 help 信息

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 模型和数据准备。

    将需要进行模型压缩的PyTorch模型文件以及所需的数据(.npy)等上传到服务器工作路径,如/home/MindCmdUser/test_case,参考目录结构如下:

    ├── test_case
    │   ├── pytorch_resnet50
    │   │   ├── __pycache__
    │   │   ├── __init__.py
    │   │   ├── resnet.py
    │   │   └── resnet50-19c8e357.pth
    │   ├── data
    │   │   ├── data_dog1_shape_1_3_224_224_float32.npy
    │   │   ├── data_dog2_shape_1_3_224_224_float32.npy
    │   │   └── image_ref_list.txt
    

    配置PYTHONPATH环境变量:

    export PYTHONPATH=/home/MindCmdUser/test_case:$PYTHONPATH
    
  • 执行模型压缩

    执行以下命令进行模型压缩:

    cd test_case
    mindcmd amct pytorch -m pytorch_resnet50.resnet.resnet50 -i ./data/image_ref_list.txt -o ./amct_output
    
  • 执行结果

    PyTorch模型压缩执行结束后会在指定输出路径下生成相应的文件,主要文件结构示例如下:

    ├── amct_output
    │   ├── tmp
    │   ├── amct_log
    │   │   └── hotwheels.amct_pytorch.log
    │   ├── resnet50_deploy_model.onnx
    │   ├── resnet50_calibration.pt
    │   └── resnet50_quant_param_record.txt
    

    对应文件的描述如表1所示。

    表 1 模型压缩结果文件描述

    文件

    描述

    hotwheels.amct_pytorch.log

    量化日志文件,记录了量化过程的日志信息。

    resnet50_deploy_model.onnx

    量化后可在SoC部署的模型文件。

    resnet50_calibration.pt

    量化模型的权重文件。

    resnet50_quant_param_record.txt

    量化参数文件。

    tmp

    模型压缩临时文件。

模型转换

功能介绍

该功能将开源框架模型(Caffe/ONNX)转换成图像分析引擎支持的离线模型,模型转换过程中可以实现算子调度的优化、权值数据重排、内存使用优化等,可以脱离设备完成模型的预处理。

命令行格式说明

模型转换功能的命令行格式如下:

mindcmd atc [-c  | -a [[...]]]

命令行参数说明如表1所示。

表 1 模型转换命令行参数说明

参数

必选/可选

描述

-c, --cfg

必选

配置ATC模型转换依赖的cfg配置文件,与-a/--args互斥。

请参见《ATC工具使用指南》"参数说明"。

-a, --args

必选

配置ATC命令行参数,与-c/--cfg互斥。请参见《ATC工具使用指南》"参数说明"。

-h, --help

可选

展示命令行 help 信息。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

执行样例

  • 数据准备

    执行模型转换前需准备相应的模型和数据(以Caffe模型为例),其文件结构如下:

    ├── atc_resource
    │   ├── data
    │   │   └── dog1_1024_683.bin
    │   ├── caffe_resnet50
    │   │   ├── resnet50.prototxt
    │   │   └── resnet50.caffemodel
    
  • 执行模型转换

    执行以下命令进行模型转换:

    cd atc_resource
    mindcmd atc -a --model=./caffe_resnet50/resnet50.prototxt --weight=./caffe_resnet50/resnet50.caffemodel --image_list="data:./data/dog1_1024_683.bin" --output=./atc_output/resnet50 --input_type="data:U8"
    

    说明:

    以上执行示例中--image_list参数和--input_type的参数值开头的“data”为网络首层节点名称,请根据网络实际情况进行替换。

  • 执行结果

    模型转换执行结束后会在指定输出路径中生成数据,主要文件结构示例如下:

    ├── atc_output
    │   ├── atc_perf.csv                              # 预估模型在板端运算时实际计算量
    │   ├── calibration_param.txt                     # 模型使用的量化参数 
    │   ├── cnn_net_tree.dot                          # 网络优化后的算子信息
    │   ├── cnn_net_tree_adapt.dot                    # 网络适配后的算子信息
    │   ├── cnn_net_tree_after_tiling_seg_0.dot       # 网络深度融合后的算子信息
    │   ├── cnn_net_tree_org.dot                      
    │   ├── cnn_net_tree_parser.dot                   # 原始模型解析后的算子信息
    │   ├── cnn_net_tree_shape5d_seg_0.dot            
    │   ├── resnet50.om                               # 转换后的模型文件
    │   └── mapper_debug.log                          # 转换模型的调试日志
    

应用工程

功能介绍

提供应用工程功能仿真、指令仿真、性能仿真、上板推理、Dump中间结果和Profiling功能。

说明:

  • 功能仿真:从功能一致性的角度去模拟硬件,速度较快。
  • 指令仿真:从指令一致性的角度去模拟硬件,速度较慢。
  • 性能仿真:在指令仿真的基础上,增加时序方面的模拟,对模型的推理性能进行估算,速度较慢,仅支持模拟统计单段AI Core网络的性能且不 支持Dump, 对于sort/nms/filter 相关层只能体现数据量的性能差异,体现不了数值上引起的性能差异,建议以板端Profiling数据为准。

功能仿真

命令行格式说明

功能仿真的命令行格式如下:

mindcmd app funcsim -m OM -i IMAGE_LIST {dump} ...

命令行参数说明如表1所示。

说明:

  • 命令行中的app、funcsim、dump子命令存在父子关系,因此输入需满足先后顺序。
  • 功能仿真要求输入的om模型在经过ATC模型转换时已经设置了--save_original_model=true。

表 1 功能仿真命令行参数说明

参数

必选/可选

描述

funcsim

必选

指定执行功能仿真。

-h, --help

可选

功能仿真子命令help信息,eg. mindcmd app funcsim -h。

-m, --om

必选

离线模型文件 *.om。

–i, --image_list

必选

指定推理数据,以txt文本传入,txt文件内每行文本内容为推理数据的路径,当前仅支持.bin后缀的推理数据。

-k, --work_dir

可选

指定工作路径,否则使用表1中配置的默认工作路径。

-t, --recurrent_max_total_t

可选

指定Recurrent网络(包含LSTM/RNN/GRU层)每一句话的最大帧数,用于板端运行时分配输入内存。与-b互斥。

-r, --rpndata

可选

指定rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且不执行AMCT和GT。

指定多个rpn文件时使用双引号""包含,并用分号;作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量,多输入模型只需指定一个值,如 --batch_num=32。与-t互斥。

--output

可选

指定推理结果存放路径,默认为 ${work_dir}/dump。当同时指定dump子命令中的--output命令时,以dump子命令的--output为准。

dump

可选

dump开关,如果指定此子命令表示开启dump,将根据-m/--om指定的离线模型文件生成包含dump配置的acl.json文件。默认关闭dump功能。

支持自定义dump配置,详见此表格中dump子命令参数说明。

dump 子命令

--output

可选

指定dump结果存放路径,默认为 ${work_dir}/dump。

--dump_list

可选

指定想要dump的层。如果指定多层,请使用空格作为分割 eg. --dump_list conv1 pool1。不指定--dump_list时,默认dump所有层。

-h

可选

dump子命令help信息,eg. mindcmd app funcsim dump -h。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 模型和数据准备

    参考目录结构如下:

    ├── test_case
    │  ├── resnet50
    │  │   └── resnet50.om
    │  ├── data
    │  │   ├── dog1_shape_1_3_224_224_uint8.bin
    │  │   ├── dog2_shape_1_3_224_224_uint8.bin
    │  │   └── image_ref_list.txt
    
  • 配置默认工作路径(可选)

    使用mindcmd.ini文件[base_config] section 下配置的默认工作路径,或通过命令行参数-k/--work_dir指定工作路径

    [base_config]
    DEFAULT_WORKSPACE=/home/MindCmdUser/workspace/
    
  • 执行功能仿真

    执行以下命令完成功能仿真:

    cd test_case
    mindcmd app funcsim -m ./resnet50/resnet50.om -i ./data/image_ref_list.txt dump
    
  • 执行结果

    功能仿真执行结果保存在工作路径下,主要目录结构示例如下:

    ├── workspace
    │   ├── bin 
    │   ├── data                          
    │   ├── dump
    │   ├── model
    │   └── acl_xxxxxxxx.json      
    

指令仿真

命令行格式说明

指令仿真的命令行格式如下:

mindcmd app instsim -m OM -i IMAGE_LIST {dump} ...

命令行参数说明如表1所示。

说明:

命令行中的app、instsim、dump子命令存在父子关系,因此输入需满足先后顺序。

表 1 指令仿真命令行参数说明

参数

必选/可选

描述

instsim

必选

指定执行指令仿真。

-h, --help

可选

指令仿真子命令help信息,eg. mindcmd app instsim -h。

-m, --om

必选

离线模型文件 *.om。

–i, --image_list

必选

指定推理数据,以txt文本传入,txt文件内每行文本内容为推理数据的路径,当前仅支持.bin后缀的推理数据。

-k, --work_dir

可选

指定工作路径,否则使用表1中配置的默认工作路径。

-t, --recurrent_max_total_t

可选

指定Recurrent网络(包含LSTM/RNN/GRU层)每一句话的最大帧数,用于板端运行时分配输入内存。与-b互斥。

-r, --rpndata

可选

指定rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且不执行AMCT和GT。

指定多个rpn文件时使用双引号""包含,并用分号;作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量,多输入模型只需指定一个值,如 --batch_num=32。与-t互斥

--output

可选

指定推理结果存放路径,默认为 ${work_dir}/dump。当同时指定dump子命令中的--output命令时,以dump子命令的--output为准。/

dump

可选

dump开关,如果指定此子命令表示开启dump,将根据-m/--om指定的离线模型文件生成包含dump配置的acl.json文件。默认关闭dump功能。

支持自定义dump配置,详见此表格中dump子命令参数说明。

dump 子命令

--output

可选

指定dump结果存放路径,默认为 ${work_dir}/dump。

--dump_list

可选

指定想要dump的层。如果指定多层,请使用空格作为分割 eg. --dump_list conv1 pool1。不指定--dump_list时,默认dump所有层。

-h

可选

dump子命令help信息,eg. mindcmd app instsim dump -h。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 模型和数据准备

    参考目录结构如下:

    ├── test_case
    │  ├── resnet50
    │  │   └── resnet50.om
    │  ├── data
    │  │   ├── dog1_shape_1_3_224_224_uint8.bin
    │  │   ├── dog2_shape_1_3_224_224_uint8.bin
    │  │   └── image_ref_list.txt
    
  • 配置默认工作路径(可选)

    使用mindcmd.ini文件[base_config] section 下配置的默认工作路径,或通过命令行参数-k/--work_dir指定工作路径。

    [base_config]
    DEFAULT_WORKSPACE=/home/MindCmdUser/workspace/
    
  • 执行指令仿真

    执行以下命令进行指令仿真:

    cd test_case
    mindcmd app instsim -m ./resnet50/resnet50.om -i ./data/image_ref_list.txt dump
    
  • 执行结果

    指令仿真执行结果保存在工作路径下,主要目录结构示例如下:

    ├── workspace
    │   ├── bin 
    │   ├── data                          
    │   ├── dump
    │   ├── model
    │   └── acl_xxxxxxxx.json     
    

性能仿真

命令行格式说明

性能仿真的命令行格式

mindcmd app perfsim -m OM -i IMAGE_LIST -ddr DDR_R_LATENCY ...

命令行参数说明如表1所示

说明:

命令行中的app、perfsim、--ddr子命令存在父子关系,因此输入需满足先后顺序。

表 1 性能仿真命令行参数说明

参数

必选/可选

描述

perfsim

必选

指定执行性能仿真。

-h, --help

可选

性能仿真子命令help信息,eg. mindcmd app perfsim -h。

-m, --om

必选

离线模型文件 *.om。

–i, --image_list

必选

指定推理数据,以txt文本传入,txt文件内每行文本内容为推理数据的路径,当前仅支持.bin后缀的推理数据。

-k, --work_dir

可选

指定工作路径,否则使用表1中配置的默认工作路径。

-t, --recurrent_max_total_t

可选

指定Recurrent网络(包含LSTM/RNN/GRU层)每一句话的最大帧数,用于板端运行时分配输入内存。与-b互斥。

-r, --rpndata

可选

指定rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且不执行AMCT和GT。

指定多个rpn文件时使用双引号""包含,并用分号;作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量,多输入模型只需指定一个值,如 --batch_num=32。与-t互斥。

--output

可选

指定性能仿真结果存放路径,默认将性能结果输出到 ${work_dir}/profiling中,将推理结果输出到${work_dir}/dump中。

-ddr

可选

指定 ddr_r_latency 的值,即模拟读指令的时候,发生Cache Miss的场景下,需要额外等待的Cycle数,默认为100,取值范围 [1, 1000000000]。

说明:

  • 性能仿真不支持dump,因此进行性能仿真的om模型需为不配置dump的模型,参见《ATC工具使用指南》"3.3.1.2 --online_model_type" 中关于配置dump的描述。
  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 模型和数据准备

    参考目录结构如下:

    ├── test_case
    │  ├── resnet50
    │  │   └── resnet50.om
    │  ├── data
    │  │   ├── dog1_shape_1_3_224_224_uint8.bin
    │  │   ├── dog2_shape_1_3_224_224_uint8.bin
    │  │   └── image_ref_list.txt
    
  • 配置默认工作路径(可选)

    使用mindcmd.ini文件[base_config] section 下配置的默认工作路径,或通过命令行参数-k/--work_dir指定工作路径。

    [base_config]
    DEFAULT_WORKSPACE=/home/MindCmdUser/workspace/
    
  • 执行性能仿真

    执行以下命令进行性能仿真:

    cd test_case
    mindcmd app perfsim -m ./resnet50/resnet50.om -i ./data/image_ref_list.txt -ddr 1000
    
  • 执行结果

    性能仿真执行结果保存在工作路径下,主要目录结构示例如下:

    ├── workspace
    │   ├── bin 
    │   ├── data
    │   ├── dump                        
    │   ├── profiling
    │   │   └──sim_perf_xxxxxxxx 
    │   │        └── sim_perf_{ddr_r_latency}.csv     
    │   ├── model
    │   └── acl_xxxxxxxx.json     
    

上板推理

命令行格式说明

上板推理的命令行格式如下:

mindcmd app npu -s SSH_CONFIG -m OM -i IMAGE_LIST {dump,profile} …

命令行参数说明如表1所示。

说明:

命令行中的app、npu、{dump,profile}子命令存在父子关系,因此输入需满足先后顺序。

表 1 上板推理命令行参数说明

参数

必选/可选

描述

npu

必选

指定执行上板推理。

-h, --help

可选

上板推理子命令help信息,eg. mindcmd app npu -h。

-m, --om

必选

指定离线模型文件(*.om)。

–i, --image_list

必选

指定推理数据,以txt文本传入,txt文件内每行文本内容为推理数据的路径,当前仅支持.bin后缀的推理数据。

-k, --work_dir

可选

指定工作路径,否则使用表1中配置的默认工作路径。上板推理要求工作路径必须在HOST_MOUNT_PATH下。

-t, --recurrent_max_total_t

可选

指定Recurrent网络(包含LSTM/RNN/GRU层)每一句话的最大帧数,用于板端运行时分配输入内存。与-b互斥。

-r, --rpndata

可选

指定rpn文件(.txt),当模型包含rpn硬化层时,此参数要求必传,且不执行AMCT和GT。

指定多个rpn文件时使用双引号""包含,并用分号;作为分割,如 --rpndata="/home/MindCmdUser/rpn1.txt;/home/MindCmdUser/rpn2.txt"。

-b, --batch_num

可选

指定多batch模型的batch数量,多输入模型只需指定一个值,如 --batch_num=32。与-t互斥。

-s, --ssh_config

可选

指定板端ssh挂载配置文件。ssh挂载需先进行NFS环境搭建,可参考NFS环境搭建。

ssh挂载配置文件的模板,可参考ssh.cfg文件配置。

--output

可选

指定推理结果存放路径,默认为 ${work_dir}/dump。当同时指定子命令中的--output命令时,以子命令的--output为准。

dump

可选

上板dump模型中间结果开关,与profile互斥。如果指定此子命令表示开启dump,将根据-m/--om指定的离线模型文件生成包含dump配置的acl.json文件。默认关闭dump功能。

支持自定义dump配置,详见此表格中dump子命令参数说明。

profile

可选

上板Profiling数据采集开关,与dump互斥。如果指定此子命令表示开启Profiling,将根据-m/--om指定的离线模型文件生成包含Profiling配置的acl.json文件。默认关闭Profiling功能。

支持自定义Profiling配置,详见此表格中Profiling子命令参数说明。

dump 子命令

--output

可选

指定dump结果存放路径,默认为 ${work_dir}/dump。

--dump_list

可选

指定想要dump的层。如果指定多层,请使用空格作为分割 eg. --dump_list conv1 pool1。不指定--dump_list时,默认dump所有层。

-h, --help

可选

dump子命令help信息,eg. mindcmd app npu dump -h。

profile 子命令

--interval

可选

设置interval num 在acl.json上,默认为10。

--acl_api

可选

设置是否开启acl_api在acl.json上,默认为on。

--aicpu

可选

设置是否开启aicpu在acl.json上,默认为on。

--switch

可选

设置是否开启switch在acl.json上,默认为on。

--aic_metrics

可选

设置aic_metrics在acl.json上,默认为ArithmeticUtilization。

--output

可选

设置生成job的输出路径。

-h, --help

可选

profile子命令help信息,eg. mindcmd app npu profile -h。

说明:

  • 参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。
  • 当-i/--image_list指定图片列表的时候,图片列表的内容支持UTF-8编码的中文路径。

执行样例

  • 模型和数据准备

    参考目录结构如下:

    ├── test_case
    │  ├── ssh.cfg
    │  ├── resnet50
    │  │   └── resnet50.om
    │  ├── data
    │  │   ├── dog1_shape_1_3_224_224_uint8.bin
    │  │   ├── dog2_shape_1_3_224_224_uint8.bin
    │  │   └── image_ref_list.txt
    
  • 配置默认工作路径(可选)

    使用全局配置文件[base_config] section 下配置的默认工作路径,或通过命令行参数-k/--work_dir指定工作路径。

    [base_config]
    DEFAULT_WORKSPACE=/home/MindCmdUser/workspace/
    
  • 准备ssh.cfg文件,参考ssh.cfg文件配置

    ssh.cfg文件配置优先级如下:-s/--ssh_config参数配置 > mindcmd.ini中的全局配置(SSH_CFG_PATH)。

  • 执行上板推理(以开启dump为例)

    执行以下命令进行上板推理:

    cd test_case
    mindcmd app npu -m ./resnet50/resnet50.om -i ./image_ref_list.txt dump
    
  • 执行结果

    上板推理结果保存在工作路径下,主要目录结构示例如下:

    ├── workspace
    │   ├── bin
    │   ├── data                          
    │   ├── dump
    │   ├── model
    │   ├── project.cfg
    │   └── acl_xxxxxxxx.json   
    

精度比对

功能介绍

该功能将自有模型算子的运算结果与标准算子的运算结果进行比对,以便确认误差发生的算子,目前提供的比对指标有:余弦相似度、最大绝对误差、累计相对误差、相对欧几里德距离、KL散度、标准偏差等。

命令行格式说明

精度比对的命令行格式如下:

mindcmd compare -l MY_DUMP_PATH -r GOLDEN_DUMP_PATH 

命令行参数说明如表1所示。

表 1 精度比对命令行参数说明

参数

必选/可选

描述

-l, --left

必选

待比对数据路径,包含.timestamp、.float、.dump数据或.npy数据。

-r, --right

必选

数据标准路径,包含.timestamp、.float、.dump数据或.npy数据。

-out

可选

精度比对结果输出路径。

-q, --quant

可选

模型小型化后的量化融合规则文件(json文件)。

-om

可选

量化离线模型文件(*.om)。

-name, --output_name

可选

输出文件名。

-op, --op_name

可选

单算子比对的算子名。

-o, --output_tensor

可选

比对指定index的output数据。配置-op时有效。

未配置时,默认比对output数据的index为0的数据。

-h, --help

可选

精度比对子命令help信息。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

精度比对场景

在mindcmd一键推理中,精度比对按照Ground Truth、Fake Quant、Real Quant、Function Simulator、Instruction Simulator、NPU的顺序,将不同场景下的推理数据进行两两比对。

表 1 精度比对数据说明

比对数据

描述

Ground Truth

Caffe/ONNX/PyTorch算子的运算结果

Fake Quant

伪量化算子的运算结果

Real Quant

真量化算子的运算结果

Function Simulator

功能仿真的运算结果

Instruction Simulator

指令仿真的运算结果

NPU

板端的运算结果

由于模型压缩和模型转换的过程中对模型进行了优化,包括算子消除、算子融合、算子拆分等操作。可能导致整网比对时找不到正确的文件进行比对。因此,部分场景需要额外传入离线模型文件和量化融合规则文件。具体场景如表2所示。

表 2 精度比对场景

场景

比对数据

比对数据

离线模型文件/量化融合规则文件

1

Ground Truth

Fake Quant / Real Quant

模型压缩的量化融合规则文件(json文件)

2

Ground Truth

Function Simulator / Instruction Simulator/ NPU

量化离线模型文件(*.om)

模型压缩的量化融合规则文件(json文件)

3

Fake Quant / Real Quant

Function Simulator / Instruction Simulator/ NPU

量化离线模型文件(*.om)

执行样例

Hi3519DV500执行样例

  • dump数据准备

    参考目录结构如下:

    ├── compare_resource
    │   ├── func_dump # 功能仿真dump文件所在目录
    │   └── npu_dump  # 上板推理dump文件所在目录
    
  • 执行精度比对

    执行以下命令进行精度比对:

    cd compare_resource
    mindcmd compare -l ./npu_dump/ -r ./func_dump -out ./compare_output/
    
  • 执行结果

    精度比对执行结束后会在指定输出路径中生成对应csv文件,主要文件结构示例如下:

    ├── compare_output
    │   └── result_20221008101324.csv       # result_{时间戳}.csv
    

    文件内容如图1所示数据,参数说明请参考《精度比对工具使用指南》。

    控制台会展示精度比对简易的执行结果,如图2。

    图 1 精度比对执行结果

    图 2 精度比对执行结果展示

Hi3516CV610执行样例

  • 比对数据准备

    精度比对数据可以通过一键推理生成,以工具内置的模型为例:

    1. 开启一键推理dump配置。

      mindcmd config -g oneclick_switch.is_dump_open=1
      
    2. 开启开源框架推理、模型压缩、功能仿真、性能仿真、上板推理配置。

      mindcmd config -g oneclick_switch.is_gt_run=1
      mindcmd config -g oneclick_switch.is_amct_run=1
      mindcmd config -g oneclick_switch.is_func_run=1
      mindcmd config -g oneclick_switch.is_inst_run=1
      mindcmd config -g oneclick_switch.is_npu_run=1
      
    3. 执行一键推理,生成精度比对数据文件。

      mindcmd oneclick pytorch -m mindcmd.testcase.pooling.Model --input_shape 1,3,224,224
      

      精度比对结果生成在{MindCmd-WorkSpace}/mindcmd.testcase.pooling.Model_xxx/output/project_xxx/dump,如图3所示。

      图 3 一键推理dump数据

  • 精度比对

    精度比对可以分为整网比对,单文件比对和单算子比对三种:

    1. 整网比对

      整网比对可以比对整个网络每一层的结果,具体如下:

      mindcmd compare -l dump/float/ -r dump/fake_quant/
      

      比对结果如图4所示,整网比对还会将比对结果保存为csv文件如图5所示,参数含义如表1所示。

      图 4 整网比对结果

      图 5 整网比对执行结果文件

    2. 单文件比对

      单文件比对可以指定对比的具体文件,具体如下:

      mindcmd compare -l dump/float/ -r dump/fake_quant/
      

      比对结果如图6所示。

      图 6 单文件比对结果

    3. 单算子比对

      单算子比对可以指定具体比对的层名,具体如下:

      mindcmd compare -l dump/float/ -r dump/fake_quant/ -op pool
      

      比对结果如图7所示。

      图 7 单算子比对结果

      表 1 输出参数说明

      参数

      说明

      LeftOp

      表示-l/--left参数指定的文件对应的算子名

      RightOp

      表示-r/--right参数指定的文件对应的算子名

      TensorIndex

      表示算子的output ID

      CosineSimilarity

      进行余弦相似度算法比对出来的结果,范围是[-1,1],比对的结果如果越接近1,表示两者的值越相近,越接近-1意味着两者的值越相反。

      MaxAbsolute

      进行最大绝对误差算法比对出来的结果,取值范围是 0 到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。

      AccumulatedRelativeError

      进行累积相对误差算法比对出来的结果,取值范围是 0 到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。

      RelativeEuclideanDistance

      进行欧氏相对距离算法比对出来的结果,取值范围是 0 到无穷大,值越接近于0,表明越相近,值越大,表明差距越大。

      KullbackLeiblerDivergence

      进行KLD散度算法比对出来的结果,取值范围是 0 到无穷大。KL 散度越小,真实分布与近似分布之间的匹配越好。

      StandardDeviation

      进行标准差算法比对出来的结果,取值范围:0到无穷大。标准差越小,离散度越小,表明越接近平均值。该列显示My Output和Ground Truth两组数据的均值和标准差,第一组展示My Output模型dump数据的数值(均值;标准差),第二组展示Ground Truth模型dump数据的数值(均值;标准差)。

      CompareFailReason

      算子无法比对的原因

      备注:

      • 显示“*”,表示新增的算子、无对应的原始算子;“NaN”表示无比对结果。
      • 余弦相似度和KLD散度比较结果为NaN,其他算法有比较数据,则表明左侧或右侧数据为0;KLD散度比较结果为inf,表明右侧数据有一个为0;比对结果为nan,表示dump数据有nan。

数据格式说明

精度比对功能支持.bin、.timestamp、.float、.dump数据或.npy数据。数据文件的命名格式应满足表1要求。

表 1 数据文件命名规则

数据类型

数据命名格式

备注

以时间戳结尾的dump数据

{op_type}.{op_name}.{output_index}.{timestamp}

命名格式说明:op_type、op_name对应的名称需满足“A-Za-z0-9_-”正则表达式规则,以时间戳结尾的dump数据timestamp为12位时间戳,其余为16位。output_index、task_id、stream_id为0~9数字组成。

以dump/bin/float/npy结尾的dump数据

{op_name}.{output_index}.{timestamp}.{dump/bin/float/npy}

{op_name}_output{index}[A-Za-z0-9-_.].float

性能分析

功能介绍

该功能用于分析SOC上的推理业务各个运行阶段的关键性能指标,用户可根据输出的性能数据针对关键性能瓶颈做出优化以实现产品的极致性能。

该功能对硬件和软件性能数据的采集和展示包括以下内容:

硬件:AI Core、AI Vector Core等模块的PMU指标及系统硬件性能指标。

软件:ACL等模块的性能指标数据。

说明:

MindCmd性能分析工具不支持优先级抢占场景的Profiling数据解析。

命令行格式说明

Profile包含merge、show、collect三种操作。

  • merge操作将板端收集到的数据进行解析,导出timeline数据、summary数据、event view数据。

    merge的命令行格式如下:

    mindcmd profile merge -d COLLECTION_PATH 
    

    命令行参数说明如表1所示。

    表 1 性能数据解析命令行参数说明

    参数

    必选/可选

    描述

    merge

    必选

    性能数据解析。

    -d

    必选

    采集的job数据存放目录。

    -f

    可选

    结果保存格式[csv,json],默认csv。timeline数据固定为json格式。

    -h, --help

    可选

    性能数据解析子命令help信息,eg: mindcmd profile merge -h。

  • show操作将解析结果进行展示。

    show的命令行格式如下:

    mindcmd profile show -d COLLECTION_PATH 
    

    命令行参数说明如表2所示。

    表 2 性能数据展示命令行参数说明

    参数

    必选/可选

    描述

    show

    必选

    性能数据展示

    -d

    必选

    采集的job数据存放目录。

    -h, --help

    可选

    性能数据展示解析子命令help信息,eg: mindcmd profile show -h。

  • collect操作自动采集性能原始数据,并解析。

    collect的命令行格式如下:

    mindcmd profile collect -m MIAN -s SSH_CONFIG
    

    命令行参数说明如表3所示。

    表 3 性能数据采集命令行参数说明

    参数

    必选/可选

    描述

    collect

    必选

    性能数据采集。

    -m

    必选

    上板执行项目中的可执行文件main或执行命令。如: -m main或-m "main -xx"

    -s

    可选

    ssh配置文件的路径,具体配置内容见ssh.cfg文件配置。

    --interval

    可选

    设置interval num 在acl.json上,默认为0

    --acl_api

    可选

    设置是否开启acl_api在acl.json上,默认为on

    --aicpu

    可选

    设置是否开启aicpu在acl.json上,默认为on

    --switch

    可选

    设置是否开启switch在acl.json上,默认为on

    --aic_metrics

    可选

    设置aic_metrics在acl.json上,默认为ArithmeticUtilization

    --output

    可选

    设置生成job的输出路径

    -h, --help

    可选

    性能数据采集子命令help信息,eg: mindcmd profile collect -h。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

执行样例

  • 模型和数据准备

    性能分析前需要准备相应的性能文件,所准备的文件结构可参考如下:

    ├── profile_resource
    │   ├── JOBXXXXXXXX
    │   │   ├── data
    │   │   └── info.json.0
    
  • 执行性能分析

    执行以下命令进行性能分析:

    cd profile_resource
    mindcmd profile merge -d ./JOBXXXXXXXX
    

    性能分析执行结束后会在默认工作路径/home/MindCmdUser/profile_resource/JOBXXXXXXXX中生成数据,主要文件结构示例如下:

    ├── profile_resource
    │  ├── JOBXXXXXXXX
    │  │   ├── data
    │  │   ├── eventview
    │  │   ├── log
    │  │   ├── sqlite
    │  │   ├── summary
    │  │   ├── timeline
    │  │   └── info.json.0 
    
  • 执行性能分析展示

    执行以下命令进行性能分析展示:

    cd profile_resource
    mindcmd profile show -d ./JOBXXXXXXXX
    

    控制台展示AI Core Metrics、Op statistic、 Acl statistic数据 ,如图1,耗时最高的5个数据将高亮显示。具体结果可参考“性能分析数据说明”章节。

    图 1 AI Core Metrics展示图

  • 执行性能数据采集

    1. 文件准备

      请预先准备工程,主要工程目录及文件如下(以新建ACL ResNet50为例):

      ├── 工程名
      │   ├── .idea                     //IntelliJ IDEA自动创建的,用于存放项目的配置信息。  
      │   ├── build  
      │   │    ├──cmake                //存放cmake依赖文件
      │   ├── data                      //存放data示例 
      │   ├── inc  
      │   │    ├── model_process.h     //声明模型处理相关函数的头文件  
      │   │    ├── sample_process.h    //声明资源初始化/销毁相关函数的头文件  
      │   │    ├── utils.h             //声明公共函数(例如:文件读取函数)的头文件  
      │   ├── out                       //存放编译出的可执行文件  
      │   │    ├── main                
      │   ├── src  
      │   │    ├── acl.json            //系统初始化的配置文件  
      │   │    ├── CMakeLists.txt      //编译脚本  
      │   │    ├── main.cpp            //主函数,图片分类功能的实现文件 
      │   │    ├── model_process.cpp   //模型处理相关函数的实现文件  
      │   │    ├── sample_process.cpp  //资源初始化/销毁相关函数的实现文件  
      │   │    ├── utils.cpp           //公共函数(例如:文件读取函数)的实现文件 
      │   ├── .project                  //工程信息文件,包含工程类型、工程描述、运行目标设备类型、CANN版本号等  
      │   ├── CMakeLists.txt            //编译脚本,调用src目录下的CMakeLists文件
      

      其中,main文件是根据工程编译的板端可执行文件。

    2. 执行以下命令进行性能数据采集:

      mindcmd profile collect -m MAIN
      

      注意:

      命令中MAIN表示工程中main文件的路径。

    3. 执行结果

      性能数据采集执行结束后会在上板项目目录下的profiling文件夹生成数据,主要文件结构示例如下:

      ├── project
      │  ├──profiling
      │  │   ├── JOBXXXXXXXX
      │  │   │   ├── data
      │  │   │   ├── log
      │  │   │   ├── sqlite
      │  │   │   ├── summary
      │  │   │   ├── timeline
      │  │   │   └── info.json.0
      

性能分析数据说明

说明:

本章节Hi3519DV500不支持。

timeline 数据说明

使用merge命令导出timeline数据,参见merge命令格式说明

命令执行后会在-d目录下生成timeline目录,不同的数据生成对应的json文件,具体内容参见表1。

表 1 timeline文件介绍

文件数据分类

timeline文件名

说明

Task Timeline解析生成数据

task_time_{deviceid}.{model_file_name}.{model_id}.{batch_num}.json

Task Scheduler任务调度信息。文件详情请参见“Task Scheduler任务调度信息数据说明”。

ACL Timeline解析生成数据

acl_{device_id}.{model_file_name}.{model_id}.{batch_num}.json

ACL接口耗时数据,生成该文件需要采集的Profiling数据中包含AclModule.开头的文件。文件详情请参见“ACL接口耗时数据说明”。

说明:

  • timeline目录中的文件是根据采集的实际Profiling数据进行生成,如果实际的Profiling数据没有相关的数据文件,就不会导出对应的timeline数据。
  • 生成的json(chrome trace)文件可以通过以下方式打开查看:在Chrome浏览器中输 入chrome://tracing地址,然后将落盘文件拖到空白处即可打开文件内容。下文中文件介绍均使用此种形式。关于chrome trace的格式,可参考“chrome trace介绍”。
  • 导出的数据中涉及到的时间节点(非Timestamp)为系统单调时间,只与系统有关,非真实时间。
Task Scheduler任务调度信息数据说明

Task Scheduler任务调度信息数据文件:task_time_{deviceid}.{model_file_name}.{model_id}.{batch_num}.json,其中{device_id}表示设备ID,{model_file_name}表示模型名称,{model_id}表示模型ID,{batch_num}表示batch的数量。

task_time_{deviceid}.{model_file_name}.{model_id}.{batch_num}.json在Chrome浏览器中展示如图1所示。

图 1 Chrome浏览器展示图

ACL接口耗时数据文件关键字段说明如表1所示。

表 1 字段说明

字段名

字段含义

name

层名,如果是融合层则连接在一起

pid

Process Id缩写

tid

Thread Id缩写

ts

Time Start的缩写,用于计算起始时间

dur

Duration Time的缩写,用于计算结束时间

args->Task Type

运行单元,如AI CORE,AI CPU

args->Stream Id

Stream ID,默认为0

args->Task Id

运行顺序index值,从0开始

ph

chrome-trace依赖字段,等于M时忽略此段数据,等于X时显示该段数据

ACL接口耗时数据说明

ACL接口耗时数据文件:acl_{deviceid}.{model_file_name}.{model_id}.{batch_num}.json,其中{device_id}表示设备ID,{model_file_name}表示模型名称,{model_id}表示模型ID,{batch_num}表示batch的数量。

acl_{deviceid}.{model_file_name}.{model_id}.{batch_num}.json在Chrome浏览器中展示如图1所示。

图 1 Chrome浏览器展示图

关键字段说明如表1所示。

表 1 字段说明

字段名

字段含义

Title

选择某个组件的接口名称,例如本例选择的为Thread 132397的aclmdlQuerySize接口。

Start

显示界面中时间轴上的时刻点,chrome trace自动对齐。

Wall Duration

表示当前接口调用耗时,单位ms。

Mode

API类型。

Process_Id

ACL API所在进程ID。

Thread_Id

ACL API所在线程ID。

summary数据说明

使用merge命令导出summary数据,参见merge命令格式说明

meger命令执行后会在-d目录下生成summary目录,不同的数据(推理,系统)生成对应的csv文件,具体内容参见表1。

表 1 summary文件介绍

文件数据分类

summary文件名

说明

AI Core Metrices

op_summary_{device_id}.{model_file_name}.{model_id}.{batch_num}.{input_pic_num}.{current_pic_count}.{icache_miss_rate}.{frequency}.csv

每个Core上指令占比数据,生成该csv文件需要采集的Profiling数据中包含aicore.开头的文件,该文件作为界面展示的输入文件。

Statistics-ACL API

acl_statistic_{device_id}_{model_id}_{iter_id}.csv

在Statistics中统计所有ACL API的耗时及与相同API的调用平均耗时、最大耗时、最小耗时的对比结果。

Statistics-Ops

op_statistic_{device_id}_{model_id}_{current_pic_count}_{iter_id}.csv

在Statistics中统计所有layer的运行耗时及与相同layer的调用平均耗时、最大耗时、最小耗时的对比结果。

说明:

  • summary目录中的文件是根据采集的实际Profiling数据进行生成,如果实际的Profiling数据没有相关的数据文件,就不会导出对应的summary的数据。
  • 小技巧:生成的summary数据文件使用excel打开时,会出现字段值为科学计数的情况,例如“1.00159E+12”。此时可选中该单元格,然后右键>设置单元格格式,在弹出的对话框中“数字”标签下选择“数值”,单击“确定”就能正常显示。
  • 生成的summary数据文件中某些字段值为N/A时,表示此时该值不存在。
  • 导出的数据中涉及到的时间节点(非Timestamp)为系统单调时间,只与系统有关,非真实时间。
ACL接口调用次数及耗时数据说明

ACL接口调用次数及耗时数据acl_statistic_{device_id}_{model_id}_{iter_id}.csv,其中{device_id}表示设备ID,{model_id}表示模型ID,{iter_id}表示某轮迭代的ID号。

acl_statistic_{device_id}_{model_id}_{iter_id}.csv文件内容格式示例如图1所示。

图 1 csv文件内容

导出的ACL接口耗时数据表文件列说明如表1所示。

表 1 字段说明

参数名

参数解释

Process ID

对应调用API所在进程ID。

Thread ID

对应调用API所在线程ID。

Type

调用ACL API的xxx类型,如model,runtime。

Name

对应调用API名称。

Total Time Ratio(%)

对应调用API总时间占比。

Total Time(us)

对应调用API时间长度,单位为us。可以点击字段旁边的三角号根据此项进行降序或升序排列。

Count

对应API调用次数。

Avg(us)

对应API单次调用平均时间,单位为us。

Max(us)

对应API单次调用最长时间,单位为us。

Min(us)

对应API单次调用最短时间,单位为us。

AI Core数据说明

AI Core数据op_summary_{device_id}.{model_file_name}.{model_id}.{batch_num}.{input_pic_num}.{current_pic_count}.{icache_miss_rate}.{frequency}.csv,其中{device_id}表示设备ID,{model_file_name}表示模型名称,{model_id}表示模型ID,{batch_num}表示batch次数,{input_pic_num}表示输入图片总数,{current_pic_count}表示当前推理起始帧序号,{icache_miss_rate}表示icache的损失率,{frequency}表示频率。

  • 整网场景op_summary_{device_id}.{model_file_name}.{model_id}.{batch_num}.{input_pic_num}.{current_pic_count}.{icache_miss_rate}.{frequency}.csv文件内容格式示例(示例仅展示部分参数,详情请参见表1)如图1所示。

    图 1 csv文件内容

    导出的AI Core数据表文件列说明如表1。

    表 1 字段说明

    字段名

    字段解释

    Task ID

    Task ID自增

    Layer ID

    层id

    Ori Layer Name

    原始层名

    Layer Name

    层名

    Layer Type

    层类型

    Time(us)

    当前层耗时

    Time Ratio

    当前层耗时在总耗时的百分比

    Mac Busy Ratio

    代表cube类型指令(矩阵类运算指令)占当前层总耗时的百分比。

    Mac Ppen Ratio

    代表cube类型指令有效工作时间(矩阵类运算指令)占当前层总耗时的百分比。

    Vec Busy Ratio

    代表vector类型指令(向量类运算指令)占当前层总耗时的百分比。

    Vec Ppen Ratio

    代表vector类型指令有效工作时间(向量类运算指令)占当前层总耗时的百分比。

    Dstr Ratio

    全称为data store ratio,代表数据保存,将内部数据写到外部DDR的内存搬移过程中占当前层总耗时的百分比。

    Dtrans Ratio

    全称为internal data transfer and transform ratio,代表数据搬移,主要是从RAM到RAM搬移,并实现各种形变在内存搬移过程中占当前层总耗时的百分比。

    DLD Ratio

    全称为data_loading_ratio,代表image和featuremap加载过程中占当前层总耗时的百分比。

    WLD Ratio

    全称为weight_loading_ratio,代表权重加载过程中占当前层总耗时的百分比。

    Memory Bound

    用于识别AI Core执行算子计算过程是否存在Memory瓶颈,由max(Dstr Ratio, DLD Ratio, WLD Ratio)/max(Mac Busy Ratio, Vec Ppen Ratio)计算得出。计算结果小于1,表示没有Memory瓶颈;计算结果大于1则表示有Memory瓶颈,且数值越大越瓶颈严重。

    DDR Read(byte)

    ddr读byte数

    DDR Write(byte)

    ddr写byte数

    DDR Total(byte)

    ddr读写带宽之和

说明:

算子的输入维度Input Shapes取值为空,即表示为“; ; ; ;”格式时,表示当前输入的为标量,其中“;”为每个维度的分隔符。算子的输出维度同理。 性能数据中"-"代表的是total层的数据信息

AI Core算子调用次数及耗时数据说明

AI Core算子调用次数及耗时数据op_statistic_{device_id}_{model_id}_{current_pic_count}_{iter_id}.csv,其中{device_id}表示设备ID,{model_id}表示模型ID,{current_pic_count}表示当前图片数,{iter_id}表示某轮迭代的ID号。

整网场景op_statistic_{device_id}_{model_id}_{current_pic_count}_{iter_id}.csv文件内容格式示例如图1所示。

图 1 csv文件内容

导出的AI Core算子调用次数及耗时数据表说明如表1所示。

表 1 字段说明

字段名

字段解释

Task ID

Task ID自增

Stream ID

对应调用OP所在Stream ID。

OP Type

OPs的算子名称。

Task Type

描述是AI_CORE还是AI_CPU

Total Time Ratio(%)

对应调用OP总时间占比。

Total Time(us)

对应调用OP时间长度,单位为us。可以点击字段旁边的三角号根据此项进行降序或升序排列。

Count

对应OP调用次数。

Avg(us)

对应OP单次调用平均时间,单位为us。

Max(us)

对应OP单次调用最长时间,单位为us。

Min(us)

对应OP单次调用最短时间,单位为us。

eventview数据说明

使用merge命令导出eventview数据,参见merge命令格式说明

命令执行后会在-d目录下生成eventview目录,eventview文件命名eventview_{device_id}.{model_name}.{model_id}.{batch_num}.csv。

表 1 字段说明

参数名

参数解释

ID

Index顺序

Device ID

Device ID

Op Name

层名,如果是融合层则连接在一起

Start Time(us)

起始时间

End Time(us)

结束时间

Duration(us)

持续时间

Status

运行状态

Task Type

运行单元,如AI_CORE,AICPU

Stream ID

Stream ID,默认取0

Task ID

总体运行顺序index值,从0开始,包括AI Core Task,AI CPU Task,System Task

性能分析样例参考

说明:

本章节内容Hi3519DV500不支持。

网络应用中的函数计算性能优化分析样例

背景介绍

使用PyTorch网络应用在SoC执行推理过程中,发现整体执行时间较长。为了找出原因,使用Profile性能分析工具对该网络应用执行推理耗时分析,分析结果显示运行的接口svp_acl_mdl_execute执行耗时数值较高,进一步分析结果发现Conv算子执行时间最长。因此我们打开PyTorch网络转换成的om模型查询Conv算子,发现该算子是多个计算单元组成,这样会造成极大的推理开销。由于Conv算子所在函数为Mish激活函数,而当前SoC支持的激活函数只有:Relu、Leakyrelu、PRelu、Elu。Mish函数不在支持范围内,因此造成模型转换后的Mish函数被分解成了多个计算单元。

问题解决:我们通过将om模型中的Mish函数替换SoC的激活函数,尝试降低推理耗时,以Leakyrelu替换Mish函数为例,重新执行性能分析,结果发现推理耗时明显降低。

说明:

本文仅介绍性能分析工具的操作及分析过程,对于om模型的算子分析以及函数替换等操作此处不做阐述。

问题分析

  1. 我们打开acl_{device_id}_{model_id}_{iter_id}.json文件查看ACL接口耗时数据(数据导出和查看请参考timeline 数据说明小节)。如图1所示。

    图 1 ACL接口耗时

    此时我们可以看到ACL接口中耗时最长的时间线有两段,分别为svp_acl_mdl_load_from_mem和svp_acl_mdl_execute接口。也就是说虽然svp_acl_mdl_execute接口是在执行接口中耗时最长,但是在ACL接口中,svp_acl_mdl_execute接口耗时仅排第二。

    参见《应用开发指南》中的“SVP ACL API参考”章节查找svp_acl_mdl_load_from_mem接口的作用为“从文件加载离线模型数据”,可以分析该接口耗时取决于加载离线模型的时间,加载时间我们暂时无法进行调优。那么还需要继续从svp_acl_mdl_execute接口深入分析。

  2. 由于svp_acl_mdl_execute接口是执行接口,而模型中所有算子执行的时间总和就是执行耗时。那么我们通过打开task_time_{device_id}_{model_id}_{iter_id}.json文件查看Task Scheduler任务调度信息数据,分析执行推理过程中具体耗时较长的任务。如图2所示。

    图 2 Task Scheduler任务调度信息

    从Task Scheduler任务调度信息数据中我们可以看到,时间线中执行了大量的Conv算子(时间线过长图片无法完全展示),且每个Conv算子的执行时间都比其他算子长。

    至此我们基本可以判断拖慢应用推理过程中执行效率的因素中,Conv算子的占比较大。

  3. 为了进一步验证这个结论我们可以打开summary数据中的acl_{device_id}_{model_id}_{iter_id}.csv文件如图3所示和task_time_{device_id}_{model_id}_{iter_id}.csv文件如图4所示。可以通过表格中的自定义排序,选择Total Time(us)为主要关键字,进行降序重排表格。

    图 3 ACL接口耗时

    图 4 AI Core算子耗时数据

    根据以上三张表中数据可以判断:

    • 各个组件耗时信息数据中ACL接口的svp_acl_mdl_load_from_mem接口耗时最长;
    • ACL接口中耗时最长的时间线有两段,svp_acl_mdl_execute接口耗时排第二;
    • Task Scheduler任务调度信息数据中存在大量的Conv算子,且每个Conv算子的执行时间都较长。

    到此,Profile性能分析工具的任务已经完成。

  4. 接下来我们可以参见《ATC工具使用指南》中的“基础功能”的章节,打开PyTorch网络转换成的om模型查询Conv算子,发现该算子是多个计算单元组成,如图5所示,这样会造成极大的推理开销。

    图 5 PyTorch网络模型

  5. 我们通过查询代码发现计算单元中的Softplus、Tanh和Mul是属于Mish激活函数的计算公式,如图6所示。而当前SoC支持的激活函数只有:Relu、Leakyrelu、Prelu、Elu和Srelu。Mish函数不在支持范围内,因此造成模型转换后的Mish函数被分解成了多个计算单元。

    图 6 Mish激活函数

    解决该问题最简单的办法就是找到效率更高的替代函数。

问题解决

尝试以官方提供的Leaky Relu激活函数作为替换函数。函数替换操作请用户自行处理,此处不作阐述。完成函数替换后,重新执行做性能分析得到新的结果,我们查看图7已经从原先的23.299ms降低到现在的14.190ms,查看图8发现大多数Conv算子的时间线已经得到缩短。

图 7 ACL接口耗时

图 8 AI Core算子耗时数据

结论

通过Profile性能分析工具前后两次对网络应用推理的运行时间进行分析,并对比两次执行时间可以得出结论,替换Leaky Relu激活函数后,降低了Conv算子在应用推理的运行时间,提升了推理效率。

Tools

Caffe模型子网导出

该功能用于原始Caffe网络的剪切。

命令行格式说明

Caffe模型子网导出命令行格式如下:

mindcmd subnet -m MODEL_FILE -w WEIGHT_FILE -s START_LAYER -e END_LAYER

命令行参数说明如表1所示。

表 1 Caffe模型子网导出命令参数说明

参数

必选/可选

描述

-m, --model

必选

Caffe模型文件( .prototxt)的路径。

-w, --weight

必选

Caffe权重文件( .caffemodel)路径。

-s, --start

必选

Caffe子模型导出的开始层层名。

-e, --end

必选

Caffe子模型导出的结束层层名。

-j, --json

可选

指定模型json文件路径,不指定则自动调用ATC生成,需确保已配置ATC相关环境变量。

-o, --output

可选

子模型保存路径。

-h, --help

可选

展示命令行 help 信息。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

执行样例

  • 模型和数据准备

    子网导出前需要准备相应的Caffe模型,所准备的文件结构可参考如下:

    ├── caffe_model_split
    │   ├── resnet50
    │   │   ├── resnet50.caffemodel
    │   │   └── resnet50.prototxt
    
  • 执行模型分割

    进入MindCmd工程路径下,执行以下命令:

    cd caffe_model_split
    mindcmd subnet -m ./resnet50/resnet50.prototxt -w ./resnet50/resnet50.caffemodel -s conv1 -e pool1 -o ./split_output
    
  • 执行结果

    子网导出执行结束后会在默认工作路径中生成数据,主要文件结构示例如下:

    ├── split_output
    │   ├── dump.caffemodel            # 子模型权重
    │   └── dump.prototxt              # 子模型
    │   └── shape_1665740903824.json   # 原始模型.json
    

cmd命令转换为cfg文件

该功能用于将cmd命令转换为cfg文件保存。

命令行格式说明

cmd命令转换为cfg文件的命令行格式如下:

mindcmd cmdtrans -s CFG_SAVED_PATH -a [ARGS [ARGS ...]]

命令行参数说明如表1所示

表 1 cmd命令转cfg文件参数说明

参数

必选/可选

描述

-s, --save

必选

cfg文件保存路径。

-a, --args

必选

能够成功调用模型转换的命令行。

-h, --help

可选

展示命令行 help 信息。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

执行样例

  • 创建cfg文件保存路径,如/home/MindCmdUser/cfg_output
  • 执行cmd命令转换

    进入MindCmd工程路径下,执行以下命令:

    mindcmd cmdtrans -s /home/MindCmdUser/cfg_output/resnet50.cfg -a  --model="/home/MindCmdUser/atc_resource/caffe_resnet50/caffe/resnet50.prototxt" --weight="/home/MindCmdUser/atc_resource/caffe_resnet50/caffe/resnet50.caffemodel" --image_list="/home/MindCmdUser/atc_resource/data/npu_dog1_1024_683_uint8.bin"  --output="/home/MindCmdUser/atc_output/resnet50"
    
  • 执行结果

    cmd命令转换执行结束后会在默认工作路径/home/MindCmdUser/cfg_output/中生成resnet50.cfg文件,文件结构示例如下:

    [model] /home/MindCmdUser/atc_resource/caffe_resnet50/caffe/resnet50.prototxt
    [weight] /home/MindCmdUser/atc_resource/caffe_resnet50/caffe/resnet50.caffemodel
    [image_list] /home/MindCmdUser/atc_resource/data/npu_dog1_1024_683_uint8.bin
    [output] /home/MindCmdUser/atc_output/resnet50
    

文件格式转换

该功能可以将.bin,.float,.npy,.dump和.{时间戳}文件转换为.bin,.float,.hex和.npy文件。

命令行格式说明

文件格式转换的命令行格式如下:

mindcmd datatrans -i INPUT -f file_format

命令行参数说明如表1所示

表 1 文件格式转换参数说明

参数

必选/可选

描述

-i, --input

必选

需要转换的数据所在路径。支持后缀为.bin,.float,.npy,.dump和.{时间戳}。

-f, --file_format

必选

指定输出的数据类型 bin,float,hex和npy。

-o, --output

可选

指定输出路径,默认输出路径为输入数据所在路径下的transform子目录。

-s, --shape

可选

指定转换后的shape, 不指定默认转为(x, 1)。

-h, --help

可选

展示命令行 help 信息。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

执行样例

  • 数据准备

    性能分析前需要准备相应的caffe模型,所准备的文件结构可参考如下:

    ├── transform_resource
    │   └── data.npy
    
  • 执行文件格式转换

    进入MindCmd工程路径下,执行以下命令:

    cd transform_resource
    mindcmd datatrans -i ./data.npy -f bin -o ./transform_output
    
  • 执行结果

    文件格式转换执行结束后会在默认工作路径中生成data.bin文件。

UnInplace

该功能对模型进行uninplace处理,uninplace后仅保存不带phase或者phase为TEST的层。

命令行格式说明

uninplace处理的命令行格式如下:

mindcmd uninplace -i INPUT_FILE_PATH

命令行参数说明如表1所示。

表 1 Uninplace命令参数说明

参数

必选/可选

描述

-i, --input

必选

prototxt文件路径。

-o, --output

可选

输出路径。

-h, --help

可选

展示命令行 help 信息。

说明:

参数值格式:支持大小写字母(a-z,A-Z)、数字(0-9)、下划线(_)、中划线(-)、句点(.)。

执行样例

  • 模型和数据准备

    性能分析前需要准备相应的caffe模型,所准备的文件结构可参考如下:

    ├── uninplace_resource
    │   ├── resnet50
    │   │   └── resnet50_deploy.prototxt
    
  • 执行uninplace

    进入MindCmd工程路径下,执行以下命令:

    cd uninplace_resource
    mindcmd uninplace -i ./resnet50/resnet50_deploy.prototxt -o=./uninplace_output/resnet50_uninplace.prototxt
    
  • 执行结果

    执行结束后会在指定路径中生成resnet50_uninplace.prototxt文件。

附录

MindCmd子命令

MindCmd工具可以在任意路径下通过mindcmd命令使用,命令行如下:

mindcmd {config,oneclick,preprocess,atc,amct,gt,app,compare,profile} ...

命令参数说明如表1所示。

表 1 MindCmd子命令参数说明

参数

必选/可选

描述

oneclick

必选

使用一键推理功能,与其他功能命令互斥。

preprocess

必选

使用数据预处理功能,与其他功能命令互斥。

atc

必选

使用模型转换功能,与其他功能命令互斥。

amct

必选

使用模型压缩功能,与其他功能命令互斥。

gt

必选

使用开源框架推理功能,与其他功能命令互斥。

app

必选

使用应用工程功能,包括功能仿真、指令仿真和上板推理,与其他功能命令互斥。

compare

必选

使用精度比对功能,与其他功能命令互斥。

profile

必选

使用性能分析功能,与其他功能命令互斥。

subnet

必选

使用原始Caffe模型子网导出功能,与其他功能命令互斥。

cmdtrans

必选

使用cmd命令转换功能,与其他功能命令互斥。

datatrans

必选

使用文件格式转换功能,与其他功能命令互斥。

uninplace

必选

使用UnInplace功能,与其他功能命令互斥。

config

可选

展示mindcmd.ini路径和配置内容,与其他功能命令互斥。eg. mindcmd config --list。

-v, --version

可选

展示版本信息。

-h, --help

可选

展示命令行 help 信息,eg. mindcmd -h。

NFS环境搭建

  1. 在Host侧安装NFS软件包

    执行以下命令安装NFS服务器和NFS客户端

    sudo apt-get install nfs-kernel-server 
    sudo apt-get install nfs-common 
    
  2. 在Host侧新建共享目录${SHARE_DIR},并为该目录设置权限,参考:

    sudo mkdir ${SHARE_DIR}  # 若使用已有目录作为共享目录,此命令不执行
    sudo chmod -R 777 ${SHARE_DIR} 
    sudo chown user:group ${SHARE_DIR} -R     # user用户,group为用户组,-R 表示递归更改该目录下所有文件
    
  3. 在Host侧添加NFS共享目录

    sudo vim /etc/exports 
    

    在该文件末尾添加下面一行内容,用于把${SHARE_DIR}添加到NFS共享目录。请将其中的${SHARE_DIR}替换为实际需要共享的目录:

    ${SHARE_DIR} *(rw,sync,no_root_squash,no_subtree_check)     # * 表示允许任何网段 IP 的系统访问该 NFS 目录
    

    说明:

    请设置安全权限范围的目录作为SHARE_DIR,避免mount提权风险。

  4. 在Host侧启动NFS服务

    可参考以下两条命令

    sudo /etc/init.d/nfs-kernel-server start
    sudo /etc/init.d/nfs-kernel-server restart
    
  5. 测试NFS环境是否成功搭建

    在板端上参考以下命令进行挂载

    mount -t nfs x.x.x.x:${SHARE_DIR} /home/MindCmdUser/board_workspace -o nolock
    

    在板端上执行以下命令进行卸载

    umount /home/MindCmdUser/board_workspace 
    

说明:

${SHARE_DIR}表示NFS共享路径,其与工作路径、挂载路径、数据卷路径的关联关系详见关于工作路径、挂载路径、数据卷路径和NFS共享路径。

ssh.cfg文件配置

工具运行上板推理需要指定此文件,用于描述板端IP、板端挂载路径、服务器挂载路径等信息,文件格式和详细内容如下:

[ssh_config]
# board ip
BOARD_IP=x.x.x.x

# board work directory, automatically mount to $HOST_MOUNT_PATH
BOARD_MOUNT_PATH=/home/MindCmdUser/board_workspace/

# local host ip
HOST_IP=x.x.x.x

# board work directory
# to avoid bottlenecks caused by copying test resources, store test resources in this path as much as possible.
HOST_MOUNT_PATH=${SHARE_DIR}/host_workspace

# board user name
USER=${username}

# board user's password
PASSWORD=${password}

# default port is 22
PORT=22

ssh.cfg配置文件路径可写入MindCmd全局配置文件的SSH_CFG_PATH配置项,或作为工具命令行参数--ssh_config的值。

说明:

  • MindCmd工具上板推理时会根据以上配置文件提供的信息,自动执行mount、umount操作。
  • HOST_MOUNT_PATH配置的路径不能超出2所配置的NFS共享目录范围,否则可能会导致mount失败。
  • 示例中的${SHARE_DIR}、${username}、${password}请根据实际情况替换。
  • 板端ssh环境搭建请参考《驱动和开发环境安装指南》“OpenSSH服务搭建”章节。
  • HOST_IP 如果未进行配置,MindCmd读取本机的默认IP地址,在多网络环境或Docker容器中使用时,需配置为与板端通信的本机IP地址。

数据预处理配置文件样例

自定义输入数据的预处理方式需要指定此文件,创建inset_op.cfg配置文件,文件格式和内容参考如下:

aipp_op { 
    related_input_rank : 0
    aipp_mode : static
    input_format : BGR_PLANAR
    model_format : BGR
    mean_chn_0 : 0
    mean_chn_1 : 0
    mean_chn_2 : 0
    var_reci_chn_0 : 1.0
    var_reci_chn_1 : 1.0
    var_reci_chn_2 : 1.0
}

说明:

  • MindCmd工具当前只支持静态AIPP。
  • 以上配置内容仅供参考,实际使用请根据输入数据以及预处理方式进行调整。
  • 数据预处理完整配置方式请参考《ATC工具使用指南》“--insert_op_conf” 章节。

Docker容器中使用MindCmd

当在 Docker 容器内运行 MindCmd 挂载板端时,容器内分配的是一个不对外网暴露的虚拟IP(如172.17.0.2),因此会导致在 Docker 内无法执行上板操作。为解决该问题,本章节提供在Docker容器中使用MindCmd的方法供用户参考。

  1. 挂载数据卷

    请参考《驱动和开发环境安装指南》“通过Dockerfile构建镜像”章节构建解决方案镜像。

    Docker容器无法直接mount文件资源到板端,所以在创建容器时,需挂载宿主机的一个目录作为资源共享路径,所以必须添加-v ${host_mount_dir}: ${host_mount_dir}。

    请参考关于工作路径、挂载路径、数据卷路径和NFS共享路径章节配置合适的挂载路径。

    说明:

    当在容器上板执行过程中出现挂载失败或报错提示“Permission denied”,请参考NFS环境搭建 检查宿主机的数据卷路径是否在宿主机NFS共享目录下。

  2. 在ssh.cfg中配置HOST_IP

    默认启动方式下,容器内分配的是一个虚拟IP地址,因此需要在ssh.cfg中配置宿主机的IP地址与板端进行通信。请参考ssh.cfg文件配置配置HOST_IP为宿主机IP地址。

Hi3519DV500 安装Python3.7.5(Ubuntu)

  1. 检查系统是否安装python3.7.5开发环境。

    分别使用命令python3.7.5 --version、python3.7 --version、pip3.7.5 --version、pip3.7 --version检查是否已经安装,如果返回如下信息则说明已经安装,否则请参见下一步。

    Python 3.7.5 
    pip 19.2.3 from /usr/local/python3.7.5/lib/python3.7/site-packages/pip (python 3.7)
    
  2. 安装python3.7.5依赖的包。

    sudo apt-get install -y make zlib1g zlib1g-dev build-essential libbz2-dev libsqlite3-dev libssl-dev libxslt1-dev libffi-dev openssl python3-tk
    

    libsqlite3-dev需要在python安装之前安装,如果用户操作系统已经安装python3.7.5环境,在此之后再安装libsqlite3-dev,则需要重新编译python环境。如果安装python3-tk失败,请参见《AMCT使用指南(PyTorch)》中”安装python3-tk时提示错误信息”小节。

  3. 安装python3.7.5。

    1. 使用wget下载python3.7.5源码包,可以下载到模型压缩工具所在服务器任意目录,命令为:

      wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
      
    2. 进入下载后的目录,解压源码包,命令为:

      tar -zxvf Python-3.7.5.tgz
      
    3. 进入解压后的文件夹,执行配置、编译和安装命令:

      cd Python-3.7.5
      ./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared
      make
      sudo make install
      

      其中“--prefix”参数用于指定python安装路径,用户根据实际情况进行修改,“--enable-shared”参数用于编译出libpython3.7m.so.1.0动态库,“--enable-loadable-sqlite-extensions”参数用于加载sqlite-devel依赖。

      本手册以--prefix=/usr/local/python3.7.5路径为例进行说明。执行配置、编译和安装命令后,安装包在/usr/local/python3.7.5路径,libpython3.7m.so.1.0动态库在/usr/local/python3.7.5/lib/libpython3.7m.so.1.0路径。

    4. 执行如下命令设置软链接:

      sudo ln -s /usr/local/python3.7.5/bin/python3 /usr/local/python3.7.5/bin/python3.7.5
      sudo ln -s /usr/local/python3.7.5/bin/pip3 /usr/local/python3.7.5/bin/pip3.7.5
      
    5. 设置python3.7.5环境变量。

      • 如果python安装用户为root:

        该场景下模型压缩工具使用root用户进行安装,请在当前终端窗口直接执行如下命令设置环境变量。

        #用于设置python3.7.5库文件路径
        export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
        #如果用户环境存在多个python3版本,则指定使用python3.7.5版本
        export PATH=/usr/local/python3.7.5/bin:$PATH
        

        须知:

        运行用户是root,不建议修改.bashrc,否则可能会影响其它系统提供的python工具的使用,如果仍想使用系统默认工具,则请重新开启终端窗口。

    6. 如果python安装用户为非root:

      该场景下模型压缩工具使用非root用户进行安装,请以非root用户在任意目录下执行vi ~/.bashrc命令,打开.bashrc文件,在文件最后一行后面添加如下内容。

      #用于设置python3.7.5库文件路径
      export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
      #如果用户环境存在多个python3版本,则指定使用python3.7.5版本
      export PATH=/usr/local/python3.7.5/bin:$PATH
      

      执行:wq!命令保存文件并退出,执行source ~/.bashrc命令使其立即生效。

  4. 安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。

    python3.7.5 --version
    pip3.7.5  --version
    python3.7 --version
    pip3.7  --version
    

H3516CV610 安装Python3.9.11(Ubuntu)

  1. 检查系统是否安装python3.9.11开发环境。

    分别使用命令python3.9.11 --version、python3.9 --version、pip3.9.11 --version、pip3.9 --version检查是否已经安装,如果返回如下信息则说明已经安装,否则请参见下一步。

    Python 3.9.11 
    pip 22.0.4 from /usr/local/python3.9.11/lib/python3.9/site-packages/pip (python 3.9)
    
  2. 安装python3.9.11依赖的包。

    sudo apt-get install -y build-essential  zlib1g-dev  libncurses5-dev  libgdbm-dev  libnss3-dev  libssl-dev  libreadline-dev  libffi-dev libbz2-dev
    
  3. 安装python3.9.11。

    1. 使用wget下载python3.9.11源码包,可以下载到模型压缩工具所在服务器任意目录,命令为:

      wget https://www.python.org/ftp/python/3.9.11/Python-3.9.11.tgz
      
    2. 进入下载后的目录,解压源码包,命令为:

      tar -zxvf Python-3.9.11.tgz
      
    3. 进入解压后的文件夹,执行配置、编译和安装命令:

      cd Python-3.9.11
      ./configure --prefix=/usr/local/python3.9.11 --enable-loadable-sqlite-extensions --enable-shared
      make
      sudo make install
      

      其中“--prefix”参数用于指定python安装路径,用户根据实际情况进行修改,"enable-optimizations": 参数用于启用优化选项,提高 Python 执行效率,“--enable-shared”参数用于启用共享库编译选项,生成共享库文件。

    4. 执行如下命令设置软链接:

      sudo ln -s /usr/local/python3.9.11/bin/python3 /usr/local/python3.9.11/bin/python3.9.11
      sudo ln -s /usr/local/python3.9.11/bin/pip3 /usr/local/python3.9.11/bin/pip3.9.11
      
    5. 设置python3.9.11环境变量。

      • 如果python安装用户为root:

        该场景下模型压缩工具使用root用户进行安装,请在当前终端窗口直接执行如下命令设置环境变量。

        #用于设置python3.9.11库文件路径
        export LD_LIBRARY_PATH=/usr/local/python3.9.11/lib:$LD_LIBRARY_PATH
        #如果用户环境存在多个python3版本,则指定使用python3.9.11版本
        export PATH=/usr/local/python3.9.11/bin:$PATH
        

        须知:

        运行用户是root,不建议修改.bashrc,否则可能会影响其它系统提供的python工具的使用,如果仍想使用系统默认工具,则请重新开启终端窗口。

      • 如果python安装用户为非root:

        该场景下模型压缩工具使用非root用户进行安装,请以非root用户在任意目录下执行vi ~/.bashrc命令,打开.bashrc文件,在文件最后一行后面添加如下内容。

        #用于设置python3.9.11库文件路径
        export LD_LIBRARY_PATH=/usr/local/python3.9.11/lib:$LD_LIBRARY_PATH
        #如果用户环境存在多个python3版本,则指定使用python3.9.11版本
        export PATH=/usr/local/python3.9.11/bin:$PATH
        

        执行:wq!命令保存文件并退出,执行source ~/.bashrc命令使其立即生效。

  4. 安装完成之后,执行如下命令查看安装版本,如果返回相关版本信息,则说明安装成功。

    python3.9.11 --version
    pip3.9.11  --version
    python3.9 --version
    pip3.9  --version
    

公网URL

表 1 公网URL 说明

序号

URL地址

说明

1

http://releases.ubuntu.com/releases/

Ubuntu系统下载参考地址

使用alias别名简化输入命令

常用命令可通过配置alias别名进行简化,示例如下:

alias mind_caffe="mindcmd oneclick caffe"
alias mind_torch="mindcmd oneclick pytorch"
alias mind_onnx="mindcmd oneclick onnx"

配置别名后,一键推理的简化命令为:

mind_caffe -m MODEL -w WEIGHT
mind_torch -m MODEL -i IMAGE_LIST --input_shape INPUT_SHAPE
mind_onnx -m MODEL -i IMAGE_LIST

说明:

alias取名并非固定名称,用户可按需取名,简化MindCmd输入命令,也可将alias别名配置到~/.bashrc中。

使用板端和仿真执行的差异

  1. 功能仿真模型输入仅支持***_original.om,上板执行、指令仿真和性能仿真模型输入支持***.om和***_original.om。***_original.om相比于***.om空间占用较大,不建议在上板环境实际部署中使用***_original.om;
  2. 接口调用出错时,功能仿真、指令仿真、性能仿真、上板执行四者的错误码返回值可能不相同,编程时需注意这一点;
  3. 功能仿真和指令仿真环境不支持profiling;
  4. 性能仿真不支持dump;
  5. 使用dump功能时,模型转化参数online_model_type要求不同,详见《ATC工具使用指南》“--online_model_type”。
  6. 仿真环境仅支持单Device,单Context,单Stream的使用方式,不支持异步、多线程、优先级调度或抢占的使用场景。仿真器的重点在于模拟图像分析引擎执行推理,对于上述SDK运行时不具备模拟功能,上述复杂场景执行可能会在仿真环境推理时出现异常或与上板执行推理结果不一致,不建议用户使用;
  7. 在ACL接口中需额外申请的两片内存task_buf和work_buf的内存大小,在板端执行、功能仿真、指令仿真、性能仿真中会有差异,用户使用时只需按照模型加载后返回的size申请内存即可,无须特别关注具体内存大小。关于task_buf和work_buf的说明详见《应用开发指南》“准备模型执行的输入/输出数据”。
  8. RPN网络功能仿真支持batch_size 为1。
  9. 指令仿和板端接口返回一致,但部分场景功能仿返回和板端会不一样。例如:图像格式是RGB_PACKAGE _U8,XRGB_PACKAGE_U8,UV_PACKAGE_U8或raw配置image_data_bits为10,12,14时,svp_acl_mdl_get_input_data_type、svp_acl_mdl_get_output_data_type等接口功能仿的返回值与板端不一样。这主要是因为功能仿的架构和逻辑与板端不一致,功能仿在acl接口阶段只能获取原始网络(atc生成的dot图上的原始信息)的输入shape和数据类型;对于这种图像格式,功能仿是在data层的推理才处理数据的重排。虽然接口返回值不一致,但是可以确保推理结果是符合预期的。

指令仿真pipe反压测试

模拟对aicore中多个可并发的硬件pipeline施加负载的情况,测试指令时序的正确性。

  1. 打开工程文件,查看调用的svp_acl_init()或svp_acl_mdl_set_dump()函数,获取acl.json文件路径。
  2. 修改acl.json文件(如不存在,则需要新建),添加pipe配置,格式如下。

    {
        "publish_debug_control": {
            "stall_pipe": 2
        }
    }
    
    • stall_pipe指对对应的硬件单元施加压力,参数取值:[0,8]。

      0:不启用pipe反压。

      1:存放指令信息和配置信息的单元

      2:加载DDR上的data到UB的单元

      3:加载DDR上的para到UB的单元

      4:搬运数据到DDR的单元

      5:将UB的数据搬运后继续存在UB中的单元

      6:片上通用存储单元

      7:矩阵运算单元

      8:矢量运算单元

  3. 运行仿真,生成模型推理数据。

  4. 重复步骤2,3,从1~8遍历stall_pipe并运行,8次推理结果全部一致则说明指令时序是正确的。

性能仿真参数配置

性能仿真参数配置示例如下:

"profiler":{
"output":"../profiling/perf_sim_output",
"perf_sim_en":"1",
"ddr_r_latency":"100"
}

表 1 性能仿真参数配置

参数配置

参数说明

output

性能仿真报告输出路径。默认为应用工程根目录下的profiling/perf_sim_output,若未配置此参数,则性能仿真报告生成在可执行程序同级目录下,报告名称格式为sim_perf_{ddr_r_latency}.csv

perf_sim_en

性能仿真开关,"1"代表开启,其它值或不配置此参数代表关闭。

ddr_r_latency

模拟读指令的时候,发生Cache Miss的场景下,需要额外等待的Cycle数,该值由 Bandwidth Limitation 转换得来。默认值为100,取值范围为[1, 1000000000]。当用户配置了取值范围外的数值,性能仿真使用默认值作为ddr_r_latency。

FAQ

挂载命令中的ip与服务器ip不符

问题描述

执行一键推理或上板推理时挂载失败,且挂载命令中的ip地址与服务器的ip不符

如:服务器ip为xxx.xxx.xxx.xxx,挂载ip为127.0.1.1

出现如下报错:

RuntimeError: [Mount] Mount failed: mount: mounting 127.0.1.1:${MOUNT_PATH} on ${BOARD_PATH} failed: Connection timed out

问题原因

/etc/hosts 文件中配置了回环地址如:

127.0.0.1 localhost
127.0.1.1 ${hostname}

解决方法

方法一:

参考如下方式修改服务器侧/etc/hosts 文件:

127.0.0.1 localhost
# 127.0.1.1 ${hostname}

方法二:

将hostname对应的ip修改为正确的ip:

127.0.0.1 localhost
xxx.xxx.xxx.xxx ${hostname}

说明:

hostname可通过以下两种方法获取: 方法一,执行hostname获取:

hostname
方法二,查看/etc/hostname文件:
vi /etc/hostname

找不到mindcmd命令

问题描述

执行mindcmd命令出现以下信息:

bash: mindcmd: command not found

问题原因

python路径未配置到环境变量PATH中。

mindcmd安装完成后会出现如下信息:

WARNING:The script mindcmd is installed in $HOME/.local/bin which is not on PATH.

解决方法

用户可通过以下命令进行配置环境变量:

export PATH=$PATH:$HOME/.local/bin

关于工作路径、挂载路径、数据卷路径和NFS共享路径

对于工作路径、挂载路径、数据卷路径、NFS共享路径的描述如下:

  • 工作路径确定MindCmd执行的工作空间,MindCmd生成的output文件等都会保存在该路径下。
  • 挂载路径是由于板端硬件存储资源有限,因此需要将板端的某个目录挂载到服务器侧达到板端存储扩容的作用。在MindCmd上板执行过程中,此路径还用于服务器与板端的资源同步,上板执行所需要的输入和输出文件会被同步到该路径下。
  • 数据卷路径标识宿主机(服务器)和Docker容器文件资源共享的范围,在此范围内,容器和宿主机都能访问该路径下的内容。
  • NFS共享路径是宿主机(服务器)配置的允许通过NFS服务共享宿主机资源的范围。

为了保证上板成功并能在容器中读取到上板生成的dump、profile等数据,要求配置上述路径的包含关系如下:

NFS共享路径 >= 数据卷路径 >= 挂载路径 >= 工作路径

MindCmd安装失败,找不到Rust编译器

问题描述

执行如下命令安装MindCmd。

pip install mindcmd-<version>-py3-none-linux_x86_64.tar.gz --user

提示以下错误,具体图1所示。

error: can't find Rust compiler

图 1 MindCmd安装失败,找不到Rust编译器

问题原因

MindCmd安装需要依赖Rust编译器。

解决方法

通过升级pip解决,命令如下:

pip install --upgrade pip

重新安装MindCmd

pip install mindcmd-<version>-py3-none-linux_x86_64.tar.gz --user

PyTorch模型推理失败

问题描述

PyTorch模型执行模型压缩的过程中模型推理失败,如图1所示。

图 1 PyTorch模型推理失败

问题原因

可能是因为输入数据与模型的输入不符。

解决方法

  1. 使用原始模型进行推理,保证模型的正确性。
  2. 调整输入数据,保证传入的数据与模型的输入相符。

PyTorch脚本使用了argparse解析导致推理报错

问题描述

用户在Python脚本使用了argparse解析参数,调用MindCmd一键推理PyTorch模型时报错。

问题原因

用户使用自己的Python脚本,main方法中调用了argparse解析,与MindCmd的命令行参数产生冲突,导致MindCmd解析参数产生异常。如图1所示。

图 1 Python脚本中使用了argparse进行参数解析

解决方法

用户如果在Python脚本中有特定的参数传入需求,可以通过构造参数类传入,代替原有通过argparse解析的方式。如图2所示。

图 2 使用构造参数类传入参数