可执行脚本类型进程应用
更新时间: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目录,示例目录如下所示:
 
                Plain Text
                
            
            1.EasyEdge-Linux-arm
2├── RES                  # 模型资源文件夹,一套模型适配不同硬件、OS和部署方式
3│   ├── model            # 模型结构文件 
4│   ├── params           # 模型参数文件
5│   ├── label_list.txt   # 模型标签文件
6│   ├── infer_cfg.json   # 模型前后处理等配置文件
7├── ReadMe.txt
8├── cpp                  # C++ SDK 文件目录
9    └── baidu_easyedge_linux_cpp_aarch64_ARM_gcc5.4_v1.5.2_20220608.tar.gz
10        ├── bin          # 可直接运行的二进制文件
11        ├── include      # 二次开发用的头文件 
12        ├── lib          # 二次开发用的所依赖的库
13        ├── src          # 二次开发用的示例工程
14        └── thirdparty   # 第三方依赖
15└── python  # Python SDK 文件目录
            
- 图像分类、物体检测类型的开源模型SDK都支持本文的部署方案
 - OCR 类型模型不是上述目录结构,不支持本文的部署方案
 
3、可执行脚本类型进程应用运行逻辑
- 程序包主要由可执行脚本与程序入口配置文件组成,在入口配置文件当中定义可执行脚本名称。
 - 可以在创建程序包的时候就引入开源模型SDK,也可以在创建进程应用的时候,通过卷配置引入开源模型SDK配置项。为了让程序包更加通用,此处我们选择后者,即为模型SDK文件创建独立的配置项。
 - 进程应用部署以后,会下发程序包,以及开源模型SDK配置项。
 - 
边缘计算框架baetyl会下载程序包和开源模型SDK文件。然后根据入口配置文件的定义,在边缘侧执行可执行脚本,在可执行脚本当中定义业务处理逻辑,包含:
- 
检查边缘测试开源模型SDK是否编译完成:
- 如果已经完成编译,跳过编译环节,直接运行模型二进制程序
 - 
如果没有完成编译
- 解压模型SDK文件
 - 执行编译
 - 运行编译得到的模型二进制程序
 
 
 
 - 
 - 编译需要本地安装make、cmake、g++等环境,如果没有需要提前安装,可以使用以下命令查看是否有安装。
 
                Bash
                
            
            1#查看cmake版本
2cmake --version
3cmake version 3.16.3make --version
4#查看make版本
5make --version
6GNU Make 4.2.1
7#查看g++版本
8g++ --version
9g++ (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文件
 
                Bash
                
            
            1# 授予可执行权限
2chmod +x bootstrap.sh
3# 查看文件权限
4ls -l bootstrap.sh
5-rwxr-xr-x 1 root root 5916 Sep 29 19:37 bootstrap.sh
6# 压缩为zip文件
7zip bootstrap.sh.zip bootstrap.sh
            - 将bootstrap.sh.zip上传至个人的对象存储,设置为公有云读并记录它的http下载地址,这个下载地址后面会用到。
 - 针对飞桨开源模型的SDK的运行脚本可以下载bootstrap.sh.zip
 
4.2 程序入口配置文件
- 
整理程序入口配置文件:
- 文件名:
program.yml - 文件内容:
entry: "bootstrap.sh" 
 - 文件名:
 - 将program.yml压缩为zip文件
 
                Bash
                
            
            1zip 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
                Bash
                
            
            1# 查询进程应用服务状态
2systemctl | grep paddle
3# 返回结果
4baetyl-edge.paddle-opensource-sdk-edge-serving.1664451447xmf2rs.paddle-opensource-sdk-edge-serving.1.service  loaded active running   3333
            - 边缘查看应用日志文件
 
                Bash
                
            
            1# 执行命令,如果应用名称是paddle-opensource-sdk-edge-serving,可以直接使用如下命令
2tail -f /var/lib/baetyl/log/baetyl-edge/paddle-opensource-sdk-edge-serving/1*/*.log
3# 返回日志
4/usr/bin/ld: ../../../thirdparty/opencv/lib/libopencv_imgproc.so: .dynsym local symbol at index 9 (>= sh_info of 3)
5[100%] Built target easyedge_serving
6+ [[ -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 ]]
7+ start_serving
8+ 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:
9+ '[' -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 ']'
10+ 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::
11+ /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
122022-09-29 19:37:47,541 INFO [EasyEdge] 281472910028816 EasyEdge Linux Development Kit 1.5.2(Build ARM 20220608) Release
132022-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
 
