编译及运行应用(昇腾910 AI处理器)
- 模型转换。
- 以运行用户登录开发环境。
- 参考《CANN 开发辅助工具指南》中的“ATC工具使用指南”章节,准备环境,包括获取工具、设置环境变量。
- 准备数据。
您可以从以下链接中获取yolov3网络的模型文件(*.prototxt)、预训练模型文件(*.caffemodel),并以运行用户将获取的文件上传至开发环境的“样例目录/caffe_model”目录下。如果目录不存在,需要自行创建。
- 切换到YOLOV3_dynamic_batch_detection_picture样例目录,将yolov3网络转换为适配昇腾AI处理器的离线模型(*.om文件)。
如果模型推理的输入数据是动态Batch的,执行如下命令转换模型:
atc --framework=0 --model=caffe_model/yolov3.prototxt --weight=caffe_model/yolov3.caffemodel --output=model/yolov3_dynamic_batch --input_shape="data:-1,3,416,416" --input_format=NCHW --dynamic_batch_size="1,2,4,8" --soc_version=${soc_version}
如果模型推理的输入数据是动态分辨率的,执行如下命令转换模型:
atc --framework=0 --model=caffe_model/yolov3.prototxt --weight=caffe_model/yolov3.caffemodel --output=model/yolov3_dynamic_hw --input_shape="data:1,3,-1,-1" --input_format=NCHW --dynamic_image_size="416,416;832,832;1248,1248" --soc_version=${soc_version}
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
可从ATC安装路径的“atc/data/platform_config”目录下查看昇腾AI处理器的版本,对应“*.ini”文件的名字(不带.ini后缀)即为soc_version。
- --output:生成的yolov3_dynamic_batch.om或者yolov3_dynamic_hw.om文件存放在“样例目录/model”目录下。建议使用命令中的默认设置,否则在编译代码前,您还需要修改sample_process.cpp中的omModelPath参数值。
string omModelPath = "../model/yolov3_dynamic_batch.om"; ...... string omModelPath = "../model/yolov3_dynamic_hw.om";
关于各参数的详细解释,请参见《CANN 开发辅助工具指南》中的“ATC工具使用指南”章节。
- --soc_version:昇腾AI处理器的版本,请根据实际情况替换。
- 以运行用户登录开发环境,并切换到YOLOV3_dynamic_batch_detection_picture样例所在的目录。
- 编译代码。
- 设置环境变量,编译脚本src/CMakeLists.txt通过环境变量所设置的头文件、库文件的路径来编译代码。
如下为设置环境变量的示例,请将$HOME/Ascend/ascend-toolkit/latest替换为FwkACLlib安装包的实际安装路径。
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=$HOME/Ascend/ascend-toolkit/latest/fwkacllib/lib64/stub
设置环境变量后,还需修改src/CMakeLists.txt文件中的如下配置段,将“acllib”修改为“fwkacllib”。
# Header path include_directories( ${INC_PATH}/acllib/include/ ../inc/ )
使用“$HOME/Ascend/ascend-toolkit/latest/fwkacllib/lib64/stub”目录下的*.so库,是为了编译基于AscendCL接口的代码逻辑时,不依赖其它组件(例如Driver)的任何*.so库。
编译通过后,在Host上运行应用时,通过配置环境变量,应用会链接到Host上“$HOME/Ascend/nnae/latest/fwkacllib/lib64”目录下的*.so库,运行时会自动链接到依赖其它组件的*.so库。
- 在样例目录下,创建目录用于存放编译文件,例如,本文中,创建的目录为“build/intermediates/host”。
mkdir -p build/intermediates/host
- 切换到“build/intermediates/host”目录,执行cmake生成编译文件。
“../../../src”表示CMakeLists.txt文件所在的目录,请根据实际目录层级修改。
基于运行环境的操作系统架构,配置的环境变量不同:
- 当开发环境与运行环境操作系统架构相同时,执行如下命令编译。
cd build/intermediates/host cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
- 当开发环境与运行环境操作系统架构不同时,执行如下命令交叉编译。例如,当开发环境为X86架构,运行环境为AArch64架构时,执行以下命令进行交叉编译。
cd build/intermediates/host cmake ../../../src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE
- 当开发环境与运行环境操作系统架构相同时,执行如下命令编译。
- 执行make命令,生成的可执行文件main在“样例目录/out”目录下。
make
- 设置环境变量,编译脚本src/CMakeLists.txt通过环境变量所设置的头文件、库文件的路径来编译代码。
- 准备测试数据。
切换到“YOLOV3_dynamic_batch_detection_picture样例目录/data”目录下,执行tools_generate_data.py脚本,可以在“YOLOV3_dynamic_batch_detection_picture样例目录/data”目录下生成各种不同Batch或者不同分辨率场景下的的测试bin文件。
示例命令如下,可以生成Batch数为1,通道数为3,宽、高都为416像素,数据类型是float32的bin文件input_float32_1x3x416x416.bin.in。python3.7 tools_generate_data.py input -s [1,3,416,416] -r [2,3] -d float32
tools_generate_data.py脚本参数说明如下:
- input:bin文件前缀名。
- s:输入数据的Shape信息。
- r:每个通道像素取值范围,该取值范围中的最小值、最大值必须在[0,255]范围。执行tools_generate_data.py脚本,会在-r参数指定的取值范围内随机生成每个通道的像素值。
- d:数据格式,支持int8、uint8、float16、float32、int32、uint32。
- 运行应用。
- 以运行用户将开发环境的YOLOV3_dynamic_batch_detection_picture样例目录及目录下的文件上传到运行环境(Host),例如“$HOME/acl_yolov3_dynamic_batch”。
- 以运行用户登录运行环境(Host)。
- 设置环境变量。如下为设置环境变量的示例,请根据实际安装情况替换路径。
export LD_LIBRARY_PATH=$HOME/Ascend/nnae/latest/fwkacllib/lib64
- 切换到可执行文件main所在的目录,例如“acl_yolov3_dynamic_batch/out”,给该目录下的main文件加执行权限。
chmod +x main
- 切换到可执行文件main所在的目录,例如“acl_yolov3_dynamic_batch/out”,运行可执行文件。
- 动态Batch场景下,执行如下命令,可执行程序的入参需替换为实际的Batch数,必须为模型转换时通过--dynamic_batch_size参数指定的其中一档Batch数:
./main 1
执行成功后,在屏幕上的关键提示信息示例如下:
[INFO] 1: ./main [param], [param] is dynamic batch. It should be 1,2,4 or 8. For example: ./main 8; [INFO] 2: ./main [param1] [param2], [param1] is dynamic height. [param1] is dynamic width. It should be 416, 416; 832, 832; 1248, 1248. For example: ./main 416 416 [INFO] acl init success. [INFO] set device 0 success. [INFO] create context success. [INFO] create stream success. [INFO] get run mode success. [INFO] load model ../model/yolov3_dynamic_batch.om success. [INFO] create model description success. [INFO] start to process file: ../data/input_float32_1x3x416x416.bin.in [INFO] create model output success. [INFO] set dynamic batch size[1] success. [INFO] model input num[2], output num[3]. [INFO] start to print input tensor desc: [INFO] index[0]: name[data], inputSize[16613376], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[-1][3][416][416] [INFO] index[1]: name[ascend_mbatch_shape_data], inputSize[8], fotmat[2], dataType[9] [INFO] dimcount:[1],dims:[1] [INFO] start to print output tensor desc: [INFO] index[0]: name[layer82-conv:0:layer82-conv], outputSize[1379040], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[8][255][13][13] [INFO] index[1]: name[layer94-conv:0:layer94-conv], outputSize[5516160], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[8][255][26][26] [INFO] index[2]: name[layer106-conv:0:layer106-conv], outputSize[22064640], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[8][255][52][52] [INFO] start to print model dynamic batch info: [INFO] dynamic batch count:[4],dims:{[1][2][4][8]} [INFO] start to print model current output shape info: [INFO] index:0,dims:[1][255][13][13] [INFO] index:1,dims:[1][255][26][26] [INFO] index:2,dims:[1][255][52][52] [INFO] model execute success. [INFO] dump data success. [INFO] unload model success, modelId is 1. [INFO] execute sample success. [INFO] end to destroy stream. [INFO] end to destroy context. [INFO] end to reset device: 0. [INFO] end to finalize acl.
- 动态分辨率场景下,可执行程序的第一个、第二个入参需要分别替换为实际的高、宽,必须为模型转换时通过--dynamic_image_size参数指定的其中一档分辨率:
./main 416 416
执行成功后,在屏幕上的关键提示信息示例如下:
[INFO] 1: ./main [param], [param] is dynamic batch. It should be 1,2,4 or 8. For example: ./main 8; [INFO] 2: ./main [param1] [param2], [param1] is dynamic height. [param1] is dynamic width. It should be 416, 416; 832, 832; 1248, 1248. For example: ./main 416 416 [INFO] acl init success. [INFO] set device 0 success. [INFO] create context success. [INFO] create stream success. [INFO] get run mode success. [INFO] load model ../model/yolov3_dynamic_hw.om success. [INFO] create model description success. [INFO] start to process file: ../data/input_float32_1x3x416x416.bin.in [INFO] create model input success. [INFO] create model output success. [INFO] set dynamic hw[416, 416] success. [INFO] model input num[2], output num[3]. [INFO] start to print input tensor desc: [INFO] index[0]: name[data], inputSize[18690048], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[1][3][-1][-1] [INFO] index[1]: name[ascend_mbatch_shape_data], inputSize[16], fotmat[2], dataType[9] [INFO] dimcount:[1],dims:[2] [INFO] start to print output tensor desc: [INFO] index[0]: name[layer82-conv:0:layer82-conv], outputSize[1551420], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[1][255][39][39] [INFO] index[1]: name[layer94-conv:0:layer94-conv], outputSize[6205680], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[1][255][78][78] [INFO] index[2]: name[layer106-conv:0:layer106-conv], outputSize[24822720], fotmat[0], dataType[0] [INFO] dimcount:[4],dims:[1][255][156][156] [INFO] start to print model dynamic hw info: [INFO] dynamic hw count:[3],dims:{[416, 416][832, 832][1248, 1248]} [INFO] start to print model current output shape info: [INFO] index:0,dims:[1][255][13][13] [INFO] index:1,dims:[1][255][26][26] [INFO] index:2,dims:[1][255][52][52] [INFO] model execute success. [INFO] dump data success. [INFO] unload model success, modelId is 1. [INFO] destroy model description success. [INFO] destroy model input success. [INFO] destroy model output success. [INFO] execute sample success. [INFO] end to destroy stream. [INFO] end to destroy context. [INFO] end to reset device: 0.
- 动态Batch场景下,执行如下命令,可执行程序的入参需替换为实际的Batch数,必须为模型转换时通过--dynamic_batch_size参数指定的其中一档Batch数: