Vitis-AI 编译使用minist解读
由于TVM框架目前未找到合适的方法部署神经网络(pytorch框架)在FPGA上,故想要单独尝试Vitis-AI编译网络流程。一下是官方的以手写数字识别的vitis-ai pytorch流的指导。记录执行过程并分析。
整体的flow如下图所示:
首先利用数据集训练得到模型文件,然后用校准数据和模型共同输入到量化器中,然后编译生成的.xmodel得到可以再FPGA上运行的.xmodel文件。最后在目标FPGA平台上使用生成的.xmodel模型文件。
一、训练
该脚本将执行 CNN 的训练,并将训练的浮点模型另存为 ./build/float_model 文件夹中的 .pth 文件。即f_model.pth
# folders
export BUILD=./build
export LOG=${BUILD}/logs
mkdir -p ${LOG}
# run training
python -u train.py -d ${BUILD} 2>&1 | tee ${LOG}/train.log
二、量化
Xilinx DPU 系列 ML 加速器执行的模型和网络的参数采用整数格式,因此我们必须将经过训练的浮点检查点转换为定点整数检查点 - 此过程称为量化。
量化完成后,可以在 ./build/quant_model 文件夹中找到量化模型。
# quantize & export quantized model
python -u quantize.py -d ${BUILD} --quant_mode calib 2>&1 | tee ${LOG}/quant_calib.log
python -u quantize.py -d ${BUILD} --quant_mode test 2>&1 | tee ${LOG}/quant_test.log
```
  量化模式分为量化和评估,可以在评估中看到量化对模型推理准确性的影响。事实上,不管是test还是calib模式,都会对量化的模型进行评估,唯一不同的是,calib模式会导出量化参数,而test模式会导出量化后的模型。
``` python
# export config
if quant_mode == 'calib':
quantizer.export_quant_config()
if quant_mode == 'test':
quantizer.export_xmodel(deploy_check=False, output_dir=quant_model)
```
  然而,比较令人费解的是,两次执行改脚本的量化评估结果却不同:其次是量化之后的两次评估结果都比训练3轮的评估结果要好。可能是因为改模型网络以及输入数据比较简单。

----------划重点---------------------------------------------
  另外,亲测pytorch1.7版本(默认镜像是1.4版本)在导入会报如下错误:
undefined symbol: _ZN6caffe28TypeMeta21_typeMetaDataInstanceIN3c108BFloat16EEEPKNS_6detail12TypeMetaDataEv

  该Bug在vitis-ai用户指南中提到,解决方法是先导入pytorch_nndct,后导入torch。似乎没用。
  按照官方的/opt/viitis_ai/scripts/replace_pytorch.sh,脚本生成新的pytorch环境我不知道为啥还会有问题,按照脚本在原来的基础上删了原来的torch以及vai_q_pytorch,用1.7的torch环境编译了vai_q_pytorch,之后可以正常使用1.7版本torch进行量化
### 三、编译
  编译后的模型会保存在 ./build/compiled_model 文件夹。并以目标命名。
``` bash
# compile for target boards
source compile.sh zcu102 ${BUILD} ${LOG}
# make target folders
python -u target.py --target zcu102 -d ${BUILD} 2>&1 | tee ${LOG}/target_zcu102.log
if [ $1 = zcu102 ]; then
ARCH=/opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU102/arch.json
TARGET=zcu102
echo "-----------------------------------------"
echo "COMPILING MODEL FOR ZCU102.."
echo "-----------------------------------------"
四、导出
该脚本将执行以下操作:target.py
- 创建一个名为 ./build/target_<board_name> 的文件夹。
- 将相应的已编译模型复制到 ./build/target_<board_name> 文件夹。
- 将 Python 应用程序代码复制到 ./build/target_<board_name> 文件夹。
- 将 MNIST 测试数据集转换为 PNG 图像文件。
图像数由命令行参数设置,该参数默认为 10000。–num_images
# compile for target boards
source compile.sh zcu102 ${BUILD} ${LOG}
# make target folders
python -u target.py --target zcu102 -d ${BUILD} 2>&1 | tee ${LOG}/target_zcu102.log
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 不听话的兔子君!