部署模型SDK至Atlas200DK
1、概述
本文将描述如何将EasyEdge SDK打包成一个二进制程序,然后通过BIE云边协同将二进制程序和模型文件下发至边缘节点并运行。
2、获取Atlas类型SDK
参考模型转换的章节,生成一个Atlas类型的SDK
进入我的模型界面,点击生成端模型。选择Atlas 200DK 和Linux操作系统,点击发布。
过几分钟,可以在离线计算SDK界面看到生成的Atlas SDK。
3、对原始SDK包的修改
原始sdk包没有demo_serving.cpp这个文件,需要增加这个文件,文件内容如下:
/***************************************************************************
*
* Copyright (c) 2021 Baidu.com, Inc. All Rights Reserved
* **************************************************************************/
/**
* @author Baidu
* @brief demo_serving
* **/
#include <iostream>
#include <algorithm>
#include <thread>
#include "easyedge/easyedge.h"
#include "easyedge/easyedge_cann_config.h"
struct DemoConfig {
bool is_batch_model = false;
int batch_size = 1;
int device_id = 0;
} g_config;
using namespace easyedge;
int main(int argc, char *argv[]) {
if (argc < 2) {
std::cerr << "Usage: ./easyedge_serving {res_dir} {serial_key} {host} {port}" << std::endl;
exit(-1);
}
std::string host = "0.0.0.0";
int port = 24401;
std::string service_id = "";
std::string res_dir = argv[1];
std::string serial_num = "";
if (argc >= 3) {
serial_num = argv[2];
}
if (argc >= 4) {
host = argv[3];
}
if (argc >= 5) {
port = std::stoi(argv[4]);
}
EdgeLogConfig log_config;
log_config.enable_debug = true;
global_controller()->set_log_config(log_config);
EdgePredictorConfig config;
config.set_config(easyedge::params::PREDICTOR_KEY_CANN_BATCH_ENABLED, g_config.is_batch_model);
config.set_config(easyedge::params::PREDICTOR_KEY_CANN_DEVICE_ID, g_config.device_id);
config.model_dir = res_dir;
// 在这里设置序列号 或者 通过环境变量 EDGE_PREDICTOR_KEY_SERIAL_NUM 设置序列号
// 如果设置为空,SDK会自动寻找本地已经激活过的license
if (!serial_num.empty()) {
config.set_config(params::PREDICTOR_KEY_SERIAL_NUM, serial_num);
}
int inst_num = global_controller()->get_config(params::CONTROLLER_KEY_SERVING_INSTANCE_NUM, 1);
return global_controller()->start_http_server(config, host, port, service_id, inst_num);
}
首先修改CMakeLists.txt。 下面"# 增加部分"标记的就是修改部分。
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
#set(CMAKE_BUILD_TYPE Debug)
#set(CMAKE_VERBOSE_MAKEFILE ON)
# 增加部分
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)
# 为了能让cmake 到/usr/aarch64-linux-gnu 找到Opencv
#set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")
# 有些系统里设置了RUNPATH不起作用,只能用RPATH
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--disable-new-dtags")
project(easyedge_demo)
set(OpenCV_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/opencv)
set(OpenCV_INCLUDE_DIRS ${OpenCV_DIR}/include)
file(GLOB_RECURSE OpenCV_LIBS ${OpenCV_DIR}/lib/*)
message(STATUS "OpenCV library status:")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
find_package(Threads REQUIRED)
include_directories(
${OpenCV_INCLUDE_DIRS}
${CMAKE_SOURCE_DIR}/../include/
)
link_directories(
${CMAKE_SOURCE_DIR}/../lib/
/usr/local/Ascend/nnrt/latest/arm64-linux/acllib/lib64
/usr/local/Ascend/driver/lib64
)
add_executable(easyedge_demo demo.cpp)
# 增加部分
add_executable(easyedge_serving demo_serving.cpp)
target_link_libraries(easyedge_demo ${OpenCV_LIBS} verify easyedge verify)
# 增加部分
target_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进程模式部署
本章节介绍如何使用进程模式下发模型二进制执行程序和模型文件。
通过本地验证,我们知道,程序在边缘运行的命令如下:
./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压缩命令,执行命令如下:
# 查看当前目录下的文件,应该只有easyedge_serving 和 program.yml
$ ls
easyedge_serving program.yml
# 将当前目录下的2个文件压缩到压缩包当中
$ zip -r native-atlas.zip *
5.3 添加模型文件
将模型资源文件RES目录压缩,并上传至对象存储,然后在BIE配置项中引入这个压缩文件。
制作压缩包建议使用zip压缩命令,执行命令如下:
# 查看当前目录下的文件,应该可以看到RES目录
$ ls
RES cpp python
# 将RES目录压缩
$ 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/,上传测试图片,获取测试结果