获取应用源码 -> 获取模型和测试图片 -> 模型转换 -> 编译源码 -> 应用
从sample仓下载模型
名称随意,协议SSH,主机填公网ip,端口22,用户身份验证->用户名为root,填写相应密码。SSH->隧道->添加(方向Dynamic, 源主机localhost)
主机(localhost) -> 选择刚才的代理服务器 -> 使用身份验证代理
切换到root用户
. /usr/local/Ascend/ascend-toolkit/set_env.sh
export PATH=/usr/local/python3.7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
上述环境变量只在当前窗口生效,用户可以将上述命令写入~/.bashrc文件,使其永久生效,方法如下:
以安装用户在任意目录下执行vi ~/.bashrc,在该文件最后添加上述内容。
执行:wq!命令保存文件并退出。
执行source ~/.bashrc使环境变量生效。
clone gitee下的 samples/ cplusplus / level2_simple_inference / 1_classification / resnet50_firstapp
cd至该目录
下载两个model链接放置在model文件夹下, 下载图片放置在data文件夹下
执行atc --model=model/resnet50.prototxt --weight=model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascend310
转换模型为.om模型
给sample_build.sh执行权限:chmod +x sample_build.sh
为sample_build.sh设置环境变量,使用view sample_build.sh
可以看到 该文件需要APP_SOURCE_PATH
和-DCMAKE_CXX_COMPILER
两个环境变量。先后执行
export APP_SOURCE_PATH=/root/resnet50_firstapp/
export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest/
查找Acl头文件
export NPU_HOST_LIB=$DDK_PATH/acllib/lib64/stub/
查找Acl库文件
然后可以执行样例的编译脚本 ./sample_build.sh
在运行之前需要安装pillow库,否则结果会不正确。因为pillow直接下载会特别慢,需要配置镜像源
mkdir ~/.pip
cd ~/.pip
vi pip.conf
[global]
#以华为源为例,请根据实际情况进行替换。
index-url = https://mirrors.huaweicloud.com/repository/pypi/simple
trusted-host = mirrors.huaweicloud.com
timeout = 120
然后pip3 install pillow
最后在项目目录下./sample_run.sh
,得到结果
data
.jpg
inc
model_process.h:模型处理相关函数的头文件
sample_process.h:资源初始化/销毁相关函数的头文件
utils.h:声明公共函数的头文件(如文件读取函数)script
transferPc.py 将.jpg转换为.bin
src
acl.json:系统初始化的配置文件
CMakeLists.txt:编译脚本
main.cpp:实现图片分类功能
model_process.cpp:模型处理相关函数的实现文件
sample_process.cpp:资源初始化/资源销毁的实现文件
utils.cpp:公共函数的实现文件.project :工程信息文件,包括工程类型、工程描述、运行目标设备等
CMakeLists.txt:编译脚本。调用src目录下的CMakeLists文件
和resnet50_firstapp一样,需要下载两个model文件
每次转换模型(执行atc命令)前都需要 . /usr/local/Ascend/ascend-toolkit/set_env.sh
然后转换模型atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascend310 --input_format=NCHW --input_fp16_nodes=data --output_type=FP32 --out_nodes=prob:0
随后生成测试图片,存放着data目录下,并执行scripts/tranferPic.py将图片转换为.bin,并调整为模型需要的分辨率。
scripts/tranferPic.py源码中,列出图片的命令为
os.listdir('./')
,意味着需要进到data目录下执行python3 ../script/transferPic.py
,否则会查找不到图片
配置程序编译依赖的头文件与库文件/路径
编译脚本会根据**{DDK_PATH}环境变量值/acllib/include/acl”目录查找编译依赖的头文件,根据{NPU_HOST_LIB}**环境变量指向的目录查找编译依赖的库文件。
我在~/.bashrc中添加了两行
创建目录用于存放编译文件,例如,本文中,创建的目录为“build/intermediates/host“。
mkdir -p build/intermediates/host
-p 命令表示递归创建目录
切换到host目录下,执行cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
在运行环境和开发环境在同一台服务器时,可在out目录下直接执行./main
,否则要以运行用户将开发环境的样例目录及目录下的文件上传到运行环境,然后以运行用户登录运行环境,再 chmod +x main
赋予执行权限
可以看到其中
初始化AscendCL,申请运行管理资源(context,stream,device)
加载模型
运行模型
卸载模型
释放运行管理资源。去初始化AscendCL
sample目录为vpc_resnet50_imagenet_classification
在本样例中,主要实现
YUV也是一种颜色的编码方式
data
.jpg
inc
model_process.h:
sample_process.h:
utils.h:
dvpp_h:数据预处理相关函数的文件
singleOp_process.h:单算子执行相关函数的头文件src
acl.json
CMakeLists.txt
main.cpp
model_process.cpp
sample_process.cpp
singleOp_process.cpp:单算子执行相关函数的实现文件
utils.cpp.project :工程信息文件,包括工程类型、工程描述、运行目标设备等
CMakeLists.txt:编译脚本。调用src目录下的CMakeLists文件caffe_model
aipp.cfg:带色域转换参数的配置文件,模型转换时使用
out
op_models
op_list.json:Cast算子和ArgMaxD算子的算子描述信息
.project
CMakeLists.txt
atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --soc_version=Ascend310 --insert_op_conf=caffe_model/aipp.cfg --output=model/resnet50_aipp
,注意转换前先set_env将Cast和ArgMaxD两个算子的算子描述信息(.json文件)编译成适配昇腾AI处理器的离线模型(.om文件),用于运行算子时使用(将json转为om)
atc --singleop=out/op_models/op_list.json --soc_version=Ascend310 --output=out/op_models
模型参数
算子信息文件(json)
# Cast算子:将推理结果的数据类型从float32转为float16
[
{
"op": "Cast",
"input_desc": [
{
"format": "ND",
"shape": [1000],
"type": "float"
}
],
"output_desc": [
{
"format": "ND",
"shape": [1000],
"type": "float16"
}
],
"attr" : [
{
"name": "truncate",
"type": "bool",
"value": false
},
{
"name": "dst_type",
"type": "int",
"value": 1
}
]
},
# ArgMaxD算子,从推理结果中查找最大置信度的类别标签
{
"op": "ArgMaxD",
"input_desc": [
{
"format": "ND",
"shape": [1000],
"type": "float16"
}
],
"output_desc": [
{
"format": "ND",
"shape": [1],
"type": "int32"
}
],
"attr": [
{
"name": "dimension",
"type": "int",
"value": 0
}
]
}
]
mkdir -p build/intermediates/host
cd build/intermediates/host
cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
make
./main
ACL封装底层昇腾计算服务接口(见2.1.2——1),ACLlie是对ACL应用开发接口部分能力的封装