前言
在 J5 芯片上我们更建议使用大尺寸模型来发挥芯片算力优势,对于小模型(边长 <= 256),推荐使用 batch 模式进行推理,因为在batch模式下,模型的参数在每个 batchsize 内(或编译时分析得到的 batchsize 上限)只会 load 一次,从而可以更有效地平衡计算/访存比,降低算力浪费,让模型的运行更加高效。
OE版本 | J5 v1.1.19 |
模型文件 | googlenet_4x224x224_nv12.bin |
batch | 4 |
输入尺寸(CHW) | 3x224x224 |
C++源码nv12_batch.cc位于该目录的code/02_advanced_samples/nv12_batch/src文件夹内,使用build_j5.sh脚本即可在Linux环境下编译生成板端可执行文件。
J5板端的执行脚本run_nv12_batch.sh位于j5/script/02_advanced_samples文件夹内,该脚本需要复制到板端执行。
googlenet_4x224x224_nv12.bin是已经经过了量化编译的混合异构模型,文件所在路径为j5/model/runtime/googlenet文件夹。如果希望使用自己编译的多batch模型,只需修改板端的执行脚本即可。
1 准备模型
详细的模型编译流程可参考 工具链用户手册 。后文会使用示例中提供的googlenet_4x224x224_nv12.bin模型进行介绍。
2 编译源码
3 传输上板
在C++源码编译完成后,将以下文件和文件夹复制到J5开发板上:
- j5/script/02_advanced_samples目录下的run_nv12_batch.sh脚本文件
- j5/script目录下的aarch64文件夹
- 多batch混合异构模型googlenet_4x224x224_nv12.bin文件
存放待推理图片的文件夹A
batch_model
├── 02_advanced_samples
│ └──run_nv12_batch.sh
├── model
│ └──googlenet_4x224x224_nv12.bin
├── aarch64
│ ├── bin
│ └── lib
├── pic
│ ├── zebra_cls.jpg
│ └── cat_cls.jpg
lib=../aarch64/lib
export BMEM_CACHEABLE=true
--model_file=../model/googlenet_4x224x224_nv12.bin
--image_file=../pic/zebra_cls.jpg,../pic/cat_cls.jpg,../pic/zebra_cls.jpg,../pic/cat_cls.jpg
--top_k=5
4 板端推理
示例C++源码解析
主函数
源码中,主函数的完整执行流程为:

下文介绍C++源码中调用的各种主要函数的功能,并贴出部分重要代码。
HB_CHECK_SUCCESS
用于检查函数是否执行出错。调用的时候,value处填写的是其他函数,若其他函数正确执行(如成功读取模型,成功申请内存等),则返回值为0,即value值等于0,该函数执行结束。若其他函数执行错误,则该函数会输出errmsg处填写的报错信息。
prepare_tensor_batch_separate/combine
依据模型信息,设定好输入张量和输出张量的大小,并为其申请BPU内存。
prepare_tensor_batch_separate函数用于循环和batch相同的次数为batch内的每张图片分别申请BPU内存。
prepare_tensor_batch_combine函数用于一次为整个batch的所有图片申请连续的BPU内存。
read_image_2_tensor_as_nv12_batch_separate/combine
函数会先依据模型信息确定好输入张量的长宽信息,之后先以bgr形式读取图片,转为nv12格式后,以内存拷贝的方式将图片信息存储在BPU内存的相应位置。
read_image_2_tensor_as_nv12_batch_separate函数使用循环的方式,重复batch次数依次读取该batch内每个张量的长宽信息。
read_image_2_tensor_as_nv12_batch_combine函数能一次获取整个batch所有输入张量的长宽信息。
get_topk_result
推理结果后处理,以队列的方式存储top5分类结果,会根据模型是否量化及量化方式的不同(SHIFT/SCALE)选择对应的计算方式。
总结
考虑到vio场景下的需求,源码以nv12输入为例进行了代码编写的示范,由于vio送入的数据可能是多个地址,因此在Infer1中使用了针对batch内不同图片分别分配内存的代码编写方法。当使用ddr方式读取图片时,多batch模型支持bgr/rgb/featuremap等数据的推理,用户可以按照Infer2的方式为整个batch的多张图像一次性分配连续的BPU内存。


