通用CPU模型部署-容器模式
本教程说明如何将EasyEdge生成的AI模型通过BIE部署至边缘节点并运行。
一、上传AI模型至对象存储
获取模型模型,一般经过百度模型转换以后输出的模型文件及结构如下:
在得到AI模型以后,需要将AI模型上传到对象存储当中,BIE支持从以下对象存储当中获取模型文件:
- Baidu BOS
- S3标准的对象存储,例如AWS S3,CEPH,Minio,华为OBS
模型上传Baidu BOS
如果使用的是Baidu BOS,操作步骤如下:
- 创建bucket:bucket-demo-01
- 在bucket当中创建目录:easyedge
- 将模型文件上传到easyedge目录下,如下图所示:
模型上传到Minio
如果使用自己搭建的Minio,操作步骤如下:
- 登录Minio
- 输入用户名密码
- 创建bucket:model-upload
- 上传模型文件到bucket下,如下图所示:
二、创建AI模型的配置项
进入配置管理界面,点击创建配置项,填写配置项名称:mobilnetv1-ssd-voc-fluid-arm64。然后点击引入文件,填写AI模型文件在对象存储当中的下载信息。
支持从Baidu BOS引入文件
在公有云环境下,BIE与BOS账号集成打通,如果从BOS引入文件,不需要输入用户名密码,直接通过下拉菜单选择模型文件位置即可。如果是引入非当前BIE账号下的模型文件,则需要输入访问BOS的AK\SK
支持从S3引入文件
如果需要从S3对象存储当中引入文件,则按照以下案例输入模型文件下载信息,实际使用的的是自己搭建的minio服务。
三、创建AI应用
进入应用部署界面,点击创建应用,按照提示以此填写:①基本信息->②服务配置。
①基本信息
在基本信息界面填写应用的基本信息,如下图所示:
- 应用名称:edge-ai-demo-app
- 应用类型:容器应用
- 应用描述:可选,可为空
②服务配置
在服务配置界面,填写服务信息,点击添加服务,在弹出框当中填写如下信息:
-
基本信息
- 服务名称:object-detection
- arm镜像地址:iregistry.baidubce.com/aiot/edgekit_armv8:1.0.2
-
amd镜像地址:iregistry.baidubce.com/aiot/edgekit_x86:1.0.2
注意:
- 不同架构有不同的模型,模型需要与对应架构的镜像匹配
- 镜像为内网镜像仓库地址
-
卷配置
- 卷名称:ai-model
- 类型:配置项
- 参数:从下拉框当中选择前面创建的AI模型配置项
- 容器目录:/mnt/easyedge
- 读写权限:读写
-
端口映射
- 宿主机端口:8088
- 容器端口:8701
- 协议:TCP
-
启动参数(启动参数与模型和推断镜像强相关,启动参数并非所有模型都是标准的)
- /bin/bash
- /home/work/easyedge/serving/bootstrap.sh
-
其他
- 使用默认配置
到此完成应用创建。
四、部署AI应用到边缘节点
在应用部署当中,可以选择将应用部署至哪些边缘节点,部署的逻辑是通过边缘节点的标签进行匹配。例如edge-node这个边缘节点有一个baetyl-node-name: edge-node
这样的KV标签,如下图所示:
那么目标节点界面,点击匹配标签,添加baetyl-node-name: edge-node
作为目标节点标签,如下图所示:
在添加完毕以后,系统自动基于标签匹配出目标节点为edge-node,如下图所示:
五、验证边缘AI服务运行
打开原模型的label_list.txt文件,我们可以看到此模型可以识别以下种类物体:
background
aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor
可以看到此模型可以识别人和狗这两种物体,我们可以找一张遛狗的测试图片。
通过浏览器验证
本案例当中的AI推断服务提供了web操作界面,所以可以通过web界面上传上述测试图片。打开浏览器,访问:http://[边缘节点IP地址]:8088/
。如果能够打开界面,表示边缘推断服务正常启动。此时上传测试图片,推断服务将自动给出推断结果,如下图所示,在置信度为80%时,识别出图片当中有3个人,1条狗,置信度可用户自定义修改。
通过API验证
ai-infer-service作为一个容器服务运行在边缘节点,它同时对外提供API访问接口,支持被其他应用调用,并返回物体检测结果。具体API使用参考EasyEdge SDK文档
下面通过python代码调用接口进行示例说明:
- 拷贝下面的python代码保存至本地,命名为test_ai_model_api.py。
import requests
with open('./1.jpg', 'rb') as f:
img = f.read()
# params is GET params, data is POST Body
result = requests.post('http://[边缘节点ip]:8088/', params={'threshold': 0.8},data=img).json()
print (result)
- 下载图片 1.jpg,保存至与test_ai_model_api.py同目录下。
- 执行test_ai_model_api.py
python test_ai_model_api.py
- 查看接口返回结果为如下JSON,同样标识识别出1个人和3条狗。
{
'cost_ms': 179,
'error_code': 0,
'results': [{
'confidence': 0.9943918585777283,
'index': 12,
'label': 'dog',
'location': {
'height': 397,
'left': 100,
'top': 691,
'width': 383
},
'name': 'dog',
'score': 0.9943918585777283,
'x1': 0.14523082971572876,
'x2': 0.6987910866737366,
'y1': 0.6263848543167114,
'y2': 0.9866765737533569
}, {
'confidence': 0.9922541379928589,
'index': 15,
'label': 'person',
'location': {
'height': 304,
'left': 547,
'top': 332,
'width': 92
},
'name': 'person',
'score': 0.9922541379928589,
'x1': 0.7918291687965393,
'x2': 0.9249030947685242,
'y1': 0.30082497000694275,
'y2': 0.5762962102890015
}, {
'confidence': 0.9846013784408569,
'index': 15,
'label': 'person',
'location': {
'height': 1020,
'left': 311,
'top': 63,
'width': 308
},
'name': 'person',
'score': 0.9846013784408569,
'x1': 0.4507014751434326,
'x2': 0.8969031572341919,
'y1': 0.05781838297843933,
'y2': 0.9817966222763062
}, {
'confidence': 0.9536634683609009,
'index': 15,
'label': 'person',
'location': {
'height': 357,
'left': 35,
'top': 327,
'width': 149
},
'name': 'person',
'score': 0.9536634683609009,
'x1': 0.05083557963371277,
'x2': 0.2662031948566437,
'y1': 0.2963605523109436,
'y2': 0.6200013160705566
}]
}