2. 使用指南综述

本文档主要对清微骑士工具链 TS.Knight 进行整体介绍,帮助客户建立整体概念,引导客户更好的使用工具链提供的各项功能。同时也提供快速上手的演示方式,方便客户直接运行。

名词解释

名词

说明

Knight

清微骑士工具链英文名称

QAT

Quantization Aware Training,量化感知训练

RNE

可重构神经网络加速引擎

RCE

可重构计算引擎

Finetune

微调

IR定点模型

中间表示模型,指 Caffe定点模型或ONNX定点模型

2.1. Knight介绍

2.1.1. 概述

TS.Knight是清微智能提供的一站式开发平台,包含部署AI模型所需的全套工具链,支持模型量化、精度比对、模型编译、模拟和性能分析等功能。

2.1.2. 整体框架

TS.Knight整体框架如下图所示:

pipeline
  • Knight压缩工具(Knight-ModelCompression): 用于模型剪枝、稀疏、结构搜索、模型蒸馏等模型压缩。

  • Knight量化工具(Knight-Quantize): 基于少量数据(比如图片、语音、文本等类型) 量化浮点模型。

  • Knight RNE编译器(Knight-RNE-Compiler): 编译量化模型,产生RNE执行的指令配置文件。

  • Knight RNE模拟器(Knight-RNE-Simulator) : 用于仿真神经网络在RNE上推理计算过程,输出计算层的结果。

  • Knight RNE性能分析器(Knight-RNE-Profiling): 用于分析神经网络在芯片RNE上执行时间和存储开销,并给出分析报告。

  • Knight Finetune库(Knight-Finetune-Lib) : 即QAT库,在使用量化工具后,精度损失较大的情况下,可使用Finetune库进行量化感知训练,得到更适合量化的浮点模型。

  • Knight RNE模拟库(Knight-RNE-Simulator-Lib) : 供用户在PC端调用编写自己的应用程序,从而实现模拟运行结果。

  • Knight RNE 运行时库(Knight-RNE-Runtime-Lib) : 供用户在PC端交叉编译时调用,从而实现板端运行。

  • Knight Demo: 提供计算机视觉,智能语音等领域的端到端的运行示例,演示Knight工具链的使用流程和具体用法。

备注

注意:Knight压缩工具、Knight量化工具、Knight RNE编译器、Knight RNE模拟器和Knight RNE性能分析器所有芯片均支持。

2.1.3. 开发流程

2.1.3.1. AI全栈应用开发流程

pipeline

Knight工具链可支持端侧AI推理全栈开发,包括应用开发,模型部署资源生成和自定义算子开发三个主要流程。

应用开发:用户调用Knight RNE SDK API编写自己的业务应用,加载编译后的模型部署资源,链接模拟库在纯软件环境中仿真调试自己的应用,链接板端库在板端进行部署。

模型部署资源生成:用户准备已训练好的浮点模型,使用Knight 量化工具量化成IR定点模型,然后对比量化精度,接着编译生成模型资源,此时用户可进行模拟器结果验证以及Profiling性能调优。

自定义算子开发:当用户模型中存在芯片不支持的算子时,用户在量化后的IR模型中添加自定义算子层,之后进行IR模型编译,供应用开发时调用;用户在应用开发时进行自定义算子的C代码实现,通过SDK API相应接口进行自定义算子注册。最后,与整个应用程序一起进行模拟库上调测,板端库上部署。

2.1.3.2. 模型资源生成开发流程

pipeline
  1. 用户使用Knight模型转换工具将提前训练好的浮点模型量化编译成芯片部署资源(.tsmodel)。

  2. 用户使用Knight RNE模拟器对测试数据进行推理,也可以使用Knight RNE性能分析工具对模型进行性能分析。

  3. 同时用户也可以调用Knight RNE模拟库编写自己的业务应用在纯软件环境仿真自己的业务模型。

  4. 如果步骤2、3均通过,用户可以调用Knight RNE运行时库编写自己的实际业务应用,部署到清微芯片上。

  5. 在步骤1中,如果模型推理性能不满足需求,则用户可使用Knight压缩工具将提前训练好的浮点模型进行压缩,得到体积更小,性能更优,更适合端侧部署的浮点模型。(可选)

  6. 在步骤1量化后,如果模型精度损失严重,用户可以使用QAT库,即Knight Finetune库(当前仅支持pytorch平台)编写自己的Finetune工具对浮点模型进行微调,得到更适合量化的浮点模型,之后再进行步骤1。(可选)

