部署模型SDK至Intel Movidius设备
1、概述
进程模式与容器模式不同,进程模式强依赖于边缘节点的运行环境变量,比如lib库、系统变量等参数。如果没有提前设置好path等环境变量,可能导致云端下发的二进制程序在边缘节点上无法正常运行,甚至运行出错。
而所有的运行环境变量,本质上都可以通过脚本命令进行动态设置,因此如果在一个shell脚本提前设置好环境变量,最后再执行二进制程序,就不再需要为每一台设备重复去设置环境变量了。
本文将描述如何在一个脚本(run.sh)当中定义:(a)需要加载的环境变量和(b)需要运行的二进制程序。然后通过这个脚本执行入口(entry)实现BIE云边协同的进程模式。
2、获取 Movidius 类型SDK
参考 模型转换 章节,此处我们需要再多生成一个 Movidius 类型的SDK。
进入我的模型界面,点击生成端模型。
选择Jetson芯片和Linux操作系统,点击发布。
过几分钟,可以在离线计算SDK界面看到生成的Jetson SDK,如下图所以
点击下载获得Jetson专用SDK:EasyEdge-Linux-m38748-b38748-movidius.zip 。
3、申请测试序列号
点击上图当中的获取序列号激活,进入到序列号管理界面,点击新增测试序列号来获取测试序列号,如下图所示:
4、获得模型二进制运行程序
4.1 检查SDK是否带有模型二进制执行程序
SDK当中的RES目录是模型资源文件,CPP目录是模型运行程序,解压CPP目录当中的文件,找到demo目录,查看是否有bin文件夹。
如下图所示,SDK包当中带了二进制执行程序(easyedge_serving、easyedge_multhread、easyedge_batch_inferenc),针对这种SDK,我们可以直接使用SDK包当中提到的二进制程序。
本文使用x86_64架构的cpp包,即
baidu_easyedge_linux_cpp_x86_64_VPU_gcc7.5_v1.3.2_20210824.tar.gz
这个压缩文件。
4.2 编译SDK获得模型二进制执行程序
如果SDK包当中不带模型二进制执行程序,则需要通过编译程序获取模型二进制执行程序,可以参考:https://ai.baidu.com/ai-doc/EASYDL/1k38n3ade#测试demo
5、本地验证
5.1 检查是否识别movidius神经计算棒
对于硬件使用为Intel Movidius MyRIAD2 / MyRIAD X 的,如果宿主机找不到神经计算棒Intel® Neural Compute Stick,需要执行以下命令添加USB Rules:
cp ${cpp_kit位置路径}/thirdparty/openvino/deployment_tools/inference_engine/external/97-myriad-usbboot.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo ldconfig
执行命令以后,建议重启一下。
5.2 制作本地run.sh脚本并验证
创建run.sh脚本,放在cpp_kit目录下,如下图所示:
run.sh的脚本内容如下:
#!/bin/bash
workpath=$(pwd)
param_y="$1 $2 $3 $4"
source $workpath/thirdparty/openvino/bin/setupvars.sh && LD_LIBRARY_PATH=$workpath/thirdparty/opencv/lib:$workpath/lib:$LD_LIBRARY_PATH $workpath/bin/easyedge_serving $param_y
将上述x86_64整个目录copy至本地测试机器,然后将RES的绝对路径和测试SN号填写到脚本当中。然后授予run.sh可执行权限,命令如下
chmod 755 run.sh
最后在本地执行测试
# 必须要管理员权限,否则识别不到加速卡
sudo ./run.sh /xx/xx/xx/x86_64/RES {测试SN号} 0.0.0.0 24401
正常情况下,打开浏览器,输入:http://[ip]:24401 ,即可看到测试界面。
6、利用BIE进程模式部署
6.1 工作目录的说明
进程模式当中,工作目录路径格式如下:/var/lib/baetyl/run/baetyl-edge/{app-name}/{app-version}/{service-name}/1/
。
通过进程模式下发的可执行脚本可以通过如下方式获取真实的工作路径。
workpath=$(pwd)
6.2 进程模式运行说明
本节介绍如何下发一个可执行脚本,并在脚本中定义:
- 需要加载环境变量
- 需要运行的模型二进制执行程序
- 需要被调用的模型文件。
如果要使用BIE实现模型下发并运行,需要将上述内容分割为以下几部分:
-
下发文件
-
程序包:
- run.sh:需要有可执行权限
- program.yml:配置文件,在program.yml配置文件当中定义了
entry: "run.sh"
- cpp_kit相关文件:在run.sh当中定义会使用cpp_kit当中的二进制运行程序,以及依赖的lib库。
- 配置项:模型资源文件,上传对象存储
-
-
启动参数
- 模型资源文件下发以后的工作目录。
- 模型序列号
- 服务暴露IP
- 服务暴露端口
基于上述需要的内容,我们开始后面的的操作。
6.3 制作程序包并创建程序包配置项
本demo当中使用的程序包,主要包含可执行脚本、程序配置文件program.yml和cpp_kit文件:
run.sh
:具有可执行权限的运行脚本,run.sh的脚本如下:
#!/bin/bash
workpath=$(pwd)
# program_apath是固定的,在后面创建进程服务的时候,选择程序包以后,就设定了程序路径为工作目录下的/var/lib/baetyl/bin目录。
program_apath=$workpath/var/lib/baetyl/bin
echo "pram1 is $1"
echo "pram2 is $2"
echo "pram3 is $3"
echo "pram4 is $4"
param_x=$workpath"/"$1" "$2" "$3" "$4
param_y="$workpath/$1 $2 $3 $4"
echo "program_apath is $program_apath"
echo "param_x is $param_x"
echo "param_y is $param_y"
source $program_apath/thirdparty/openvino/bin/setupvars.sh && LD_LIBRARY_PATH=$program_apath/thirdparty/opencv/lib:$program_apath/lib:$LD_LIBRARY_PATH $program_apath/bin/easyedge_serving $param_y
program.yml
:可执行文件的配置文件,在其中定义了entry: "run.sh"
,对应本地验证程序当中的./run.sh
命令。详细配置如下:
- cpp_kit:模型二进制程序以及依赖lib库
程序包整理目录结构如下图所示:
将上述文件进行压缩,建议使用zip压缩命令,执行命令如下:
$ ls
ReadMe.txt bin include lib program.yml run.sh src thirdparty
# 将当前目录下的文件压缩到压缩包当中
$ zip -r movidius-native.zip *
将压缩包上传到对象存储中,然后在BIE云管平台当中创建程序包类型配置项。
6.4 添加模型文件
将模型资源文件RES目录压缩,并上传至对象存储,然后在BIE配置项中引入这个压缩文件。
制作压缩包建议使用zip压缩命令,执行命令如下:
# 查看当前目录下的文件,应该可以看到RES目录
$ ls
RES cpp python
# 将RES目录压缩
$ zip -r RES.zip RES
6.5 创建进程应用
添加进程服务,将模型以卷的形式添加到服务中。这里的目录填的是工作目录下的相对路径,如下图所示。
添加启动参数如下:
- 因为上面的RES.zip解压以后,会带有一个RES目录,所以启动参数当中的模型资源文件路径为
var/lib/baetyl/sdk/RES
。是相对于上述卷配置当中模型文件配置项相对路径var/lib/baetyl/sdk
多了一层RES
。- 此处的4个参数,与run.sh脚本当中的4个输入参数
$1 $2 $3 $4
相对应
6.6 创建对应节点并将应用部署到节点上
6.7 验证边缘节点AI推断服务
通过浏览器打开在线推断服务:http://「ip」 :24401/,上传测试图片,推断结果如下,证明AI服务正常启动。