部署模型SDK至Atlas200DK
1、概述
本文将描述如何将EasyEdge SDK打包成一个二进制程序,然后通过BIE云边协同将二进制程序和模型文件下发至边缘节点并运行。
2、获取Atlas类型SDK
参考模型转换的章节,生成一个Atlas类型的SDK
进入我的模型界面,点击生成端模型。选择Atlas 200DK 和Linux操作系统,点击发布。

过几分钟,可以在离线计算SDK界面看到生成的Atlas SDK。

3、对原始SDK包的修改
原始sdk包没有demo_serving.cpp这个文件,需要增加这个文件,文件内容如下:
1/***************************************************************************
2
3 *
4 * Copyright (c) 2021 Baidu.com, Inc. All Rights Reserved
5 * **************************************************************************/
6
7/**
8
9 * @author Baidu
10 * @brief demo_serving
11 * **/
12
13#include <iostream>
14#include <algorithm>
15#include <thread>
16#include "easyedge/easyedge.h"
17#include "easyedge/easyedge_cann_config.h"
18
19struct DemoConfig {
20 bool is_batch_model = false;
21 int batch_size = 1;
22 int device_id = 0;
23} g_config;
24
25using namespace easyedge;
26
27int main(int argc, char *argv[]) {
28 if (argc < 2) {
29 std::cerr << "Usage: ./easyedge_serving {res_dir} {serial_key} {host} {port}" << std::endl;
30 exit(-1);
31 }
32
33 std::string host = "0.0.0.0";
34 int port = 24401;
35 std::string service_id = "";
36 std::string res_dir = argv[1];
37 std::string serial_num = "";
38
39 if (argc >= 3) {
40 serial_num = argv[2];
41 }
42 if (argc >= 4) {
43 host = argv[3];
44 }
45 if (argc >= 5) {
46 port = std::stoi(argv[4]);
47 }
48
49 EdgeLogConfig log_config;
50 log_config.enable_debug = true;
51 global_controller()->set_log_config(log_config);
52
53 EdgePredictorConfig config;
54 config.set_config(easyedge::params::PREDICTOR_KEY_CANN_BATCH_ENABLED, g_config.is_batch_model);
55 config.set_config(easyedge::params::PREDICTOR_KEY_CANN_DEVICE_ID, g_config.device_id);
56 config.model_dir = res_dir;
57
58 // 在这里设置序列号 或者 通过环境变量 EDGE_PREDICTOR_KEY_SERIAL_NUM 设置序列号
59 // 如果设置为空,SDK会自动寻找本地已经激活过的license
60 if (!serial_num.empty()) {
61 config.set_config(params::PREDICTOR_KEY_SERIAL_NUM, serial_num);
62 }
63
64 int inst_num = global_controller()->get_config(params::CONTROLLER_KEY_SERVING_INSTANCE_NUM, 1);
65 return global_controller()->start_http_server(config, host, port, service_id, inst_num);
66
67}
首先修改CMakeLists.txt。 下面"# 增加部分"标记的就是修改部分。
1cmake_minimum_required(VERSION 3.0)
2
3set(CMAKE_CXX_STANDARD 14)
4set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
5#set(CMAKE_BUILD_TYPE Debug)
6#set(CMAKE_VERBOSE_MAKEFILE ON)
7
8# 增加部分
9set(CMAKE_SYSTEM_PROCESSOR aarch64)
10set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)
11# 为了能让cmake 到/usr/aarch64-linux-gnu 找到Opencv
12#set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
13set(CMAKE_C_COMPILER "gcc")
14set(CMAKE_CXX_COMPILER "g++")
15
16
17
18# 有些系统里设置了RUNPATH不起作用,只能用RPATH
19set(CMAKE_EXE_LINKER_FLAGS "-Wl,--disable-new-dtags")
20
21project(easyedge_demo)
22
23set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/opencv)
24set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}/include)
25file(GLOB_RECURSE OpenCV_LIBS ${OpenCV_DIR}/lib/*)
26
27message(STATUS "OpenCV library status:")
28message(STATUS " libraries: ${OpenCV_LIBS}")
29message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
30
31find_package(Threads REQUIRED)
32
33include_directories(
34 ${OpenCV_INCLUDE_DIRS}
35 ${CMAKE_SOURCE_DIR}/../include/
36)
37link_directories(
38 ${CMAKE_SOURCE_DIR}/../lib/
39 /usr/local/Ascend/nnrt/latest/arm64-linux/acllib/lib64
40 /usr/local/Ascend/driver/lib64
41)
42add_executable(easyedge_demo demo.cpp)
43# 增加部分
44add_executable(easyedge_serving demo_serving.cpp)
45
46target_link_libraries(easyedge_demo ${OpenCV_LIBS} verify easyedge verify)
47# 增加部分
48target_link_libraries(easyedge_serving ${OpenCV_LIBS} easyedge verify)
4、 编译和测试
运行该脚本来进行编译

执行serving
./easyedge_serving /home/HwHiAiUser/easyedge/RES "02F3-181F-DD3D-3F22" 0.0.0.0 24401
序列号在EasyDL平台获取,点击上图当中的获取序列号激活,进入到序列号管理界面,点击新增测试序列号来获取测试序列号,如下图所示:

点击下载获得获得最红编译好的atlas的sdk
5、利用BIE进程模式部署
本章节介绍如何使用进程模式下发模型二进制执行程序和模型文件。
通过本地验证,我们知道,程序在边缘运行的命令如下:
1./easyedge_serving /home/HwHiAiUser/easyedge/RES "测试序列号" 0.0.0.0 24401
如果要使用BIE实现模型下发并运行,需要将上述本地验证命令分割为以下几部分:
-
下发文件
- 程序包:包含easyedge_serving和program.yml配置文件的压缩包,上传对象存储。在program.yml配置文件当中定义了entry。
- 配置项:模型资源文件,上传对象存储
-
启动参数
- 模型资源文件下发以后的工作目录。
- 模型序列号
- 服务暴露IP
- 服务暴露端口
基于上述需要的内容,我们开始后面的的操作。
5.1 制作程序包
进程应用创建没有镜像,由程序包代替。程序包由对应平台的可执行文件和程序配置文件program.yml组成,在本demo中:
easyedge_serving:华为Atlas 200DK 的可执行文件。该文件在sdk文件的 /demo/build目录中。program.yml:可执行文件的配置文件,在其中定义了entry,对应本地验证程序当中的./easyedge_serving命令。详细配置如下:

5.2 添加程序包配置项
将这两个文件压缩成zip文件并上传到对象存储中,然后在BIE程序包中引入这个压缩文件。
制作压缩包建议使用zip压缩命令,执行命令如下:
1# 查看当前目录下的文件,应该只有easyedge_serving 和 program.yml
2$ ls
3easyedge_serving program.yml
4# 将当前目录下的2个文件压缩到压缩包当中
5$ zip -r native-atlas.zip *

5.3 添加模型文件
将模型资源文件RES目录压缩,并上传至对象存储,然后在BIE配置项中引入这个压缩文件。
制作压缩包建议使用zip压缩命令,执行命令如下:
1# 查看当前目录下的文件,应该可以看到RES目录
2$ ls
3RES cpp python
4# 将RES目录压缩
5$ zip -r RES.zip RES

5.4 创建进程应用
添加进程服务,将模型以卷的形式添加到服务中。这里的目录填的是工作目录下的相对路径,如下图所示。

添加启动参数如下:

因为上面的RES.zip解压以后,会带有一个RES目录,所以启动参数当中的模型资源文件路径为
var/lib/baetyl/sdk/RES。是相对于上述卷配置当中模型文件配置项相对路径var/lib/baetyl/sdk多了一层RES。
5.5 创建对应节点并将应用部署到节点上

5.6 进程模式安装节点

5.7 验证边缘节点AI推断服务
通过浏览器打开在线推断服务:http://「ip」 :24401/,上传测试图片,获取测试结果
