文档简介:
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:为边缘namespace
- 8701:是边缘应用容器内端口。
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 } ] }