用modelbox server启动流程图,暴露Restful接口

news/2024/5/19 0:09:38 标签: 流程图, restful, 后端

背景

假设你已经搭建了modelbox开发容器,能够使用webUI构建流程图。如果没有请参考昇腾npu上构建modelbox webUI开发容器教程。

现在,本文会说明,如何在终端用命令的方式将流程图暴露为服务,并能够在本地用postman访问。

本文参考ModelBox运行的"通过modelbox命令启动"一节

主要流程

首先,假设我们编写了如图的程序,其中foobar阶段会固定输出一个字符串。

foobar.py内容如下,固定会输出"Hello world!"

import _flowunit as modelbox

class FoobarFlowUnit(modelbox.FlowUnit):
    # Derived from modelbox.FlowUnit
    def __init__(self):
        super().__init__()

    def open(self, config):
        # Open the flowunit to obtain configuration information
        return modelbox.Status.StatusCode.STATUS_SUCCESS

    def process(self, data_context):
        # Process the data
        # input data
        in_data = data_context.input("in_data")
        # output data
        out_data = data_context.output("out_data")

        # Example process code.
        # Remove the following code and add your own code here.
        for buffer in in_data:
            add_buffer = modelbox.Buffer(self.get_bind_device(), "Hello world!")
            out_data.push_back(add_buffer)

        return modelbox.Status.StatusCode.STATUS_SUCCESS

    def close(self):
        # Close the flowunit
        return modelbox.Status()

    def data_pre(self, data_context):
        # Before streaming data starts
        return modelbox.Status()

    def data_post(self, data_context):
        # After streaming data ends
        return modelbox.Status()

mnist_response.py的代码逻辑也很简单,固定输出上一步骤的字符串,内容如下:

import _flowunit as modelbox
import numpy as np
import json

class MnistResponseFlowUnit(modelbox.FlowUnit):
    def __init__(self):
        super().__init__()

    def open(self, config):
        return modelbox.Status.StatusCode.STATUS_SUCCESS

    def process(self, data_context):
        in_data = data_context.input("in_data")
        out_data = data_context.output("out_data")

        for buffer in in_data:
            add_buffer = modelbox.Buffer(self.get_bind_device(), buffer.as_object())
            out_data.push_back(add_buffer)

        return modelbox.Status.StatusCode.STATUS_SUCCESS

    def close(self):
        return modelbox.Status()

    def data_pre(self, data_context):
        return modelbox.Status()

    def data_post(self, data_context):
        return modelbox.Status()

    def data_group_pre(self, data_context):
        return modelbox.Status()

    def data_group_post(self, data_context):
        return modelbox.Status()

然后,在项目路径内graph/下的.toml文件内,修改暴露的端口,如下文显示端口暴露在8190


digraph mnist_sample {
node [shape=Mrecord]
httpserver_sync_receive [ type=flowunit flowunit=httpserver_sync_receive device=cpu time_out_ms=“5000” endpoint=“http://0.0.0.0:8190” max_requests=“100” ]

那么,如何不用webUI,将流程图启动暴露为Restful服务呢?

  1. 进入modelbox开发容器

  2. 进入目录/root/modelbox-service/conf

  3. 编辑modelbox.conf配置文件。把flow_path 属性指向你的项目的graph目录,比如在本文的mnist项目,流程图存储在/root/projects/mnist/src/graph目录下。内容如下:

    [server]
    ip = "0.0.0.0"
    port = "1104"
    flow_path = "/root/projects/mnist/src/graph/"
    
    # 后续略...
    
  4. 执行modelbox -c ./modelbox-service/conf/modelbox.conf -fV。如果在子目录下则执行modelbox -c ./modelbox.conf -fV

然后,能看到终端输出日志:

[root@devserver-com conf]$ modelbox -c ./modelbox.conf -fV
[2023-12-06 20:35:17,711][ INFO][          main.cc:385 ] modelbox config path : ./modelbox.conf
[2023-12-06 20:35:17,711][ INFO][        server.cc:129 ] plugin list:
[2023-12-06 20:35:17,711][ INFO][        server.cc:131 ]  /usr/local/lib64/modelbox-plugin.so
[2023-12-06 20:35:17,711][ INFO][        server.cc:131 ]  /usr/local/lib64/modelbox-plugin-editor.so
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:68  ] create modelbox plugin
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:51  ] modelbox plugin init
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:61  ] run modelbox plugin on http://0.0.0.0:1104
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:73  ] modelbox plugin register handlers
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:74  ] regist url : /v1/modelbox/job
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:148 ] create local job
[2023-12-06 20:35:17,712][ INFO][modelbox_plugin.cc:192 ] Create local job /root/projects/mnist/src/graph//CMakeLists.txt
[2023-12-06 20:35:17,712][ERROR][          flow.cc:473 ] read config from  toml:/root/projects/mnist/src/graph//CMakeLists.txtfailed, err :Load config file failed, detail: [error] toml::parse_key_value_pair: missing key-value separator `=`
 --> /root/projects/mnist/src/graph//CMakeLists.txt
    |
 16 | cmake_minimum_required(VERSION 3.10)
    |                       ^--- should be `=`
