AI Benchmark使用说明
AI Benchmark示例包提供了嵌入式应用开发常见分类、检测、分割、光流、追踪估计,雷达多任务,bev,深度估计模型和在线建图的性能和精度评测示例。
其中性能评测示例包括单帧延迟评测和多线程评测示例,充分利用调用BPU的速度进行评测。
示例包中预置了源码、可执行程序和评测脚本,您可以在地平线开发板上进行体验,并基于这些示例直接进行应用开发,降低开发门槛。
发布物说明
AI Benchmark示例包位于发布物的 samples/ucp_tutorial/dnn/ai_benchmark/ 路径下,主要包括以下内容:
| 编号 | 名称 | 内容 |
|---|
| 1 | code | 包含示例源代码和编译脚本。 |
| 2 | runtime | 示例包上板运行环境。 |
示例包结构
示例包结构如下所示:
├── code # 示例源码文件夹
│ ├── build_ptq_runtime.sh
│ ├── build_qat_runtime.sh
│ ├── build.sh # 通用的编译脚本,被build_ptq_xxx.sh和build_qat_xxx.sh调用
│ ├── CMakeLists.txt
│ ├── include # 源码头文件
│ │ ├── base
│ │ ├── input
│ │ ├── method
│ │ ├── output
│ │ ├── plugin
│ │ └── utils
│ ├── README.md
│ ├── resolve.sh # 下载模型性能评测数据集的脚本
│ └── src # 示例源码
│ ├── input
│ ├── method
│ ├── output
│ ├── plugin
│ ├── simple_example.cc
│ └── utils
├── runtime # 示例包运行环境
│ ├── ptq # PTQ方案模型示例
│ │ ├── data # 模型性能评测数据集
│ │ ├── mini_data # Mini评测数据集
│ │ ├── model # PTQ方案模型
│ │ │ ├── README.md
│ │ │ └── runtime -> ../../../../../../model_zoo/runtime/nash-e/ai_benchmark/ptq # 软链接指向OE包中的模型,板端运行环境需要自行指定模型路径
│ │ ├── README.md
│ │ ├── script # 执行脚本
│ │ │ ├── aarch64 # 编译产生可执行文件及依赖库
│ │ │ ├── classification # 分类模型示例
│ │ │ ├── config # 模型推理配置文件
│ │ │ ├── detection # 检测模型示例
│ │ │ ├── segmentation # 分割模型示例
│ │ │ ├── env.sh # 基础环境脚本
│ │ │ └── README.md
│ │ └── tools # 精度评测工具
│ └── qat # QAT方案模型示例
│ ├── data # 模型性能评测数据集
│ ├── mini_data # Mini评测数据集
│ ├── model # QAT方案模型
│ │ ├── README.md
│ │ └── runtime -> ../../../../../../model_zoo/runtime/nash-e/ai_benchmark/qat # 软链接指向OE包中的模型,板端运行环境需要自行指定模型路径
│ ├── README.md
│ ├── script # 执行脚本
│ │ ├── aarch64 # 编译产生可执行文件及依赖库
│ │ ├── bev # bev模型示例
│ │ ├── classification # 分类模型示例
│ │ ├── config # 模型推理配置文件
│ │ ├── detection # 检测模型示例
│ │ ├── disparity_pred # 深度估计模型示例
│ │ ├── multitask # 多任务模型示例
│ │ ├── online_map # 在线建图模型示例
│ │ ├── opticalflow # 光流模型示例
│ │ ├── segmentation # 分割模型示例
│ │ ├── tracking # 追踪模型示例
│ │ ├── traj_pred # 轨迹预测示例
│ │ ├── env.sh # 基础环境脚本
│ │ └── README.md
│ └── tools # 前处理及精度评测工具
└── README.md
- code:该目录内是评测程序的源码,用来进行模型性能和精度评测。
- runtime:该目录内提供了已经编译好的应用程序,以及各种评测脚本,用来测试多种模型在地平线BPU上运行的性能和精度等。
- build_ptq_runtime.sh:PTQ真机程序一键编译脚本。
- build_qat_runtime.sh:QAT真机程序一键编译脚本。
示例模型
AI Benchmark示例包的模型发布物包括PTQ模型和QAT模型发布物:
- PTQ模型model_zoo需要通过执行
samples/ai_toolchain/model_zoo/runtime/${march}/ai_benchmark/ 路径下的 resolve_ai_benchmark_ptq.sh 脚本进行获取。路径中的 ${march} 可选值有 nash-e 及 nash-p ,分别对应 S100/S100P 及 S600 平台,您可根据需要自行选择。
- QAT模型model_zoo需要通过执行
samples/ai_toolchain/model_zoo/runtime/${march}/ai_benchmark/ 路径下的 resolve_ai_benchmark_qat.sh 脚本进行获取。路径中的 ${march} 可选值有 nash-e 及 nash-p ,分别对应 S100/S100P 及 S600 平台,您可根据需要自行选择。
ptq/model 文件夹包含模型所在的路径, runtime 文件夹为软链接,链接路径默认指向 ../../../../../../model_zoo/runtime/nash-e/ai_benchmark/ptq ,若您需要运行非 nash-e 架构的模型,可自行修改链接路径中的 nash-e 为 nash-b 或 nash-p 。
qat/model 文件夹包含模型所在的路径, runtime 文件夹为软链接,链接路径默认指向 ../../../../../../model_zoo/runtime/nash-e/ai_benchmark/qat ,若您需要运行非 nash-e 架构的模型,可自行修改链接路径中的 nash-e 为 nash-b 或 nash-p 。
其中包含常用的分类、检测、分割和光流预测等模型,模型命名规则为 {model_name}_{backbone}_{input_size}_{input_type}。
注解
model_zoo中的PTQ和QAT模型通过原始模型编译而得到的。
AI Benchmark示例包内包含的PTQ和QAT模型发布物的性能数据可根据您的平台参考 模型性能Benchmark 章节。
公共数据集
示例中会使用到数据集,对应数据集的下载您可参考 数据集下载 章节,数据准备过程中如遇问题请联系地平线。
环境构建
使用AI Benchmark示例包之前,您需要保证开发板环境和编译环境可用:
注解
需要注意,在Linux平台编译时 build.sh 脚本里指定的交叉编译工具链的位置是 opt 目录下,如果安装在其他位置,需要手动修改下脚本中的如下内容。
export CC=/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc
export CXX=/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-g++
示例使用
评测示例
评测示例脚本主要在 script 和 tools 目录下。
script 目录下是板上运行的评测脚本,包括常见分类、检测、分割、光流、追踪等模型。每个模型下面有以下三个脚本:
| 脚本 | 描述 |
|---|
| fps.sh | 实现多线程fps统计(多线程调度,可以根据需求自由设置线程数)。 |
| latency.sh | 实现单帧延迟性能统计(一个线程,单帧)。 |
| accuracy.sh | 用于精度评测。 |
script:
├── aarch64 # 编译产生的可执行文件及依赖库
│ ├── bin
│ └── lib
├── env.sh # 基础配置
├── config
│ ├── model
│ │ ├── data_name_list # image_name配置文件
│ │ └── input_init # 模型输入配置文件
│ │ └── input_order # 模型输入顺序
│ ├── preprocess
│ │ └── centerpoint_preprocess_5dim.json # 前处理配置文件
│ └── reference_points # 模型参考点信息
│ │ ├── bev_gkt_mixvargenet_multitask_nuscenes
│ │ └── ...
├── detection # 检测模型
│ ├── fcos_efficientnetb0_mscoco # 在此目录中还有其他模型, 仅以此模型目录为参考
│ │ ├── accuracy.sh
│ │ ├── fps.sh
│ │ ├── latency.sh
│ │ ├── workflow_accuracy.json # 精度配置文件
│ │ ├── workflow_fps.json # 性能配置文件
│ │ └── workflow_latency.json # 单帧延时配置文件
│ └──...
├── ...
└── README.md
ptq/tools 目录下主要包括 python_tools 下的精度计算脚本,用于PTQ模型的精度评测。
python_tools
└── accuracy_tools
├── cls_imagenet_eval.py
├── det_coco_eval.py
├── det_voc_eval.py
├── metrics
│ ├── cityscapes_metric.py
│ ├── coco_config.py
│ ├── coco_metric.py
│ └── voc_metric.py
└── seg_cityscapes_eval.py
注意
评测前需要执行以下命令,将 ptq (或者 qat )目录拷贝到开发板上。
scp -r samples/ucp_tutorial/dnn/ai_benchmark/runtime/ptq root@192.168.1.1:/userdata/ptq/
scp -r samples/ucp_tutorial/dnn/ai_benchmark/runtime/qat root@192.168.1.1:/userdata/qat/
json配置文件参数信息
本小节按照输入配置项(input_config)、输出配置项(output_config)及workflow配置项的维度,分别对workflow_fps.json、workflow_latency.json及workflow_accuracy.json中的配置项进行简单说明。
注解
下方给出的配置项参数信息为通用配置项信息,一些示例模型由于模型特殊性,还会有额外的配置项,具体请您参考示例模型json文件。
输入配置项(input_config)
| 参数名称 | 参数说明 | 涉及json文件 |
|---|
| input_type | 设置输入数据格式,支持图像或者bin文件。 | fps.json、latency.json、accuracy.json |
| height | 设置输入数据高度。 | fps.json、latency.json、accuracy.json |
| width | 设置输入数据宽度。 | fps.json、latency.json、accuracy.json |
| data_type | 设置输入数据类型,支持类型可参考
hbDNNDataType小节。
对应数据类型由上到下排序,分别对应数字0,1,2...
如HB_DNN_TENSOR_TYPE_S4对应数字0,
HB_DNN_TENSOR_TYPE_U4对应数字1,
HB_DNN_TENSOR_TYPE_S8对应数字2... | fps.json、latency.json、accuracy.json |
| image_list_file | 设置预处理数据集lst文件所在路径。 | fps.json、latency.json、accuracy.json |
| need_pre_load | 设置是否使用预加载方式对数据集读取。 | fps.json、latency.json、accuracy.json |
| limit | 设置处理中和处理完的输入数据量间差值的阈值,用于控制输入数据的处理线程。 | fps.json、latency.json、accuracy.json |
| need_loop | 设置是否循环读取数据进行评测。 | fps.json、latency.json、accuracy.json |
| max_cache | 设置预加载的数据个数。
请注意:
此参数生效时会预处理图片并读取到内存中,为保障您的程序稳定运行,请不要设置过大的值,建议您的数值设置不超过30。
| fps.json、latency.json、accuracy.json |
输出配置项(output_config)
| 参数名称 | 参数说明 | 涉及json文件 |
|---|
| output_type | 设置输出数据类型。 | fps.json、latency.json、accuracy.json |
| in_order | 设置是否按顺序进行输出。 | fps.json、latency.json、accuracy.json |
| enable_view_output | 设置是否将输出结果可视化。 | fps.json、latency.json |
| image_list_enable | 可视化时,设置为true,则可将输出结果保存为图像类型。 | fps.json、latency.json |
| view_output_dir | 设置可视化结果输出文件路径。 | fps.json、latency.json |
| eval_enable | 设置是否对精度进行评估。 | accuracy.json |
| output_file | 设置模型输出结果文件。 | accuracy.json |
workflow配置项
模型推理配置项:
| 参数名称 | 参数说明 | 涉及json文件 |
|---|
| method_type | 设置模型推理方法,此处需配置为 InferMethod。 | fps.json、latency.json、accuracy.json |
| method_config | 设置模型推理参数。
- core:设置推理core id。
- model_file:指定模型文件。
| fps.json、latency.json、accuracy.json |
后处理配置项:
| 参数名称 | 参数说明 | 涉及json文件 |
|---|
| thread_count | 设置后处理线程数,取值范围为 1-8。 | fps.json、latency.json、accuracy.json |
| method_type | 设置后处理方法。 | fps.json、latency.json、accuracy.json |
| method_config | 设置后处理参数。 | fps.json、latency.json、accuracy.json |
性能评测
性能评测分为latency和fps两方面。
使用说明
latency:
进入到需要评测的模型目录下,执行 sh latency.sh 即可测试出单帧延迟。如下所示:
I0419 02:35:07.041095 39124 output_plugin.cc:80] Infer latency: [avg: 13.124ms, max: 13.946ms, min: 13.048ms], Post process latency: [avg: 3.584ms, max: 3.650ms, min: 3.498ms].
注解
infer 表示模型推理耗时。
Post process 表示后处理耗时。
fps:
该功能采用多线程并发方式,旨在让模型可以在BPU上达到极致的性能。由于多线程并发及数据采样的原因,在程序启动阶段帧率值会较低,之后帧率会上升并逐渐趋于稳定,帧率的浮动范围控制在0.5%之内。
进入到需要评测的模型目录下执行 sh fps.sh 即可测试出帧率。如下所示:
I0419 02:35:00.044417 39094 output_plugin.cc:109] Throughput: 1129.39fps # 模型帧率
命令行参数说明
fps.sh脚本内容如下:
#!/bin/sh
source ../../env.sh
export SHOW_FPS_LOG=1
export STAT_CYCLE=100 # 设置环境变量,FPS 统计周期
${app} \
--config_file=workflow_fps.json \
--log_level=1
latency.sh脚本内容如下:
#!/bin/sh
source ../../env.sh
export SHOW_LATENCY_LOG=1 # 设置环境变量,打印 LATENCY 级别log
export STAT_CYCLE=50 # 设置环境变量,LATENCY 统计周期
${app} \
--config_file=workflow_latency.json \
--log_level=1
结果可视化
如果您希望可以看到模型单次推理出来效果,可以修改workflow_latency.json,重新运行latency.sh脚本,即可在output_dir目录下生成展示效果。
注意
生成展示效果时,由于dump效果的原因,脚本运行会变慢。仅支持运行latency.sh脚本dump。
可视化操作步骤 参考如下:
-
修改workflow_latency.json配置文件
"output_config": {
"output_type": "image",
"enable_view_output": true, # 开启可视化
"view_output_dir": "./output_dir", # 可视化结果输出路径
"image_list_enable": true,
"in_order": false
}
-
执行latency.sh脚本
注意
bev模型可视化需要指定场景信息和homography矩阵路径,homography矩阵用于相机视角和鸟瞰图的转换,不同场景有各自的homography矩阵。在线建图模型可视化需要指定下对应的局部地图的感知范围。
bev模型的workflow_latency.json配置文件我们建议修改成如下形式:
"output_config": {
"output_type": "image",
"enable_view_output": true, # 开启可视化
"view_output_dir": "./output_dir", # 可视化结果输出路径
"bev_ego2img_info": [
"../../config/visible/bev/scenes.json", # 输入的场景信息
"../../config/visible/bev/boston.bin", # boston场景的homography矩阵
"../../config/visible/bev/singapore.bin" # singapore场景的homography矩阵
],
"image_list_enable": true,
"in_order": false
}
在线建图模型的workflow_latency.json配置文件我们建议修改成如下形式:
"output_config": {
"output_type": "image",
"enable_view_output": true, # 开启可视化
"view_output_dir": "./output_dir", # 可视化结果输出路径
"bev_range": [
-30.0,
-15.0,
-10.0,
30.0,
15.0,
10.0
], # 局部地图的感知范围
"image_list_enable": true,
"in_order": false
}
qcnet模型可视化方法如下:
python3 tools/bpu_validation.py
-c configs/qcnet_oe_argoverse2.py # qcnet对应config文件
--result-path eval.log # 推理结果eval.log文件路径(可视化存储路径)
--gt-files-path argoverse2_qcnet/val # data数据集挂载路径
不同类别的模型可以实现的 可视化效果 也不相同,参考下表:
注意
轨迹预测可视化时如果需要可视化minidata以外的图片,需要额外配置道路信息、轨迹信息文件到 minidata/argoverse1/visualization 中,生成配置文件可使用 densetnt_process.py 预处理脚本,将 --is-gen-visual-config 参数设为 true。
精度评测
模型评测分为五步:
-
数据预处理。
-
数据挂载。
-
生成lst文件。
-
模型推理。
-
精度计算。
数据预处理
下文将分别对PTQ和QAT模型数据预处理方式进行介绍。
PTQ模型数据预处理:
PTQ模型数据预处理需要在x86仿真环境下运行 hb_eval_preprocess 工具,对数据集进行预处理。
所谓预处理是指数据在送入模型之前的特定处理操作,比如:图片resize、crop和padding等操作。
该工具集成于 horizon_tc_ui 工具内,安装对应的install脚本即可使用该工具。
原始数据集经过工具预处理之后,会生成模型对应的前处理二进制文件.bin文件集。
小技巧
关于 hb_eval_preprocess 工具命令行参数及使用方法,可键入 hb_eval_preprocess -h, 或查看PTQ工具文档中的 hb_eval_preprocess工具 一节内容。
下面将详细介绍示例包中每一个模型对应的数据集,以及对应数据集的预处理操作。
PTQ模型使用到的数据集包括以下几种:
| 数据集 | 说明 |
|---|
VOC
数据集 | 用于使用 VOC2012 数据集的检测模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。
示例中主要用到 Main 文件下的val.txt文件,JPEGImages 中的源图片和 Annotations 中的标注数据。 2. 数据集预处理方式示例: hb_eval_preprocess -m ssd_mobilenetv1 \
-i VOCdevkit/VOC2012/JPEGImages \
-v VOCdevkit/VOC2012/ImageSets/Main/val.txt \
-o ./pre_ssd_mobilenetv1
|
COCO
数据集 | 用于使用 coco_val2017 数据集的检测模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。
示例中主要用到 annotations 文件夹下的instances_val2017.json标注文件和 images 中的图片。 2. 数据集预处理方式示例: hb_eval_preprocess -m model_name \
-i coco/coco_val2017/images \
-o ./pre_model_name
|
ImageNet
数据集 | 用于使用 imagenet 数据集的分类模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。
示例中主要用到标注文件val.txt 和 val 目录中的源图片。 2. 数据集预处理方式示例: hb_eval_preprocess -m model_name \
-i imagenet/val \
-o ./pre_model_name
|
Cityscapes
数据集 | 用于使用 cityscapes 数据集的分割模型的评测。 1. 下载及参考下载结构可参考 如何准备数据集 章节。
示例中主要用到 ./gtFine/val 中的标注文件和 ./leftImg8bit/val 中的源图片。 2. 数据集预处理方式示例: hb_eval_preprocess -m model_name \
-i cityscapes/leftImg8bit/val \
-o ./pre_model_name
|
QAT模型数据预处理:
HAT 提供了处理lmdb格式的打包数据集的脚本,下面将详细介绍示例包中模型对应的数据集,以及其预处理操作。
小技巧
数据预处理的脚本位于oe包/samples/ai_toolchain/horizon_model_train_sample/scripts路径下。
需要在gpu环境下跑数据预处理脚本。
使用前请先把原始数据集打包成lmdb数据,然后挂载到当前路径的tmp_data目录下。
| 数据集 | 说明 |
|---|
ImageNet
数据集 | 用于QAT分类模型mixvargenet_imagenet、mobilenetv1_imagenet、mobilenetv2_imagenet、 resnet18_imagenet、resnet50_imagenet、horizon_swin_transformer_imagenet。 数据集预处理方式: 1. 运行脚本后会在save-path路径下生成一个 imagenet_gt.jsonl 文件作为真实标签用于精度计算。 2. 这些模型数据预处理逻辑一致,因此运行一次脚本后,其它模型可以复用生成的数据。 |
COCO
数据集 | 用于QAT检测模型fcos_efficientnetb0_mscoco, detr_resnet50_mscoco, detr_efficientnetb3_mscoco 和 deform_detr_resnet50_mscoco的评测。 数据集预处理方式: 1. 运行脚本后会在save-path路径下生成一个 meta.jsonl 文件作为真实标签用于精度计算。 2. detr_resnet50_mscoco和detr_efficientnetb3_mscoco这两个模型数据预处理逻辑一致, 因此运行一次脚本后,另一个模型可以复用生成的数据。 fcos_efficientnetb0_mscoco python3 tools/bpu_val_preprocess.py \
-c configs/detection/fcos/fcos_efficientnetb0_mscoco.py \
--save-path ./data/coco/
detr_resnet50_mscoco python3 tools/bpu_val_preprocess.py \
-c configs/detection/detr/detr_resnet50_mscoco.py \
--save-path ./data/coco/
detr_efficientnetb3_mscoco python3 tools/bpu_val_preprocess.py \
-c configs/detection/detr/detr_efficientnetb3_mscoco.py \
--save-path ./data/coco/
deform_detr_resnet50_mscoco python3 tools/bpu_val_preprocess.py \
-c configs/detection/deform_detr/deform_detr_resnet50_mscoco.py \
--save-path ./data/coco/
|
Cityscapes
数据集 | 用于QAT分割模型unet_mobilenetv1_cityscapes的评测。 数据集预处理方式: 运行脚本后会在save-path路径下生成一个 gts 的目录作为真实标签用于精度计算。 python3 tools/bpu_val_preprocess.py \
-c configs/segmentation/unet_mobilenetv1_cityscapes.py \
--save-path ./data/cityscapes/
|
Kitti3D
数据集 | 用于QAT检测模型pointpillars_kitti_car的评测。 数据集预处理方式: 运行脚本后会在save-path路径下生成一个 val_gt_infos.pkl 文件作为真实标签用于精度计算。 python3 tools/bpu_val_preprocess.py \
-c configs/detection/pointpillars/pointpillars_kitti_car.py \
--save-path ./data/kitti3d/
|
Culane
数据集 | 用于QAT检测模型ganet_mixvargenet_culane的评测。 数据集预处理方式: 运行脚本后会在save-path路径下生成一个 gt.json 文件作为真实标签用于精度计算。 python3 tools/bpu_val_preprocess.py \
-c configs/lane_pred/ganet/ganet_mixvargenet_culane.py \
--save-path ./data/culane/
|
Nuscenes
数据集 | 用于QAT检测模型fcos3d_efficientnetb0_nuscenes,centerpoint_pointpillar_nuscenes,lidar多任务模型centerpoint_mixvargnet_multitask_nuscenes, bev模型bev_gkt_mixvargenet_multitask_nuscenes,bev_lss_efficientnetb0_multitask_nuscenes,bev_ipm_efficientnetb0_multitask_nuscenes, bev_ipm_4d_efficientnetb0_multitask_nuscenes,bevformer_tiny_resnet50_detection_nuscenes,detr3d_efficientnetb3_nuscenes, petr_efficientnetb3_nuscenes,在线建图模型maptroe_henet_tinym_bevformer_nuscenes和occ模型flashocc_henet_lss_occ3d_nuscenes的评测。 数据集预处理方式: 1. flashocc_henet_lss_occ3d_nuscenes、bevformer_tiny_resnet50_detection_nuscenes、bev_lss_efficientnetb0_multitask_nuscenes、 petr_efficientnetb3_nuscenes、detr3d_efficientnetb3_nuscenes、bev_gkt_mixvargenet_multitask_nuscenes、 bev_ipm_4d_efficientnetb0_multitask_nuscenes、bev_ipm_efficientnetb0_multitask_nuscenes、centerpoint_mixvargnet_multitask_nuscenes 这几个模型运行脚本后会在save-path路径下生成一个 val_gt_infos.pkl 文件用于精度计算。 2. maptroe_henet_tinym_bevformer_nuscenes这个模型运行脚本后会在save-path路径下生成一个 nuscenes_map_anns_val.json 文件 作为真实标签用于精度计算。 3. 根据参考模型算法包中的README,下载对应模型的reference_points并放在./tmp_data/nuscenes/reference_points下,组织形式如下: ├─── tmp_data
├─── ├─── nuscenes
├─── ├─── ├─── reference_points
├─── ├─── ├─── ├─── bevformer_tiny_resnet50_detection_nuscenes
centerpoint_pointpillar_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/detection/centerpoint/centerpoint_pointpillar_nuscenes.py \
--save-path ./data/nuscenes/
flashocc_henet_lss_occ3d_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/occ/flashocc_henet_lss_occ3d_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "flashocc_henet_lss_occ3d_nuscenes"
bevformer_tiny_resnet50_detection_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/bevformer_tiny_resnet50_detection_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "bevformer_tiny_resnet50_detection_nuscenes"
bev_lss_efficientnetb0_multitask_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/bev_lss_efficientnetb0_multitask_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "bev_lss_efficientnetb0_multitask_nuscenes"
petr_efficientnetb3_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/petr_efficientnetb3_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "petr_efficientnetb3_nuscenes"
detr3d_efficientnetb3_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/detr3d_efficientnetb3_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "detr3d_efficientnetb3_nuscenes"
bev_gkt_mixvargenet_multitask_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/bev_gkt_mixvargenet_multitask_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "bev_gkt_mixvargenet_multitask_nuscenes"
bev_ipm_4d_efficientnetb0_multitask_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/bev_ipm_4d_efficientnetb0_multitask_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "bev_ipm_4d_efficientnetb0_multitask_nuscenes"
bev_ipm_efficientnetb0_multitask_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/bev/bev_ipm_efficientnetb0_multitask_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --reference_path ./tmp_data/nuscenes/reference_points/ \
--model "bev_ipm_efficientnetb0_multitask_nuscenes"
fcos3d_efficientnetb0_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/detection/fcos3d/fcos3d_efficientnetb0_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args \
--file_path_txt ucp_tutorial/dnn/ai_benchmark/runtime/qat/script/config/model/data_name_list/nuscenes_names.txt
centerpoint_mixvargnet_multitask_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/lidar_multi_task/centerpoint_mixvargnet_multitask_nuscenes.py \
--save-path ./data/nuscenes/
maptroe_henet_tinym_bevformer_nuscenes python3 tools/bpu_val_preprocess.py \
-c configs/map/maptroe_henet_tinym_bevformer_nuscenes.py \
--save-path ./data/nuscenes/ \
--extra-args --model maptroe_henet_tinym_bevformer_nuscenes \
--reference_path ucp_tutorial/dnn/ai_benchmark/runtime/qat/script/config/reference_points
|
Mot17
数据集 | 用于QAT多目标跟踪模型motr_efficientnetb3_mot17的评测。 数据集预处理方式: python3 tools/bpu_val_preprocess.py \
-c configs/track_pred/motr_efficientnetb3_mot17.py \
--save-path ./data/mot17/
|
Carfusion 数据集 | 用于QAT检测模型keypoint_efficientnetb0_carfusion的评测。 数据集预处理方式: 运行脚本后会在save-path路径下生成一个 gt.json 文件作为真实标签用于精度计算。 python3 tools/bpu_val_preprocess.py \
-c configs/keypoint/keypoint_efficientnetb0_carfusion.py \
--save-path ./data/carfusion/
|
Argoverse1
数据集 | 用于QAT检测模型densetnt_argoverse1的评测。 数据集预处理方式: 运行脚本后还会在save-path路径下生成相应的评测meta目录。 python3 tools/bpu_val_preprocess.py \
-c configs/traj_pred/densetnt_vectornet_argoverse1.py \
--save-path ./data/argoverse1/
|
Argoverse2
数据集 | 用于QAT检测模型qcnet_oe_argoverse2的评测。 数据集预处理方式: 运行脚本后会在save-path路径下生成相应的评测val目录。 python3 tools/bpu_val_preprocess.py \
-c configs/traj_pred/qcnet_oe_argoverse2.py \
--save-path ./data/argoverse2/
|
SceneFlow
数据集 | 用于QAT深度估计模型stereonetplus_mixvargenet_sceneflow的评测。 数据集预处理方式: 运行脚本后除了生成预处理数据外,还会在save-path路径下生成一个val_gt_infos.pkl 文件用于精度计算。 python3 tools/bpu_val_preprocess.py \
-c configs/disparity_pred/stereonet/stereonetplus_mixvargenet_sceneflow.py \
--save-path ./data/sceneflow/
|
数据挂载
由于数据集相对较大,不适合直接放在开发板上,可以采用挂载的方式供开发板读取,需要在服务器PC端和板端进行如下操作:
服务器PC端:
注意
请注意,执行下方操作需要服务器PC端root权限。
-
编辑 /etc/exports,增加一行:/nfs *(insecure,rw,sync,all_squash,anonuid=1000,anongid=1000,no_subtree_check)。/nfs 表示本机挂载路径,可替换为您所指定目录。
-
执行命令 exportfs -a -r,使/etc/exports生效。
板端:
-
创建需要挂载的目录: mkdir -p /mnt。
-
挂载: mount -t nfs {PC端IP}:/nfs /mnt -o nolock。
完成将PC端的 /nfs 文件夹挂载至板端 /mnt 文件夹。按照此方式,将包含预处理数据的文件夹挂载至板端, 并将 /data 目录软链接至板端 /ptq 或 /qat 目录下,与 /script 同级目录。
生成lst文件
示例中精度计算脚本的运行流程是:
-
根据 workflow_accurary.json 中的 image_list_file 参数值,去寻找对应数据集的 lst 文件。
-
根据 lst 文件存储的前处理文件路径信息,去加载每一个前处理文件,然后进行推理。
因此生成预处理文件之后,需要生成对应的lst文件,将每一张前处理文件的路径写入到lst文件中,而这个路径与数据集在板端的存放位置有关。
这里我们推荐其存放位置与 ./data/dataset_name/pre_model_name 预处理数据文件夹同级目录。
PTQ预处理数据集结构如下:
|── ptq
| |── data
| | |── cityscapes
| | | |── pre_deeplabv3plus_efficientnetb0
| | | | |── xxxx.bin # 前处理好的二进制文件
| | | | |── ....
| | | |── pre_deeplabv3plus_efficientnetb0.lst # lst文件:记录每一个前处理文件的路径
| | | |── ....
| | |── ....
| |── model
| | |── ...
| |── script
| | |── ...
QAT预处理数据集结构如下:
|── qat
| |── data
| | |── carfusion
| | | |── pre_keypoints
| | | | |── xxxx # 前处理好的数据
| | | | |── ....
| | | |── pre_carfusion.lst # lst文件:记录每一个前处理文件的路径
| | |── ....
| |── model
| | |── ...
| |── script
| | |── ...
对应的lst文件,参考生成方式如下:
除bev系列、motr_efficientnetb3_mot17、stereonetplus_mixvargenet_sceneflow, maptroe_henet_tinym_bevformer_nuscenes和densetnt_argoverse1, qcnet_oe_argoverse2模型外,其余模型的lst文件参考生成方式:
find ../../../data/coco/pre_centernet_resnet101 -name "*bin*" > ../../../data/coco/pre_centernet_resnet101.lst
注解
-name后的参数需要根据预处理后的数据集格式进行对应调整,如bin、png。
这样生成的lst文件中存储的路径为一个相对路径:../../../data/coco/pre_centernet_resnet101/ , 可以与 workflow_accuracy.json 默认的配置路径吻合。
如果需要更改前处理数据集的存放位置,则需要确保对应的 lst 文件可以被 workflow_accuracy.json 读取到。 其次需要确保程序根据 lst 中的路径信息,能读取到对应的前处理文件。
对于bev系列、motr_efficientnetb3_mot17、stereonetplus_mixvargenet_sceneflow、maptroe_henet_tinym_bevformer_nuscenes、densetnt_argoverse1和qcnet_oe_argoverse2模型,lst文件参考生成方式:
| 模型名 | lst文件参考生成方式及说明 |
|---|
| densetnt_argoverse1 | 参考生成方式: 这样生成的lst文件中存储的路径为一个相对路径:
../../../data/argoverse1/densetnt/ ,可以与
workflow_accuracy.json 默认的配置路径吻合。 |
| qcnet_oe_argoverse2 | 我们提供了专门的脚本generate_acc_lst.sh 用于生成lst文件,使用方式如下: sh generate_acc_lst.sh ../../../data/argoverse2_qcnet/fp32_sample/val \
../../../data/argoverse2_qcnet
该脚本需要输入两个参数:预处理好的data挂载路径 和 生成list的输出路径,这样生成的lst文件中存储的路径为一个相对路径:
../../../data/argoverse2_qcnet/ ,可以与
workflow_accuracy.json 默认的配置路径吻合。 |
Bev maptroe_henet_tinym_bevformer_nuscenes | 以bev_ipm_efficientnetb0_multitask_nuscenes模型为例,该模型有图像和参考点两种输入,同一帧输入的图片和参考点名称相同。
为了保证输入相对应,在执行 find 命令时需要添加 sort 按名称进行排序。maptroe_henet_tinym_bevformer_nuscenes生成方式与之相同。参考生成方式: find ../../../data/nuscenes_bev/images -name "*bin*" | \
sort > ../../../data/nuscenes_bev/images.lst
find ../../../data/nuscenes_bev/reference_points0 -name "*bin*" | \
sort > ../../../data/nuscenes_bev/reference_points0.lst
此外,bev_ipm_4d_efficientnetb0_multitask_nuscenes和bevformer_tiny_resnet50_detection_nuscenes是时序模型,该模型对输入顺序有要求。
因此,我们提供了专门的脚本 gen_file_list.sh 用于生成lst文件,使用方式如下: 这样生成的lst文件中存储的路径为一个相对路径:../../../data/nuscenes_bev/ ,可以与 workflow_accuracy.json 默认的配置路径吻合。
如果需要更改前处理数据集的存放位置,则需要确保对应的 lst 文件可以被 workflow_accuracy.json 读取到。
其次需要确保程序根据 lst 中的路径信息,能读取到对应的前处理文件。 |
| motr_efficientnetb3_mot17 | 参考生成方式: 这样生成的lst文件中存储的路径为一个相对路径:../../../data/mot17/motr/ ,可以与 workflow_accuracy.json 默认的配置路径吻合。
如果需要更改前处理数据集的存放位置,则需要确保对应的 lst 文件可以被 workflow_accuracy.json 读取到。
其次需要确保程序根据 lst 中的路径信息,能读取到对应的前处理文件。 |
| stereonetplus_mixvargenet_sceneflow | 以stereonetplus_mixvargenet_sceneflow模型为例,为了保证同一帧输入的左右视图相对应,在执行 find 命令时需要添加 sort 按名称进行排序,参考生成方式如下: find ../../../data/sceneflow/left -name "*png*" |\
sort > ../../../data/sceneflow/left.lst
find ../../../data/sceneflow/right -name "*png*" |\
sort > ../../../data/sceneflow/right.lst
|
模型推理
accuracy.sh脚本内容中各参数说明如下:
#!/bin/sh
source ../../env.sh # 加载基础配置
export SHOW_FPS_LOG=1 # 设置环境变量,打印fps级别log
${app} \ # 可执行程序,在accuracy.sh脚本中定义
--config_file=workflow_accuracy.json \ # 加载精度测试workflow配置文件
--log_level=2 # 设置log等级
挂载完数据后,登录开发板,执行 centernet_resnet101/ 目录下的accuracy.sh脚本,如下所示:
root@dvb-hynix8G:/userdata/ptq/script/detection/centernet_resnet101# sh accuracy.sh
../../aarch64/bin/example --config_file=workflow_accuracy.json --log_level=2
...
I0419 03:14:51.158655 39555 infer_method.cc:107] Predict DoProcess finished.
I0419 03:14:51.187361 39556 ptq_centernet_post_process_method.cc:558] PTQCenternetPostProcessMethod DoProcess finished, predict result: [{"bbox":[-1.518860,71.691170,574.934631,638.294922],"prob":0.750647,"label":21,"className_name":"
I0118 14:02:43.636204 24782 ptq_centernet_post_process_method.cc:558] PTQCenternetPostProcessMethod DoProcess finished, predict result: [{"bbox":[3.432283,164.936249,157.480042,264.276825],"prob":0.544454,"label":62,"className_name":"
...
板端程序会在当前目录生成eval.log文件,该文件就是预测结果文件。
精度计算
注意
请注意,精度计算部分需在docker环境或linux环境下进行操作。
精度计算我们按照PTQ模型精度和QAT模型精度计算两种情况为您展开介绍。
PTQ模型精度计算:
PTQ模型精度计算的脚本在 ptq/tools/python_tools/accuracy_tools 目录下,其中:
| 脚本 | 描述 |
|---|
| cls_imagenet_eval.py | 用于计算使用 ImageNet 数据集评测的分类模型的精度。 |
| det_coco_eval.py | 用于计算使用COCO数据集评测的检测模型的精度。 |
| seg_cityscapes_eval.py | 用于计算使用Cityscapes数据集评测的分割模型的精度。 |
| det_voc_eval.py | 用于计算使用VOC数据集评测的检测模型的精度。 |
以下为您说明不同类型的PTQ模型精度计算方式:
| 模型类型 | 精度计算方式说明 |
|---|
| 分类模型 | 使用ImageNet数据集的分类模型计算方式如下: python3 cls_imagenet_eval.py --eval-log-path=eval.log \
--gt-file=val.txt
其中: eval-log-path:分类模型的预测结果文件。
gt-file:ImageNet数据集的标注文件。
|
| 检测模型 | 1.使用COCO数据集的检测模型精度计算方式如下: python3 det_coco_eval.py --eval-log-path=eval.log \
--annotation-path=instances_val2017.json
其中: eval-log-path:检测模型的预测结果文件。
annotation-path:COCO数据集的标注文件。
2.使用VOC数据集的检测模型精度计算方式如下: python3 det_voc_eval.py --eval-log-path=eval.log \
--annotation-path=../Annotations \
--val-txt-path=../val.txt
其中: eval-log-path:检测模型的预测结果文件。
annotation-path:VOC数据集的标注文件。
val-txt-path:VOC数据集中ImageSets/Main文件夹下的val.txt文件。
|
| 分割模型 | 使用Cityscapes数据集的分割模型精度计算方式如下: python3 seg_cityscapes_eval.py --eval-log-path=eval.log \
--gt-path=cityscapes/gtFine/val
其中: eval-log-path:分割模型的预测结果文件。
gt-path:Cityscapes数据集的标注文件。
|
QAT模型精度计算:
小技巧
精度计算的脚本位于oe包/samples/ai_toolchain/horizon_model_train_sample/scripts路径下。
需要在gpu环境下跑精度计算脚本。
以下为您说明不同类型的QAT模型精度计算方式:
| 数据集 | 精度计算方式说明 |
|---|
ImageNet
数据集 | 其中: result-path:模型的预测结果文件。
gt-files-path:ImageNet数据集的标注文件。
|
COCO
数据集 | fcos_efficientnetb0_mscoco # 推理时workflow_accuracy.json中is_acc_run参数为true
python3 tools/bpu_validation.py \
-c configs/detection/fcos/fcos_efficientnetb0_mscoco.py \
--result-path eval.log \
--gt-files-path ./data/coco/fcos_efficientnetb0_mscoco/meta.json
# 推理时workflow_accuracy.json中is_acc_run参数为false
python3 tools/bpu_validation.py \
-c configs/detection/fcos/fcos_efficientnetb0_mscoco.py \
--result-path eval.log
detr_resnet50_mscoco python3 tools/bpu_validation.py \
-c configs/detection/detr/detr_resnet50_mscoco.py \
--result-path eval.log \
--gt-files-path ./data/coco/detr_resnet50_mscoco/meta.json
detr_efficientnetb3_mscoco python3 tools/bpu_validation.py \
-c configs/detection/detr/detr_efficientnetb3_mscoco.py \
--result-path eval.log \
--gt-files-path ./data/coco/detr_efficientnetb3_mscoco/meta.json
deform_detr_resnet50_mscoco python3 tools/bpu_validation.py \
-c configs/detection/deform_detr/deform_detr_resnet50_mscoco.py \
--result-path eval.log \
--gt-files-path ./data/coco/deform_detr_resnet50_mscoco/meta.json
其中: result-path:模型的预测结果文件。
gt-files-path:COCO数据集的标注文件。
|
Cityscapes
数据集 | python3 tools/bpu_validation.py \
-c configs/segmentation/unet_mobilenetv1_cityscapes.py \
--result-path eval.log \
--gt-files-path ./data/cityscapes/unet_mobilenetv1_cityscapes/gts/
其中: result-path:模型的预测结果文件。
gt-files-path:存放Cityscapes数据集标注的目录。
|
Kitti3D
数据集 | python3 tools/bpu_validation.py \
-c configs/detection/pointpillars/pointpillars_kitti_car.py \
--result-path eval.log \
--gt-files-path ./data/kitti3d/pointpillars_kitti_car/gt/val_gt_infos.pkl
其中: result-path:模型的预测结果文件。
gt-files-path:Kitti3D数据集的标注文件。
|
Culane
数据集 | python3 tools/bpu_validation.py \
-c configs/lane_pred/ganet/ganet_mixvargenet_culane.py \
--result-path eval.log \
--gt-files-path .data/culane/ganet_mixvargenet_culane/gt.json
其中: result-path:模型的预测结果文件。
gt-files-path:Culane数据集的标注文件。
|
Nuscenes 数据集 | centerpoint_pointpillar_nuscenes python3 tools/bpu_validation.py \
-c configs/detection/centerpoint/centerpoint_pointpillar_nuscenes.py \
--result-path eval.log \
--gt-files-path ./data/nuscenes/centerpoint_pointpillar_nuscenes/val_gt_infos.pkl \
--extra-args --meta_dir ./tmp_ori_data/nuscenes
flashocc_henet_lss_occ3d_nuscenes python3 tools/bpu_validation.py \
-c configs/occ/flashocc_henet_lss_occ3d_nuscenes.py \
--result-path eval.log \
--gt-files-path ./data/nuscenes/flashocc_henet_lss_occ3d_nuscenes/val_gt_infos.pkl
bevformer_tiny_resnet50_detection_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/bevformer_tiny_resnet50_detection_nuscenes.py \
--result-path eval.log \
--gt-files-path ./data/nuscenes/bevformer_tiny_resnet50_detection_nuscenes/val_gt_infos.pkl
bev_lss_efficientnetb0_multitask_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/bev_lss_efficientnetb0_multitask_nuscenes.py \
--result-path bev_det_eval.log bev_seg_eval.log \
--gt-files-path ./data/nuscenes/bev_lss_efficientnetb0_multitask_nuscenes/val_gt_infos.pkl
petr_efficientnetb3_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/petr_efficientnetb3_nuscenes.py \
--result-path eval.log \
--gt-files-path ./data/nuscenes/petr_efficientnetb3_nuscenes/val_gt_infos.pkl
detr3d_efficientnetb3_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/detr3d_efficientnetb3_nuscenes.py \
--result-path eval.log \
--gt-files-path ./data/nuscenes/detr3d_efficientnetb3_nuscenes/val_gt_infos.pkl
bev_gkt_mixvargenet_multitask_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/bev_gkt_mixvargenet_multitask_nuscenes.py \
--result-path bev_det_eval.log bev_seg_eval.log \
--gt-files-path ./data/nuscenes/bev_gkt_mixvargenet_multitask_nuscenes/val_gt_infos.pkl
bev_ipm_4d_efficientnetb0_multitask_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/bev_ipm_4d_efficientnetb0_multitask_nuscenes.py \
--result-path bev_seg_eval.log bev_det_eval.log \
--gt-files-path ./data/nuscenes/bev_ipm_4d_efficientnetb0_multitask_nuscenes/val_gt_infos.pkl
bev_ipm_efficientnetb0_multitask_nuscenes python3 tools/bpu_validation.py \
-c configs/bev/bev_ipm_efficientnetb0_multitask_nuscenes.py \
--result-path bev_det_eval.log bev_seg_eval.log \
--gt-files-path ./data/nuscenes/bev_ipm_efficientnetb0_multitask_nuscenes/val_gt_infos.pkl
fcos3d_efficientnetb0_nuscenes python3 tools/bpu_validation.py \
-c configs/detection/fcos3d/fcos3d_efficientnetb0_nuscenes.py \
--result-path eval.log \
--gt-files-path ./tmp_data/nuscenes/v1.0-trainval
centerpoint_mixvargnet_multitask_nuscenes python3 tools/bpu_validation.py \
-c configs/lidar_multi_task/centerpoint_mixvargnet_multitask_nuscenes.py \
--result-path det_eval.log seg_eval.log \
--gt-files-path ./data/nuscenes/centerpoint_mixvargnet_multitask_nuscenes/val_gt_infos.pkl
maptroe_henet_tinym_bevformer_nuscenes python3 tools/bpu_validation.py \
-c configs/map/maptroe_henet_tinym_bevformer_nuscenes.py \
--result-path eval.log \
--gt-files-path ./data/nuscenes/maptroe_henet_tinym_bevformer_nuscenes/nuscenes_map_anns_val.json
其中: result-path:模型的预测结果文件。
gt-files-path: nuscenes数据集的标注文件。
|
Mot17
数据集 | python3 tools/bpu_validation.py \
-c configs/track_pred/motr_efficientnetb3_mot17.py \
--result-path ./eval_log/ \
--gt-files-path ./tmp_data/mot17/test_gt/
其中: result-path:目录下存放了模型的预测结果文件。
gt-files-path: 目录下存放了Mot17数据集的标注文件。
|
Carfusion 数据集 | python3 tools/bpu_validation.py \
-c configs/keypoint/keypoint_efficientnetb0_carfusion.py \
--result-path eval.log \
--gt-files-path ./data/carfusion/keypoint_efficientnetb0_carfusion/gt.json
其中: result-path:模型的预测结果文件。
gt-files-path: Carfusion数据集的标注文件。
|
Argoverse1
数据集 | python3 tools/bpu_validation.py \
-c configs/traj_pred/densetnt_vectornet_argoverse1.py \
--result-path eval.log \
--gt-files-path ./data/argoverse1/densetnt_vectornet_argoverse1/meta
其中: result-path:模型的预测结果文件。
gt-files-path: 目录下存放了Argoverse1数据集的标注文件。
|
Argoverse2
数据集 | python3 tools/bpu_validation.py \
-c configs/traj_pred/qcnet_oe_argoverse2.py \
--result-path eval.log \
--gt-files-path ./data/argoverse2/qcnet_oe_argoverse2/val
其中: result-path:模型的预测结果文件。
gt-files-path: 目录下存放了Argoverse2数据集的标注文件。
|
SceneFlow
数据集 | python3 tools/bpu_validation.py \
-c configs/disparity_pred/stereonet/stereonetplus_mixvargenet_sceneflow.py \
--result-path eval.log \
--gt-files-path ./data/sceneflow/stereonetplus_mixvargenet_sceneflow/gt/val_gt_infos.pkl
其中: result-path:模型的预测结果文件。
gt-files-path: SceneFlow数据集的标注文件。
|
模型集成
前处理
您可根据需要自行添加模型前处理,将其部署到 CPU 或 DSP 上,以centerpoint_pointpillar_nuscenes为例:
-
增加前处理文件qat_centerpoint_preprocess_method.cc,以及头文件qat_centerpoint_preprocess_method.h。
-
增加模型前处理配置文件。
前处理文件及头文件添加
前处理文件 qat_centerpoint_preprocess_method.cc 放置于 ai_benchmark/code/src/method/ 路径下, 头文件 qat_centerpoint_preprocess_method.h 放置于 ai_benchmark/code/include/method/ 路径下:
|── ai_benchmark
| |── code # 示例源码
| | |── include
| | | |── method # 在此文件夹中添加头文件
| | | | |── qat_centerpoint_preprocess_method.h
| | | | |── ...
| | |── src
| | | |── method # 在此文件夹中添加前处理.cc文件
| | | | |── qat_centerpoint_preprocess_method.cc
| | | | |── ...
模型前处理配置文件添加
|── ai_benchmark
| |── runtime/qat/script # 示例脚本文件夹
| | |── config
| | | |── preprocess
| | | | |── centerpoint_preprocess_5dim.json # 前处理配置脚本
centerpoint_pointpillar_nuscenes的前处理可以部署到 CPU 或 DSP 上,这取决于配置文件 centerpoint_pointpillar_5dim.json 中是否配置对应参数 run_on_dsp。 如果配置文件中的 run_on_dsp 设置为 true ,那么前处理将在 DSP 上运行,否则它在 CPU 上运行。
前处理单帧延时评测
执行 sh latency.sh 脚本可对前处理的单帧延迟情况进行测试。如下所示:
I0807 15:21:15.665417 21457 output_plugin.cc:95] Pre process latency: [avg: 11.338ms, max: 14.744ms, min: 8.200ms], Infer latency: [avg: 49.327ms, max: 51.065ms, min: 48.409ms], Post process latency: [avg: 9.681ms, max: 9.886ms, min: 9.544ms].
其中:
Pre process 表示前处理耗时。
Infer 表示模型推理耗时。
Post process 表示后处理耗时。
后处理
后处理集成主要有2个步骤,以CenterNet模型集成为例:
-
增加后处理文件ptq_centernet_post_process_method.cc,以及头文件ptq_centernet_post_process_method.h。
-
增加模型运行脚本及配置文件。
后处理文件及头文件添加
后处理代码文件可直接复用src/method目录下任意后处理文件,主要修改 InitFromJsonString 函数,以及 PostProcess 函数即可。
InitFromJsonString 函数主要是读取workflow.json中的后处理相关的参数配置,您可自定义设置相应的输入参数。
PostProcess 函数主要完成后处理的逻辑。
后处理文件 ptq_centernet_post_process_method.cc 放置于 ai_benchmark/code/src/method/ 路径下,头文件 ptq_centernet_post_process_method.h 放置于 ai_benchmark/code/include/method/ 路径下:
|── ai_benchmark
| |── code # 示例源码
| | |── include
| | | |── method # 在此文件夹中添加头文件
| | | | |── ptq_centernet_post_process_method.h
| | | | |── ...
| | |── src
| | | |── method # 在此文件夹中添加后处理.cc文件
| | | | |── ptq_centernet_post_process_method.cc
| | | | |── ...
模型运行脚本及配置文件添加
模型运行脚本及配置文件完成添加后的目录结构参考如下:
如需在 DSP 上部署,需要执行 dsp_deploy.sh 脚本部署 DSP 环境,详细介绍请参考该示例文件夹下的 README.md 中的介绍。
辅助工具
日志
日志主要包括 示例日志 和 DNN日志 两部分。
其中示例日志是指交付包示例代码中所应用的日志,DNN日志是指嵌入式runtime库中的日志。
根据不同的需求可以设置不同的日志。
示例日志
- 日志级别
示例日志主要采用glog中的vlog,主要分为四个自定义级别:
- 0:SYSTEM级别,该级别日志主要用于输出报错信息。
- 1:REPORT级别,该级别日志在示例代码中主要用于输出性能数据。
- 2:DETAIL级别,该级别日志在示例代码中主要用于输出系统当前状态信息。
- 3:DEBUG级别,该级别日志在示例代码中主要用于输出调试信息。
- 日志级别设置
日志处理机制说明:日志级别等级由高到低默认顺序为DEBUG>DETAIL>REPORT>SYSTEM,级别越高,输出日志越多。
即设置高等级,则会输出自身及低于自身等级的日志。
在运行示例时,日志级别需要通过 log_level 参数来进行设置。 例如,指定 log_level=0,则会输出SYSTEM级别日志。指定 log_level=3,则会输出DEBUG、DETAIL、REPORT及SYSTEM级别日志。
dnn 日志
关于 dnn 日志的配置,请阅读模型推理API手册章节中的 配置信息 一节内容。
算子耗时
概述
对OP性能的统计是通过设置 HB_DNN_PROFILER_LOG_PATH 环境变量实现的。对该变量的类型和取值说明如下:
HB_DNN_PROFILER_LOG_PATH=${path}:表示OP节点dump的输出路径,程序正常运行完退出后,产生profiler.log文件。
示例
以mobilenetv1模型为例,开启单线程同时RunModel,设置 export HB_DNN_PROFILER_LOG_PATH=./,则profiler.log文件中会输出OP的性能数据。
其中包含 model_latency 和 task_latency,model_latency中输出了模型每个OP运行所需要的耗时情况,task_latency中输出了模型运行中各个task模块的耗时情况。
dump工具
通过开启 HB_DNN_DUMP_PATH 这个环境变量可以dump出模型推理过程中每个节点的输入和输出。
通过dump工具,可以排查模拟器和真机是否存在一致性问题:即相同模型,相同输入,真机和模拟器的输出结果是否完全相同。