专栏硬件技术苏大培训四期(726)模型PTQ/QAT量化+上板操作手册

苏大培训四期(726)模型PTQ/QAT量化+上板操作手册

默认166402024-08-06
236
0

环境部署

打开MobaXterm,新建Session,点击左上角SSH。

登入服务器(服务器地址为192.168.8.182),用户名为自己名字拼音(eg:yangyifei),端口号为22,默认进入以自己姓名命名的文件夹,登陆密码:Horbot_1。

解压文件夹内的j6-3.0.17-py310-11.4.tgz到当前目录,得到horizon_j6_open_explorer_v3.0.17-py310_20240705 。

查看本地镜像名称和版本号。

利用已经加载的本地的镜像启动当前OE版本所对应的Docker容器,并挂载OE包,其中"--rm"意味着一旦通过exit退出当前容器,当前容器会自动删除。

浮点模型准备

进入目录/open_explorer# cd samples/ai_toolchain/horizon_model_convert_sample/,可以看到OE包内很多示例模型,如分类、检测、语义分割,我们以04_detection中的第一个模型01_yolov2_darknet19为例,进行浮点模型准备,执行其中的 00_init.sh 脚本来获取示例对应的校准数据集和原始模型。
00_init.sh 内容如下

执行结果打印如下

模型验证

在浮点模型准备好之后,我们建议先进行快速的模型验证,以确保其符合计算平台的支持约束,当然OE包内的示例模型都符合计算平台的支持约束, 01_check.sh 因此可省略。
01_check.sh 内容如下
hb_compile 工具在验证模型时需要使用到的主要参数如下

参数说明--march用于指定需要适配的处理器类型,J6E处理器请设置为 nash-e,J6M处理器需设置为 nash-m。--proto此参数仅在model-type指定caffe时有效,取值为caffe模型的 prototxt 文件名称; onnx模型无需配置该参数。--model在模型为caffe模型时,取值为Caffe模型的caffemodel 文件名称;在模型为onnx模型时,取值为 ONNX模型 文件名称。

校准数据预处理

PTQ方案的校准数据一般是从训练集或验证集中筛选100份左右(可适当增减)的典型数据,并应避免非常少见的异常样本,如纯色图片、不含任何检测或分类目标的图片等(图片已经OE包内准备好,不需要大家自己挑选)。筛选出的校准数据还需进行与模型inference前一致的预处理操作,处理后保持与原始模型一样的数据类型( input_type_train )、layout ( input_layout_train )和尺寸( input_shape )。
执行 02_preprocess.sh 脚本完成校准数据的预处理。
02_preprocess.sh 内容如下:

执行结果打印如下

模型转换

  准备完校准数据和yaml配置文件后,即可执行03_build.sh一步命令完成模型解析、图优化、校准、量化、编译的全流程转换。
03_build.sh内容如下:

执行结果打印如下(部分)

转换完成后,会在 ../01_yolov2_darknet19/model_output (yaml文件配置路径)下保存如下文件

板端快速性能验证

将 ../01_yolov2_darknet19/model_output中的yolov2_darknet19_608x608_nv12.hbm 拷贝到板端测试其FPS和latency。

板端创建个人工作空间

服务器端拷贝hbm文件到板端个人工作空间内

板端模型信息获取

当模型输入张量属性 validShape 或 stride 中含有 -1 时,代表该模型的输入是动态的,您需要根据实际输入对动态维度进行填写。
stride 填写时应遵循以下规则:
  • 应确保填写数值满足 ??????[???]>=??????[???+1]∗??????ℎ???.?????????????[???+1],其中 idx 代表当前维度。
  • 对于 Y 和 UV 输入的 stride, 由于存在一些硬件约束,需要动态维度保证32对齐,这意味着您需要根据 stride 对输入进行对齐处理。

对于yolov2_darknet19_608x608_nv12来说,stride计算过程如下:

对于input[0],有:

stride[3] = 1;

stride[2] = 1;

stride[1] = ALIGN_32(stride[2] * validShape.dimensionSize[2]) = ALIGN_32(1 * 608) = 608;

stride[0] = ALIGN_32(stride[1] * validShape.dimensionSize[1]) = ALIGN_32(608 * 608) = 369964;

对于input[1],有:

stride[3] = 1;

stride[2] = 2;

stride[1] = ALIGN_32(stride[2] * validShape.dimensionSize[2]) = ALIGN_32(2 * 304) = 608;

stride[0] = ALIGN_32(stride[1] * validShape.dimensionSize[1]) = ALIGN_32(304* 608) = 184832;

板端测试量化、编译后的模型性能

执行结果打印如下(部分)

QAT对应操作

QAT量化参考

手把手教你利用算法工具链训练、量化、编译、可视化J6参考算法BEVFormer

在获得相关模型的.hbm文件后,将其拷贝到板端,板端操作见上。

硬件技术
社区征文技术深度解析
评论0
0/1000