[2023-12-06 20:35:17,712][ERROR][           job.cc:65  ] flow init failed: code: Fault, errmsg: Load config file failed, detail: [error] toml::parse_key_value_pair: missing key-value separator `=`
 --> /root/projects/mnist/src/graph//CMakeLists.txt
 ...
 [2023-12-06 20:35:18,824][ INFO][ editor_plugin.cc:126 ] create modelbox editor plugin
[2023-12-06 20:35:18,824][ INFO][ editor_plugin.cc:104 ] modelbox editor plugin init
[2023-12-06 20:35:18,824][ INFO][ editor_plugin.cc:119 ] run editor on http://0.0.0.0:1104
[2023-12-06 20:35:18,824][ INFO][        server.cc:59  ] app server start
[2023-12-06 20:35:18,825][ INFO][   http_helper.cc:438 ] Start listen at 0.0.0.0:1104

然后用postman访问那个服务器IP的8190端口,并按预定的接口填写参数,即可发出Restful请求。如下图所示,返回了字符串,与预期一致。


http://www.niftyadmin.cn/n/5257018.html

相关文章

YOLOv8改进实验:一文了解YOLOv8如何打印FPS指标

💡该教程为改进YOLOv8指南,属于《芒果书》📚系列,包含大量的原创首发改进方式🚀 💡🚀🚀🚀本博客内含改进源代码,按步骤操作运行改进后的代码即可 💡更方便的统计更多实验数据,方便写作 新增YOLOv8打印FPS指标 完善(一键YOLOv8打印FPS指标) 文章目录 完善…

12月12日作业

设计一个闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass …

静态链表(模拟链表)数据的插入

链表中的每一个结点只有两个部分。我们可以用一个数组 data 来存储每序列中的每一个 数。那每一个数右边的数是谁&#xff0c;这一点该怎么解决呢&#xff1f;上一节中是使用指针来解决的&#xff0c;这里 我们只需再用一个数组right来存放序列中每一个数右边的数是谁就可以了&…

【java】java类/方法冲突解决工具

目录下查找包含特定名称&#xff08;如&#xff1a;类名称&#xff09;的Jar包 上代码&#xff1a; 比如要查找含有类 “org/apache/avro/Schema” 的&#xff1a; # 方法一 # 此方法只能查找到内容&#xff08;比如&#xff1a;类名称&#xff09;。但是不能打印jar名称 fi…

基于单片机智能客厅控制装置设计

**单片机设计介绍&#xff0c;基于单片机智能客厅控制装置设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能客厅控制装置是一种通过单片机&#xff08;如Arduino、Raspberry Pi等&#xff09;控制的设备&…

【lesson6】数据类型之日期类型

文章目录 数据类型分类日期类型date类型测试 datetime类型测试 timestamp类型测试 数据类型分类 日期类型 date类型 说明&#xff1a;date类型包含日期 ‘年-月-日’ &#xff0c;占用三字节 测试 1.建表 2.插入测试 时间表示的不合法就报错。 datetime类型 说明&#x…

JRT业务层共用虚拟支持

之前虚拟M只是给打印和导出调用实现打印和导出。对导出而言不可能为导出查数据再拷贝一份查询逻辑&#xff0c;所以查询业务要能共用虚拟M的逻辑。 提供虚拟M的调用 代码 package JRTBLLBase;import JRT.Core.Dto.OutParam; import JRT.Core.Dto.OutValue; import JRT.Core.…

AlexNet 阅读笔记

“ImageNet Classification with Deep Convolutional Neural Networks” (Krizhevsky 等, 2012, p. 1) 使用深度卷积神经网络进行 ImageNet 分类 3公式&#xff0c;26个引用&#xff0c;4张图片&#xff0c;2个简单表格 Abstract 我们训练了一个大型深度卷积神经网络&#…