使用函数调用边缘AI模型
更新时间:2024-04-22
1、场景
边缘节点上部署了AI模型,现在希望使用函数触发式调用AI模型,并将AI模型返回结果发送到边缘Broker当中,供其他用户应用订阅。
2、方案
整体边缘函数调用结构如下图所示:
函数调用流程解析
- 使用baetyl-rule调用invoke-ai-func这个函数
- 调用函数是触发式的,只有当baetyl-rule在broker/topic1当中订阅到指定消息以后,才会触发调用函数
- baetyl-rule触发调用函数,然后函数调用demo-ai-arm64这个边缘AI应用
- 边缘AI应用返回结果给函数,函数将结果返回给baetyl-rule
- baetyl-rule将函数调用的返回结果pub到broker/topic2当中
3、操作指南
3.1、前提说明
本demo基于自定义函数与依赖包解耦下发这个demo案例进行修改。需要先完成这个demo以后,再执行本demo。
3.2、取消部署bie-python
在自定义函数与依赖包解耦下发 demo当中部署了bie-python这个函数应用,先取消部署次函数应用
3.3、创建测试AI应用并部署
创建测试AI应用demo-ai-arm64,可以直接导入配置应用-demo-ai-arm64.json
3.4、创建函数invoke-ai-func
创建函数invoke-ai-func,代码如下
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
sys.path.append("/var/lib/baetyl/python3")
sys.path.append("/var/lib/baetyl/pic")
import requests
def handler(event, context):
"""
data: {"action": "A"}
"""
if 'action' in event:
if event['action'] == 'A':
with open('/var/lib/baetyl/pic/1.jpg', 'rb') as f:
img = f.read()
r = requests.post('http://demo-ai-arm64.baetyl-edge:8701/',
params={'threshold': 0.8}, data=img).json()
event['info'] = r
else:
event['info'] = 'action dismatch'
else:
event['error'] = 'action not found'
return event
函数解析如下:
- sys.path.append添加两个容器内目录,与后面的函数应用配置项匹配
-
调用的边缘ai服务地址为
http://demo-ai-arm64.baetyl-edge:8701/
demo-ai-arm64
:为边缘AI应用名称baetyl-edge
:为边缘namespace8701
:是边缘应用容器内端口。
3.5、创建测试图片配置项
创建测试图片配置项test-pic,如下图所示:
测试图片URL地址:https://bie-document.gz.bcebos.com/test-images/1.jpg
3.6、创建函数应用invoke-ai-func并部署
创建函数应用invoke-ai-func,配置信息如下图所示:
- 整体配置与bie-python这个函数应用类似
基本信息
- 函数配置项:invoke-ai-func
- 运行时:python3
函数列表
- 函数名称:process
- 函数入口:index.handler
- 容器目录:
.
,点号。卷配置
- python3-request-package,函数依赖包,容器内目录为:
/var/lib/baetyl/python3
,与3.3章节的函数代码一致- test-pic:前面创建的测试图片,容器内目录为:
/var/lib/baetyl/pic
,与3.3章节的函数代码一致
将应用部署至边缘节点,边缘节点完整应用如下图所示:
3.7、修改baetyl-rule
因为baetyl-rule调用的函数名称发生修改,因此需要修改baetyl-rule的配置,如下图所示:
将原先的bie-python
修改为invoke-ai-func
。
- 在baetyl-rule当中调用函数,可以只写[函数名称/入口],即上图的
invoke-ai-func/process
。如果是非baetyl-rule调用,则需要填写完整的函数调用地址。完整的函数调用地址为:https://baetyl-function.baetyl-edge-system:50011/invoke-ai-func/process
- 边缘服务调用可以参考:边缘服务调用
3.8、测试
1、使用mqtt-box连接边缘broker
2、订阅broker/topic1
和broker/topic2
两个主题
3、向broker/topic1
主题发送{"action":"A"}
,如下图所示:
4、在broker/topic2
得到AI模型返回结果,结果如下
{
"cost_ms":51,
"error_code":0,
"results":[
{
"confidence":0.9939988851547241,
"frame":0,
"index":12,
"label":"dog",
"location":{
"height":399,
"left":103,
"top":688,
"width":378
},
"modelKind":2,
"name":"dog",
"score":0.9939988851547241,
"trackId":0,
"x1":0.14938443899154663,
"x2":0.6959803104400635,
"y1":0.6235374808311462,
"y2":0.9851128458976746
},
{
"confidence":0.9900777339935303,
"frame":0,
"index":15,
"label":"person",
"location":{
"height":1027,
"left":295,
"top":58,
"width":328
},
"modelKind":2,
"name":"person",
"score":0.9900777339935303,
"trackId":0,
"x1":0.4268679618835449,
"x2":0.9022936820983887,
"y1":0.053433746099472046,
"y2":0.9839787483215332
},
{
"confidence":0.9880090951919556,
"frame":0,
"index":15,
"label":"person",
"location":{
"height":300,
"left":543,
"top":332,
"width":99
},
"modelKind":2,
"name":"person",
"score":0.9880090951919556,
"trackId":0,
"x1":0.7854906320571899,
"x2":0.9289591312408447,
"y1":0.30136483907699585,
"y2":0.5735336542129517
},
{
"confidence":0.9520901441574097,
"frame":0,
"index":15,
"label":"person",
"location":{
"height":355,
"left":41,
"top":334,
"width":145
},
"modelKind":2,
"name":"person",
"score":0.9520901441574097,
"trackId":0,
"x1":0.05995462089776993,
"x2":0.26955661177635193,
"y1":0.3026267886161804,
"y2":0.6244725584983826
}
]
}