可执行脚本类型进程应用
更新时间:2024-04-22
1、概述
在进程应用概述当中提到,进程应有两类,本文重点讲解可执行脚本类型进程应用,并以如何将 飞桨开源模型的SDK 构建成BIE进程应用为例来进行详细说明。
2、飞桨开源模型SDK说明
- 百度AI官网 提供了多个免费的 飞桨开源模型的SDK 供用户测试使用,针对不同平台及芯片架构提供了不同的模型SDK。
- 用户可以基于自身设备架构下载对应的模型SDK。
- 本文将使用 YoloV3_MobileNetV3 模型 Linux操作系统 下适配 通用ARM芯片 的模型SDK EasyEdge-Linux-YoloV3_MobileNetV3_large-arm-SDK.zip 来做详细讲解。
- 模型SDK要被可执行脚本运行,需要支持CPP编译,因此模型SDK的目录当中必须包含cpp目录,并且cpp目录当中包含src目录,示例目录如下所示:
.EasyEdge-Linux-arm
├── RES # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
│ ├── model # 模型结构文件
│ ├── params # 模型参数文件
│ ├── label_list.txt # 模型标签文件
│ ├── infer_cfg.json # 模型前后处理等配置文件
├── ReadMe.txt
├── cpp # C++ SDK 文件目录
└── baidu_easyedge_linux_cpp_aarch64_ARM_gcc5.4_v1.5.2_20220608.tar.gz
├── bin # 可直接运行的二进制文件
├── include # 二次开发用的头文件
├── lib # 二次开发用的所依赖的库
├── src # 二次开发用的示例工程
└── thirdparty # 第三方依赖
└── python # Python SDK 文件目录
- 图像分类、物体检测类型的开源模型SDK都支持本文的部署方案
- OCR 类型模型不是上述目录结构,不支持本文的部署方案
3、可执行脚本类型进程应用运行逻辑
- 程序包主要由可执行脚本与程序入口配置文件组成,在入口配置文件当中定义可执行脚本名称。
- 可以在创建程序包的时候就引入开源模型SDK,也可以在创建进程应用的时候,通过卷配置引入开源模型SDK配置项。为了让程序包更加通用,此处我们选择后者,即为模型SDK文件创建独立的配置项。
- 进程应用部署以后,会下发程序包,以及开源模型SDK配置项。
-
边缘计算框架baetyl会下载程序包和开源模型SDK文件。然后根据入口配置文件的定义,在边缘侧执行可执行脚本,在可执行脚本当中定义业务处理逻辑,包含:
-
检查边缘测试开源模型SDK是否编译完成:
- 如果已经完成编译,跳过编译环节,直接运行模型二进制程序
-
如果没有完成编译
- 解压模型SDK文件
- 执行编译
- 运行编译得到的模型二进制程序
-
- 编译需要本地安装make、cmake、g++等环境,如果没有需要提前安装,可以使用以下命令查看是否有安装。
#查看cmake版本
cmake --version
cmake version 3.16.3make --version
#查看make版本
make --version
GNU Make 4.2.1
#查看g++版本
g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
如果使用CentOS 7.9操作系统,需要升级cmake版本只3.0+,升级GCC版本至9.0+
4、程序包依赖文件准备
4.1 可执行脚本
- 开发可执行脚本,假定脚本名称为bootstrap.sh
- 将bootstrap.sh授予可执行权限,并压缩为zip文件
# 授予可执行权限
chmod +x bootstrap.sh
# 查看文件权限
ls -l bootstrap.sh
-rwxr-xr-x 1 root root 5916 Sep 29 19:37 bootstrap.sh
# 压缩为zip文件
zip bootstrap.sh.zip bootstrap.sh
- 将bootstrap.sh.zip上传至个人的对象存储,设置为公有云读并记录它的http下载地址,这个下载地址后面会用到。
- 针对飞桨开源模型的SDK的运行脚本可以下载bootstrap.sh.zip
4.2 程序入口配置文件
-
整理程序入口配置文件:
- 文件名:
program.yml
- 文件内容:
entry: "bootstrap.sh"
- 文件名:
- 将program.yml压缩为zip文件
zip program.yml.zip program.yml
- program.yml.zip上传至个人的对象存储,设置为公有云读并记录它的http下载地址,这个下载地址后面会用到。也可以直接使用此处已经准备好的program.yml.zip
5、创建程序包
-
参考进程程序包教程,创建程序包paddle-opensource-sdk-edge-serving,通过HTTP方式引入前面创建的2个文件:
- 也可以直接下载(右键->另存为) 进程程序包-paddle-opensource-sdk-edge-serving.json,然后导入程序包。
6、创建进程应用
6.1 创建开源模型SDK配置项
前面提到,需要为每一个开源模型SDK创建独立的配置项,创建步骤如下:
- 点击配置管理
- 点击创建配置项
-
在配置项当中输入配置项信息
- 名称:
easyedge-linux-yolov3-mobilenetv3-large-arm-sdk.zip
- 类型:
http
- URL:
https://baidu-aiap.bj.bcebos.com/easyedge/open-model/46/EasyEdge-Linux-YoloV3_MobileNetV3_large-arm-SDK.zip
- 文件名:
EasyEdge-Linux-YoloV3_MobileNetV3_large-arm-SDK.zip
- 校验文件:
否
- 是否解压:
否
。因为上面bootstrap.sh当中包含解压操作,所以此处不需要边缘计算框架baetyl来解压。
- 名称:
- 如果不想从头手动创建,可以直接下载(右键-另存为) 配置项-easyedge-linux-yolov3-mobilenetv3-large-arm-sdk.zip.json,然后导入配置项
6.2 创建进程应用,关联程序包与模型SDK配置项
-
创建进程应用
- 名称:paddle-opensource-sdk-edge-serving
-
添加服务(程序包)
- 名称:paddle-opensource-sdk-edge-serving
- 程序包:关联前面创建的
paddle-opensource-sdk-edge-serving
-
卷配置:
- 卷名称:
paddle-model-file
- 类型:配置项
- 参数:关联前面创建的
easyedge-linux-yolov3-mobilenetv3-large-arm-sdk.zip
这个配置项 - 目录:
/mnt/easyedge
。因为上面bootstrap.sh当中默认使用了工作目录/mnt/easyedge
作为模型SDK文件的存放地址,所以此处填写/mnt/easyedge
。使用mnt/easyedge
也可以,都是相对于工作目录的相对路径。
- 卷名称:
- 点击确定
- 点击下一步
-
目标节点(可选环境,可以先创建应用,再部署至目标节点)
- 单节点匹配
- 选择一个进程节点
- 点击下一步
-
部署方式:
- 立即部署
- 点击创建
- 如果不想从头手动创建,可以直接下载(右键-另存为) 应用-paddle-opensource-sdk-edge-serving.json,然后导入应用
6.3 进程应用环境变量配置说明
本文引入的可执行脚本,支持传递以下环境变量:
- PARAMS_SDK_SRC:模型SDK挂载目录,不传默认为
/mnt/easyedge
- PARAMS_PORT:模型服务发布端口号,不传默认为
8701
- PARAMS_EXTRA_LD_LIBRARY_PATH:额外的LD_LIBRARY_PATH,不传默认为
空
- PARAMS_SERIAL_NUM:模型序列号,不传默认为
AAAA-AAAA-AAAA-AAAA
,开源模型SDK不校验模型序列号,因此可以直接使用默认。 - EDGE_SOC:部署硬件的SOC,仅对NVIDIA Jetson生效,如果是jetson硬件,此处必须填写
jetson
7、验证
- 云端查看边缘应用状态
- 边缘查看systemctl服务状态
我们知道创建的进程应用名称为paddle-opensource-sdk-edge-serving
,使用如下命令检索该服务的运行状态,可以看到状态是loaded active running
# 查询进程应用服务状态
systemctl | grep paddle
# 返回结果
baetyl-edge.paddle-opensource-sdk-edge-serving.1664451447xmf2rs.paddle-opensource-sdk-edge-serving.1.service loaded active running 3333
- 边缘查看应用日志文件
# 执行命令,如果应用名称是paddle-opensource-sdk-edge-serving,可以直接使用如下命令
tail -f /var/lib/baetyl/log/baetyl-edge/paddle-opensource-sdk-edge-serving/1*/*.log
# 返回日志
/usr/bin/ld: ../../../thirdparty/opencv/lib/libopencv_imgproc.so: .dynsym local symbol at index 9 (>= sh_info of 3)
[100%] Built target easyedge_serving
+ [[ -f /var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/src/demo_serving/build/demo_serving ]]
+ start_serving
+ local llp=/var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/lib:/var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/thirdparty/opencv/lib:/usr/local/lib:
+ '[' -f /var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/bin/edgekit_serving ']'
+ LD_LIBRARY_PATH=/var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/lib:/var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/thirdparty/opencv/lib:/usr/local/lib::
+ /var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/cpp/src/demo_serving/build/easyedge_serving /var/lib/baetyl/run/baetyl-edge/paddle-opensource-sdk-edge-serving/1664451447xmf2rs/paddle-opensource-sdk-edge-serving/1/sdk/EasyEdge-Linux-arm/RES '' 0.0.0.0 8701
2022-09-29 19:37:47,541 INFO [EasyEdge] 281472910028816 EasyEdge Linux Development Kit 1.5.2(Build ARM 20220608) Release
2022-09-29 19:37:47,786 INFO [EasyEdge] 281472910028816 HTTP is now serving at 0.0.0.0:8701, holding 1 instances
通过上述日志我们可以发现,该模型在边缘侧发布了一个端口为8701的HTTP服务,因此直接输入http://[ip]:8701 ,可以测试该模型服务是否正常启动。
8、多平台测试应用汇总
8.1 通用x86_64平台
- 确认 进程程序包-paddle-opensource-sdk-edge-serving.json 已经被导入
- 导入 配置项-easyedge-linux-yolov3-mobilenetv3-x86-sdk.zip.json
- 导入 应用-easyedge-linux-yolov3-mobilenetv3-x86.json
8.2 通用ARM64平台
yolov3-mobilenetv3
- 确认 进程程序包-paddle-opensource-sdk-edge-serving.json 已经被导入
- 导入 配置项-easyedge-linux-yolov3-mobilenetv3-large-arm-sdk.zip.json
- 导入 应用-easyedge-linux-yolov3-mobilenetv3-arm.json
pp-yolo-resnet50
- 确认 进程程序包-paddle-opensource-sdk-edge-serving.json 已经被导入
- 导入 配置项-easyedge-linux-pp-yolo-resnet50-arm-sdk.zip.json
- 导入 应用-linux-pp-yolo-resnet50-arm.json