备注

注意:在整个开发流程中有如下3个检查点: 1. 用户使用Knight build工具完成模型转换后,精度比对工具可查看量化后精度是否满足业务要求; 2. 同时model_check工具验证模拟器推理结果和Knight定点模型推理结果一致; 3. 用户使用Knight RNE运行时库对测试数据进行推理后,需保证其推理结果和Knight RNE模拟库推理结果一致; 以上3个检查点若不满足预期,可联系清微技术人员进行支持。

2.1.4. 软件包目录

Knight产品目录如下所示:

pipeline

ReleaseDocuments目录中为产品文档,示例如下:

├── 进阶指南
├── 算子规格表
├── 01-TS.Knight-使用指南综述_V3.5.pdf
├── 02-TS.Knight-快速上手指南_V3.5.pdf
├── 03-TS.Knight-模型转换使用指南_V3.5.pd
├── 04-TS.Knight-仿真性能分析使用指南_V3.5.pdf
├── 05-TS.Knight-SDK使用指南_V3.5.pdf
├── 06-TS.Knight-量化工具FAQ_V3.5.pdf
├── 07-TS.Knight-SDK-FAQ_V3.5.pdf
├── 08-TS.Knight-支持模块清单_V3.5.pdf

ReleaseDeliverables目录中为软件产品,示例如下:

├── TX510x-Lib
├── TX5112x_TX5239x201-Lib
├── TX5215x_TX5239x200_TX5239x220_TX5239x300-Lib
├── TX5336x_TX5256x-Lib
├── TX5368x_TX5339x_TX5335x-Lib
├── TX5326x-Lib
├── ts.knight-3.5.tar.gz
├── TS.Knight-MC_3.5.tar.gz
├── TS-Finetune-Lib_3.5.tar.gz

备注

注意:以上内容仅为示例,不同版本以实际产品包为准。 ts.knight-XXX.tar.gzKnight 镜像压缩包,参见 运行镜像 ,运行镜像后进入Knight容器, 容器内文件目录如下表所示。

一级

二级目录

开源/封闭

说明

/TS-KnightSoftware

/tools

开源

常用小工具。/model_check: 检查点2和检查点3结果验证。 详情参见

/TS-KnightDemo

/Resources

开源

Knight demo相关的模型和数据, 和代码

/Scripts

开源

Knight demo的运行shell脚本

Knight库文件目录如下表所示,库相关内容详情参见《TS.Knight-SDK使用指南》

一级

二级目录

开源 封闭

说明

/TX510x-Lib

/RNE -SIM-Lib

封闭

TX510x系列芯片 Knight RNE模拟库,详情参见 SDK使用指南

/RN E-RT-Lib

封闭

TX510x系列芯片 Knight RNE运行时库,详情参见 SDK使用指南

/TX5368x_TX5339x_TX53 35x-Lib

/RNE -SIM-Lib

封闭

TX5368x系列,TX5339x 系列和TX5335x系列芯片Knight RNE模拟库,详情参见 SDK使用指南

/RN E-RT-Lib

封闭

TX5368x系列 ,TX5339x系列和TX5335x系列 Knight RNE运行时库,详情参见 SDK使用指南

/TX5112x_TX5239x201-L ib

/RNE -SIM-Lib

封闭

TX5112x系列和TX5239x201系列芯片 Knight RNE模拟库,详情参见 SDK使用指南

/RN E-RT-Lib

封闭

TX5112x系列 和TX5239x201系列芯片Knight RNE运行时库,详情参见 SDK使用指南

/TX5215x_TX5239x200_ TX5239x220_TX5239x300 -Lib

/RNE-SIM-L ib

封闭

TX5215x系列,TX5 239x200系列,TX5239x220系列 和TX5239x300系列芯片Knight RNE模拟库, 详情参见 SDK使用指南

/RN E-RT-Lib

封闭

TX5215x系列, TX5 239x200系列,TX5239x220系列 和TX5239x300系列芯片Knight RNE运行时库,详情参见 SDK使用指南

/TX5336x_TX5256x-Lib

/RNE

-SIM-Lib

封闭

TX5336系列和TX5256系列芯片Knight RNE模拟库, 详情参见 SDK使用指南

