使用函数调用边缘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,代码如下
Python
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4import sys
5sys.path.append("/var/lib/baetyl/python3")
6sys.path.append("/var/lib/baetyl/pic")
7import requests
8
9def handler(event, context):
10 """
11 data: {"action": "A"}
12 """
13 if 'action' in event:
14 if event['action'] == 'A':
15 with open('/var/lib/baetyl/pic/1.jpg', 'rb') as f:
16 img = f.read()
17 r = requests.post('http://demo-ai-arm64.baetyl-edge:8701/',
18 params={'threshold': 0.8}, data=img).json()
19 event['info'] = r
20 else:
21 event['info'] = 'action dismatch'
22 else:
23 event['error'] = 'action not found'
24
25 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模型返回结果,结果如下
JSON
1{
2 "cost_ms":51,
3 "error_code":0,
4 "results":[
5 {
6 "confidence":0.9939988851547241,
7 "frame":0,
8 "index":12,
9 "label":"dog",
10 "location":{
11 "height":399,
12 "left":103,
13 "top":688,
14 "width":378
15 },
16 "modelKind":2,
17 "name":"dog",
18 "score":0.9939988851547241,
19 "trackId":0,
20 "x1":0.14938443899154663,
21 "x2":0.6959803104400635,
22 "y1":0.6235374808311462,
23 "y2":0.9851128458976746
24 },
25 {
26 "confidence":0.9900777339935303,
27 "frame":0,
28 "index":15,
29 "label":"person",
30 "location":{
31 "height":1027,
32 "left":295,
33 "top":58,
34 "width":328
35 },
36 "modelKind":2,
37 "name":"person",
38 "score":0.9900777339935303,
39 "trackId":0,
40 "x1":0.4268679618835449,
41 "x2":0.9022936820983887,
42 "y1":0.053433746099472046,
43 "y2":0.9839787483215332
44 },
45 {
46 "confidence":0.9880090951919556,
47 "frame":0,
48 "index":15,
49 "label":"person",
50 "location":{
51 "height":300,
52 "left":543,
53 "top":332,
54 "width":99
55 },
56 "modelKind":2,
57 "name":"person",
58 "score":0.9880090951919556,
59 "trackId":0,
60 "x1":0.7854906320571899,
61 "x2":0.9289591312408447,
62 "y1":0.30136483907699585,
63 "y2":0.5735336542129517
64 },
65 {
66 "confidence":0.9520901441574097,
67 "frame":0,
68 "index":15,
69 "label":"person",
70 "location":{
71 "height":355,
72 "left":41,
73 "top":334,
74 "width":145
75 },
76 "modelKind":2,
77 "name":"person",
78 "score":0.9520901441574097,
79 "trackId":0,
80 "x1":0.05995462089776993,
81 "x2":0.26955661177635193,
82 "y1":0.3026267886161804,
83 "y2":0.6244725584983826
84 }
85 ]
86}