/RNE-RT-Li b

封闭

TX5336系列和TX5256系列芯片Knight RNE运行时库, 详情参见 SDK使用指南

TS.Knight-Fine tune-Lib_XXX.tar.gz

开源

Knight Finetune库,详情参见

QAT使用说明

TS.Knight-MC_XXX.tar. gz

封闭

Knight压缩工具详情参见 模型压缩使用指南

2.1.5. 相关文档

《TS.Knight-快速上手指南》

《TS.Knight-量化使用指南》

《TS.Knight-量化工具FAQ》

《TS.Knight-编译仿真性能分析使用指南》

《TS.Knight-SDK使用指南》

《TS.Knight-Finetune-Lib使用指南》

《TS.Knight-MC使用指南》

《TS.Knight-xxx-RNE编译器算子规格表》

《TS.Knight-xxx量化算子规格表》

《TS.Knight-转换算子规格表》

《TS.Knight-支持模块清单》

2.2. 安装部署

2.2.1. 准备docker环境

当前Knight支持容器部署的方式,因此需要用户保证已安装docker环境,要求docker版本大于等于19.03,如果已安装则可跳过该章节。

docker安装方式有两种:自动更新安装docker和手动安装docker。

2.2.1.1. 自动更新安装docker

  1. 更新可用软件包列表

sudo apt update
  1. 更新所有软件包

sudo apt -y upgrade
  1. 安装docker

sudo apt install -y docker.io
  1. 确认docker版本大于等于19.03

docker --version

2.2.1.2. Ubuntu 16手动安装docker

Ubuntu 16的默认docker版本是18.x,低于19.03,所以需要手动安装docker。

2.2.1.2.1. 下载docker安装包
  1. 下载url:https://download.docker.com/linux/ubuntu/dists/

进入该网址后,进入xenial -> pool -> stable -> amd64

  1. 下载安装包:

containerd.io_1.2.13-2_amd64.deb

docker-ce-cli_19.03.12~3-0~ubuntu-xenial_amd64.deb

docker-ce_19.03.12~3-0~ubuntu-xenial_amd64.deb

2.2.1.2.2. 安装docker
  1. 更新可用软件包列表

sudo apt update
  1. 更新所有软件包

sudo apt -y upgrade
  1. 安装前面下载的安装包(参考下载docker安装包

  1. 确认docker版本大于等于19.03

docker -v

2.2.2. 加载镜像文件

docker load -i ts.knight-<version>.tar.gz

2.2.3. 查看镜像

查看已加载的镜像。

docker images

页面示例如下所示。

pipeline

2.2.4. 运行镜像

2.2.4.1. 镜像用户

docker镜像内默认使用root用户。如果使用非root用户,则需要保证自定义目标路径具有写权限。

2.2.4.2. 运行命令参数介绍

参 数名 称

说明

-v

给容器挂载存储卷,挂载到容器的某个目录。

“宿主目录”:本地需映射到容器内的目录(绝对路径);

“docker容器目录”:docker容器内目录,可以访问宿主机上的文件。

注意:

1)“宿主目录”建议存放用户模型和工具链 输出结果。便于在容器内直接操作,无需进行docker内外文件拷贝。

2)“docker容器目录”不能使用 “/TS-KnightDemo” 和 “/TS-KnightSoftware”,以及其子目录,防止覆盖容器内产品代码。

-u

指定容器的用户,默认是root。

-e

指定环境变量,容器中可以使用该环境变量。

-it

其中,-i表示以交互模式运行容器,-t表示为容器重新分配一 个输入终端,两者通常同时使用。“镜像名称”:docker镜像的名称;

“镜像Tag”:docker镜像的tag。

2.2.4.3. 运行示例

docker run --name=knight_docker -v localhost_dir:/data -it ts.knight: xxx /bin/bash

容器启动成功后,在容器内任意目录下均可使用Knight命令,Knight帮助信息页面示例如下所示。

pipeline

2.2.5. 库文件使用说明

库文件包括TX510x-Lib,TX5368x_TX5339x_TX5335x -Lib,TX5112x_TX5239x201-Lib,TX5215x_TX5239x200_ TX5239x220_TX5239x300 -Lib,TX5336x_TX5256x-Lib以及TX5110x-Lib使用详情参见《TS.Knight-SDK使用指南》。

2.3. 支持芯片

TS.Knight工具链支持清微芯片型号参见产品版本

当前默认芯片型号为TX5368AV200,如果使用其他系列芯片工具链,可使用--default-chip 修改默认芯片型号,或者在使用Knight命令行中配置-ch/--chip参数指定芯片型号。

2.4. Knight使用方式

2.4.1. Knight命令介绍

Knight作为工具链功能的总入口,支持以下参数:

  • -v: 查看Knight工具链版本信息,界面显示如下所示。

pipeline
  • -h: 查看帮助信息,界面显示参见2.4.3章节

  • -ch/--chip: 配置芯片型号,可调用相应型号下的工具链功能,可选命令参数,默认值为TX5368AV200。

  • --default-chip: 配置芯片型号-ch/--chip默认值,用户可通过以下命令行配置新的默认值。

Knight --default-chip TX5368AV200

通过Knight命令并配置芯片型号-ch/--chip参数即可调用相应型号下的工具链功能。Knight命令行模板如下所示。

Knight -ch/--chip [芯片型号] [子命令] 

Knight 子命令对应工具链的功能,命令取值和对应含义如下表所示。

  • Knight build :-Knight量化编译工具,用来将浮点模型转换为tsmodel模型部署资源,并完成模型精度比对和模型正确性验证。

  • Knight quant :Knight量化工具,详情参见《TS.Knight-量化使用指南》

  • Knight compile :Knight RNE编译器,详情参见《TS.Knight-编译仿真性能分析使用指南》

  • Knight compare : Knight精度比较工具,详情参见第6章节

  • Knight run :Knight RNE模拟器,详情参见《TS.Knight-编译仿真性能分析使用指南》

  • Knight profiling :Knight RNE性能分析器,详情参见《TS.Knight-编译仿真性能分析使用指南》

通过指定--help,可查看各类子命令的参数信息,Knight compile查看帮助信息界面示例如下。

pipeline

2.4.2. 配置文件介绍

TS.Knight工具链子命令行支持两种使用方式:一是配置文件的使用方式;二是命令行的使用方式。

命令行模板如下所示:

Knight build -rc/--run-config config.json

具体示例如下

Knight build --run-config config.json
Knight quant --run-config config.json
Knight compile --run-config config.json
Knight run --run-config config.json
Knight profiling --run-config config.json

在json配置文件中可定义”quant”, ” compile”, ”run”, ”profiling” 字段,不要求包含所有的字段,根据需要执行的流程进行配置即可。

执行Knight build 需要定义”quant”, ” compile”字段,示例如下:

{
"chip": TX5336AV200,
"quant": {
"model": "resnet18.onnx",
"infer-func": " infer_resnet18",
"run-mode": “quant,
"output-dequant": false,
"dump": true,
"save-dir": "output",
"user-defined-script": "model_define.py",
input-configs:[
{
"input_name": "input1",
"data_dir": "path/to/img_data",
"color_space": “BGR”,
"mean": [0, 0, 0],
"std": [255.0, 255.0, 255.0]
}]
"compile": {
"onnx": "output/resnet18_quantized.onnx",
"save-dir": "output/"
}
}

当执行如下命令时,则仅读取”quant”字段信息,并执行量化操作。

Knight quant --run-config config.json

当同时指定config配置文件和命令行参数时,则命令行参数生效,优先级高于配置文件,示例如下。

Knight quant --run-config config.json --bit-width 16

当执行Knight build则连续执行量化”quant”和 编译” compile”两个步骤,此时若需要同时使用命令行,则需要增加quant或compile前缀,示例如下。

Knight build --run-config config.json --quant.bit-width 16
--compile.save-dir “/tmp”

2.5. Knight compare工具

为了方便定位产生精度问题的算子,我们可以通过对比浮点-量化算子或者量化-模拟器算子的输出。

Compare工具给出了两种精度指标,MRE和余弦相似度。此外还提供了均方根误差(rmse),最大单点误差(maxdiff),有偏性(bias),参考如下:

  • mre: 平均相对误差, 数值越大,误差越大

  • cos: 余弦相似度,数值越小,误差越大

  • rmse: 均方根误差 ,数值越大,误差越大

  • maxdiff: 单点最大误差(m1/m2),数值越大,误差越大

  • bias: 有偏性(b1,b2),第一个数据大,表示数据偏向右边。第二个数据大,表示数据偏向左边。

Compare工具使用前,需要完成模型转换和模拟器推理,Compare工具支持量化前后精度比对(量化-浮点),定点模型推理结果和模拟推理结果数据比对(量化-模拟器),以及模拟器推理结果和模拟库推理结果比对(模拟器-模拟库)三种数据比较方式。

2.5.1. 参数说明

2.5.2. 使用示例

示例一:量化-浮点精度对比

步骤一:量化(需要指定dump 为true)

Knight build -rc /TS-KnightDemo/Samples/resnet18_config.json

步骤二:使用Knight compare逐层数据比对

Knight --chip TX5368AV200 compare -qd /TS-KnightDemo/output/resnet18/quant

示例二:量化-模拟器数据对比

步骤一:量化模型

Knight build -rc /TS-KnightDemo/Samples/resnet18_config.json

命令运行完毕后,会保存如下文件,作为模拟器的输入。 /output/resnet18/quant/inputs/x.bin

步骤二:仿真模型

Knight run --model /TS-KnightDemo/output/resnet18/rne/resnet18_quantize_r.tsmodel \
--input /TS-KnightDemo/output/resnet18/quant/inputs/x.bin \
--format nchw \
--save-dir /TS-KnightDemo/output/resnet18/rne

步骤三:量化-模拟器数据比较

knight compare -qd /TS-KnightDemo/output/resnet18/quant -sd /TS-KnightDemo/output/resnet18/rne

示例三:两个模拟器输出结果对比

数据准备参考上一节的模拟器数据准备。

Knight compare -sd /TS-KnightDemo/output/resnet18/rne**:**/output/resnet18/rne

示例四:详细数据比较

Knight compare -qd /TS-KnightDemo/output/resnet18/quant/ -on fc -sl 2 -si

示例五:按照指定精度字段排序

Knight compare -qd /TS-KnightDemo/output/resnet18/quant/ **--no-cos --no-mre --rmse --maxdiff --sort rmse**

示例六:保存比较结果

将所有算子的量化-浮点比较直方图输出到tmp/result目录中

保存折线图命令

保存的文件如下

pipeline

其中折线图为plot_result.png, plot_out_name_idx.txt保存了折线图里output index和output name的映射关系。

示例七:选择要比较的算子类型

Knight compare -qd /TS-KnightDemo/output/resnet18/quant --op-type Conv,Gemm

示例八:直方图比较

要显示直方图,需要完成以下环境配置

  1. 在宿主机开放权限,允许所有用户访问X11 的显示接口:

如果没有安装X11,请执行如下命令:

如果$HOME目录下没有.Xauthority文件,创建空文件touch .Xauthority并执行:

在宿主机每一次开机时执行xhost +

  1. 在启动容器时,必须使用root用户权限,同时需额外添加以下命令:

-u root
-e DISPLAY=$DISPLAY
-v /tmp/.X11-unix:/tmp/.X11-unix:rw
-v $HOME/.Xauthority:/root/.Xauthority
--net host
  1. 运行示例

docker run -v localhost_dir:container_dir -u root --net host -e
DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix:rw -v
$HOME/.Xauthority:/root/.Xauthority -u root -it ts.knight:xxx
/bin/bash

执行以下Knight compare命令:

pipeline

输出示例如上图所示,左上为浮点算子输出的直方图,左下为浮点算子的权重直方图。右上为量化算子输出的直方图, 右下为量化算子的权重直方图。

显示折线图示例如下:

pipeline

2.6. 小工具介绍

2.6.1. show_sim_result工具

show_sim_result用来显示模拟器输出文件里的数据,同时支持将模拟器的输出数据保存到*.npy文件中。

2.6.1.1. 参数说明

参数名称

必需/可选

默认值

说明

-sd或

--sim-data

必选

指定模拟器输 出文件或者模拟器数据的保存路径。

如果指 定的是目录,则会将此目录下的模拟 器输出的*_p.txt文件转化为*.npy文 件并保存到—save-dir指定的目录下。

注:此目录下的*_hwc_p.txt文 件因为和*_p.txt文件的数据完全相同 ,只是数据排布不同,因此只会在没 有对应的*_p.txt文件的情况下转换。

--save-dir

可选

指定*.npy文件的保存路径。

如果—sim-data指定的 是路径,则此选项为必选

如果—sim-data指定的是文 件,则此选项非必选。无此选项时会 在终端上输出文件的数据,有此选项 时会将文件内容保存为*.npy文件。

输出文件名格式: 文件主名和输 入文件名一致,扩展名改为*.npy。

-i或

--index

可选

在显示数据 时,指定要显示的数据的索引范围。

--index所指定 的索引个数<=数据维度个数。第一个 索引范围对应数据第0维度,第二个索 引范围对应数据第1维度,以此类推。

格 式:逗号分隔,索引范围列表。

索引范围格式:

1. < n>,一个数字,表示某维度第n组数据

2.<start>-<end>,表示[start, end]

3.<start>-,一个数字带一 个减号,表示[start,<该轴的最大值 >]。例如,数据形状[1,3,224,224], 则--index 0,1,2,3-表 示的数据索引范围为[0,1,2,3:223]。

缺省:显示全部数据。

注:此选项只 适用于--sim-data指定文件的时候。

-fmt或

--format

可选

nchw

指定输出数据的维度排列格式

支持两种格式:

  1. nhwc

  2. nchw

-h或--help

可选

显示帮助信息。

2.6.1.2. 使用示例

示例一:显示文件内容

示例二:指定索引范围

示例三:转换所有模拟器结果为*.npy文件

2.6.2. model_modifier工具

model_modifier用来裁剪onnx模型。

2.6.2.1. 参数说明

参数名称

必需/可选

默认值

说明

-sd或

--sim-data

必选

指定模拟器输 出文件或者模拟器数据的保存路径。

如果指 定的是目录,则会将此目录下的模拟 器输出的*_p.txt文件转化为*.npy文 件并保存到—save-dir指定的目录下。

注:此目录下的*_hwc_p.txt文 件因为和*_p.txt文件的数据完全相同 ,只是数据排布不同,因此只会在没 有对应的*_p.txt文件的情况下转换。

--save-dir

可选

指定*.npy文件的保存路径。

如果—sim-data指定的 是路径,则此选项为必选

如果—sim-data指定的是文 件,则此选项非必选。无此选项时会 在终端上输出文件的数据,有此选项 时会将文件内容保存为*.npy文件。

输出文件名格式: 文件主名和输 入文件名一致,扩展名改为*.npy。

-i或

--index

可选

在显示数据 时,指定要显示的数据的索引范围。

--index所指定 的索引个数<=数据维度个数。第一个 索引范围对应数据第0维度,第二个索 引范围对应数据第1维度,以此类推。

格 式:逗号分隔,索引范围列表。

索引范围格式:

1. < n>,一个数字,表示某维度第n组数据

2.<start>-<end>,表示[start, end]

3.<start>-,一个数字带一 个减号,表示[start,<该轴的最大值 >]。例如,数据形状[1,3,224,224], 则--index 0,1,2,3-表 示的数据索引范围为[0,1,2,3:223]。

缺省:显示全部数据。

注:此选项只 适用于--sim-data指定文件的时候。

-fmt或

--format

可选

nchw

指定输出数据的维度排列格式

支持两种格式:

  1. nhwc

  2. nchw

-h或--help

可选

显示帮助信息。

2.6.2.2. 使用示例

model_modifier --model /TS-KnightDemo/Samples/resnet18/models/onnx_model/resnet18.onnx --submodel-name reset18_bn1_layer1_1_relu_1 --input-names bn1 --output-names layer1_1_relu_1 --save-dir ./

2.6.3. model_info工具

model_info工具用来显示量化后的ONNX模型的量化参数信息以及输出层反量化系数。

2.6.3.1. 参数说明

2.6.3.2. 使用示例

model_info -m /TS-KnightDemo/output/resnet18/rne/resnet18_quantize.onnx -ds
pipeline

2.6.4. model_check.py工具

用户执行完量化命令和编译命令后,可使用该脚本进行检查点2,检查点3(参见章节1.3.2)结果验证。

容器内/TS-Knight-software/tools/model_check/model_check.py 参数说明如下表所示:

2.6.4.1. 参数说明

参数名称

必选/ 可选

默认值

参数说明

-h/--help

可 选

查看帮助信息

-qo/--quant-output

必选

执行量化命令时后模型保存目录。 ONNX 量化命令需要指定参数--dump, 此时 --quant-output需指定为{--save_dir} /dump,或者拷贝该路径内文件到其他路 径时,也可指定相应的路径,需要保证d ump并列的目录下有量化后的onnx模型;

-co/--compile-output

必 选

执行编译命令时结果保存目录

-fmt/--format

可 选

自动根据量 化输入数据 类型判断

输入数据format, 取值范围

["nchw","nhwc"]

-r/--run-mode

可 选

0

取值范围[0,1]

0: 表示仅对比 量化后结果和模拟器结果(检查点1);

1: 表示对比量化 后结果和模拟器结果(检查点1),以及 模拟器结果和模拟库结果(检查点2)。

2.6.4.2. 使用示例

步骤一:完成量化编译

Knight build -rc /TS-KnightDemo/Samples/configs/resnet18_build_config.json

步骤二:验证模型正确性

python model_check.py --quant-model /output/resnet18_onnx/quant/resnet18_quantize.onnx \
--compile-model /output/resnet18_onnx/rne/resnet18_quantize_r.tsmodel

2.7. 算子介绍

Knight工具链中支持的算子有2类:

高效算子:运行在RNE硬件单元上,执行效率高;

通用算子:运行在CPU等通用计算硬件单元上,执行效率相比于高效算子低,用户模型中经常使用且

RNE硬件单元不支持,Knight工具链出厂时已支持;

各芯片支持的高效算子、通用算子请参见相应芯片的《TS.Knight-xxx-RNE编译器算子规格表》和《TS.Knight-xxx量化算子规格表》。

2.8. FAQ

2.8.1. 退出docker容器后恢复工作环境

【问题描述】

退出docker容器后如何恢复工作环境?

【解决方法】

可重启容器,然后进入容器以恢复工作环境。

2.8.2. Knight命令行重复输入--chip

【问题描述】
Knight命令行重复输入-ch/--chip时,哪个生效?

【解决方法】

当输入两次及以上的-ch/--chip参数时,第一次配置的芯片型号生效,示例如下。

2.8.3. docker权限问题

【问题描述】

如果出现“Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock”

【解决方法】

可能是因为用户没有权限启动docker服务,请联系管理员开通权限。

2.8.4. Knight容器能否使用非root权限启动

【问题描述】

Knight容器能否使用非root权限启动?

【解决方法】

Knight容器默认使用root用户启动,同样可以支持使用非root权限启动,启动命令如下:

2.8.5. Knight镜像如何增量更新

【问题描述】

由于Knight镜像中包含多个模块,若仅有一个模块进行了更新修改,如何增量更新Knight镜像?

【解决方法】

  1. 首先启动Knight容器:

docker run --name=knight_docker -it ts.knight:xxx /bin/bash
  1. 将需要更新的模块文件在宿主机上的目录${host_module_file}拷贝到Knight容器中相应目录${docker_module_dir}下,命令示例如下:

docker cp ${ host_module_dir} 容器ID: ${docker_module_dir}
  1. 将容器保存为新镜像,命令示例如下:

docker commit 容器ID ts.knight-new:xxx

2.9. 附录

json配置文件

如下是包含”quant”和”compile”字段的json配置文件示例参考,详细信息请参考《TS.Knight-量化使用指南》和《TS.Knight-编译仿真性能分析使用指南》。

{
//可选,默认和--default-chip一致(默认为TX5368AV200)
"chip": <芯片型号>,
//可选,类型:bool,默认false,表示开启量化精度比对
"disable-compare": false,
//可选,类型:bool,默认false,表示开启模型正确性验证
"disable-model-check":false,
"quant": {
// 待量化模型所属框架类型。类型:string,可选,默认"onnx",
取值范围[onnx, pytorch, caffe,paddle, tensorflow]
"framework": "onnx",
// 指定模型文件,若为ONNX格式则指ONNX模型文件。类型:string,必选
"model": "resnet18.onnx",
// 模型权重文件,类型:string,可选,默认None
"weight": None,
// 前向推理函数名称。类型:string,可选,默认"infer_auto"
"infer-func": "infer_auto",
//量化输入数据路径,类型:string,可选
"data": "path/data_dir",
//量化位宽,类型:int,可选,默认8,取值范围[8, 16]
"bit-width": 8,
//量化时模型执行推理次数,类型:int,可选,默认1

"iteration": 200,

//量化模型时加载量化数据的batchsize大小。类型:int,可选,默认1

"batch-size": 16,

//设置量化后模型的batchsize。类型:int,可选,默认1

"ir-batch": 1,

//日志级别。类型:int,可选,默认3

"log-level": 3,

//计算激活系数方式。类型:string,可选,默认kl

"quant-mode": “kl” ,

//仅在quant-mode设置为percentile时生效,设定量化百分位。类型:string,可选,默认0.99999

"percent": 0.99999,

//量化模式。类型:string,可选,默认quant,可选范围[“quant”,”infer”,”convert”,”compare”,”auto_quant”]

"run-mode": “quant,

//指定量化后模式输入数据类型。类型:string,可选,默认None

"quantize-input-dtype": None,

//存放量化scale信息的json文件路径。类型:string,可选,默认None

"load-scale-json": None,

//是否增加反量化。类型:bool,可选, 默认false

"output-dequant": false,

//指定Tensorflow模型量化开始节点名。类型:string,可选,默认None

"start-node-names": None,

//指定Tensorflow模型量化结束节点名。类型:string,可选,默认None

"end-node-names": None,

//仅量化Tensorflow模型时使用,指定后当输入format为4维NHWC,转出的onnx模型从输入开始的format都为NCHW。类型:bool,可选,默认false

"convert2chw": false,

//输入数据shape,仅针对Paddle模型。类型:list,可选,默认None

"input-shapes": None,

//指定量化后模型保存路径。类型:string,可选,默认"/TS-KnightOutput/QuantOnnx/"

"save-dir": "/TS-KnightOutput/QuantOnnx/",

//设置生成模型对应的混合量化模板json配置文件。类型:string,可选,默认None

"generate-template":None,

//混合量化json文件路径。类型:string,可选,缺省None

"mix-config": None,

//指定输入后需要增加的BN算子的方差。类型:string,可选,缺省None

"std": 0, 0, 0,

//指定输入后需要增加的BN算子的均值。类型:string,可选,缺省None

"mean": 255.0, 255.0, 255.0,

//指定用户自定义的python脚本,用于加载推理函数、加载pytorch模型定义。类型:string,可选,缺省None

"user-defined-script": “path/model_define.py”,

//量化并行cpu数。类型:int,可选,默认5

"cpu-num": 5,

//scale统计直方图缓存文件路径,设置该参数,则会加载缓存文件,跳过scale计算前向推理过程。类型:string,可选,默认None

"cache-distribution": None,

//是否对Concat,Stack和ScatterND类型的算子进行系数统一。类型:bool,可选,缺省false

"unify-input-scale": false,

//设置lut表格长度。类型:int,可选,默认10, 取值范围[8, 9, 10, 11,
12]

"lut-len": 10,

//生成混合量化模板时使用。类型:float,可选,默认0.5

"auto-mix-ratio":0.5,

//指定混合量化模板生成策略。类型:string,可选,默认
initial,取值范围['HAWQ', 'IOhigh', 'initial']

"auto-mix-strategy": “initial”,

//数据预处理

"input-configs":[

{

// onnx模型输入名称,必选

"input_name": "input",

// 输数据类型,必选,取值范围[Image,Numpy],

"quant_data_format": "Image",

// 输入图像的路径,必选

"data_dir": "path/to/img_data",

// onnx模型需要的图像格式,取值范围[BGR,RGB],可选,默认BGR,

"color_space": "BGR",

// 均值,可选,quant_data_format为Image时需要配置

"mean": [0, 0, 0],

// 方差,可选,quant_data_format为Image时需要配置

"std": [255.0, 255.0, 255.0],

}]

}

"compile": {

// onnx神经网络模型文件路径。类型:string,可选

"onnx": "path",

// 保存路径。类型:string,可选,默认"onnx"

"save-dir": "path",

// 日志级别。类型:int,取值范围[0,1,2,3],可选,默认3

"log-level": "3",

// 指示是否对ddr做优化。类型:int,取值范围[0,1,2],可选,默认1

"opt-ddr": "1",

//设置该参数时,打开input blobs mem是否独立于blobs mem的开关
指示是否对ddr做优化。类型:bool,可选,默认false

"input-indep": "0",

//此参数控制用户可使用的硬件资源大小, 取值范围["little","middle",
"big", "super"],可选,默认"super"

"hardware-resource-mode": "super"

}}