当前位置: 首页 > news >正文

MindSpore Serving与TGI框架 の 对比

一、MindSpore Serving

MindSpore Serving是一款轻量级、高性能的服务工具,帮助用户在生产环境中高效部署在线推理服务。

使用MindSpore完成模型训练>导出MindSpore模型,即可使用MindSpore Serving创建该模型的推理服务。

MindSpore Serving包含以下功能:

  • 支持自定义关于模型的预处理和后处理,简化模型的发布和部署。

  • 支持batch功能,包含多个实例的请求会被拆分组合以满足模型batch size的需要。

  • 支持分布式模型推理功能。

  • 支持客户端gRPC接口,提供简单易用的客户端Python封装接口。

  • 支持客户端RESTful接口。请添加图片描述

部署Serving推理服务

  • serving_server.py为启动服务脚本文件。
  • xxx.mindir为上一步网络生成的模型文件。
  • servable_config.py为模型配置文件:定义了模型的处理函数。

启动服务

执行serving_server.py,完成服务启动:

import os
import sys
from mindspore_serving import serverdef start():servable_dir = os.path.dirname(os.path.realpath(sys.argv[0]))servable_config = server.ServableStartConfig(servable_directory=servable_dir, servable_name="add",device_ids=(0, 1))server.start_servables(servable_configs=servable_config)server.start_grpc_server(address="127.0.0.1:5500")server.start_restful_server(address="127.0.0.1:1500")if __name__ == "__main__":start()

启动脚本中start_servables将在设备0和1上共加载和运行两个推理副本,来自客户端的推理请求将被切割分流到两个推理副本。

当服务端打印如下日志时,表示Serving gRPC服务和RESTful服务启动成功。

Serving gRPC server start success, listening on 127.0.0.1:5500
Serving RESTful server start success, listening on 127.0.0.1:1500

执行推理

客户端提供两种方式访问推理服务,一种是通过gRPC方式,一种是通过RESTful方式。
使用serving_client.py,启动Python客户端。
————————————————————————————————————————
RESTful是一种基于HTTP协议的网络应用程序的设计风格和开发方式,通过URI实现对资源的管理及访问,具有扩展性强、结构清晰的特点。基于其轻量级以及通过HTTP直接传输数据的特性,RESTful已经成为最常见的Web服务访问方式。用户通过RESTful方式,能够简单直接的与服务进行交互。

  • 通过mindspore_serving.server.start_restful_server接口启动RESTful服务:

请求方式
当前仅支持POST类型的RESTful请求,请求格式如下:

POST http://HOST:1234/model/LLaMA:generated_stream

如果使用curl工具,RESTful请求方式如下:

curl -X POST -d '{"instances":{"image":{"b64":"babe64-encoded-string"}}}' http://HOST:1234/model/LLaMA:generated_stream

二、TGI框架

请添加图片描述
若干客户端同时请求Web Server的“/generate”服务后,服务端将这些请求在“Buffer”组件处整合为Batch,并通过gRPC协议转发请求给NPU推理引擎进行计算生成。

将请求发给多个Model Shard,多个Model Shard之间通过NCCL通信 是因为显存容量有限或出于计算效率考虑,需要多卡进行分布式推理。

推理框架一般会将第1次推理(首Token)和余下的推理(生成其余Token)分别设计为PrefillDecode两个过程

  • Prefill 是将1个请求的Prompt一次性转换为KV Cache,并生成第1个Token的过程。
    假设Prompt的长度为L,MultiHead Attention的头数为H(Head),每个头的维度为HS(Head Size,暂不考虑GQA/MQA)。
    计算该过程时,输入Attention的Q、K、V维度均为[L,H, HS],输入FFN的hidden(隐藏层向量)维度为[L, H *HS]。
    完成模型计算后,仅对最后一个Logit进行解码得到首Token;中间过程计算得到的K、V被保留在显存中(即KV Cache,用于避免后续Decode过程重复计算这些K、V导致算力浪费)。

  • Decode:从第2个Token开始,将上一次推理的输出(新生成的1个Token)作为输入进行一次新的推理。假设BatchSize=1,已生成的新子序列长度为N,在计算该过程时,输入Attention的Q维度为[1,H, HS], K、V维度则为[L+N+1,H, HS],输入FFN的hidden维度为[1, H*HS]。
    完成模型计算后,对唯一的Logit进行解码得到新生成的Token;中间过程计算得到的K、V追加到KV Cache中(原因同上)。重复Decode流程持续生成Token直到模型输出(End of Sentence,表示输出结束的特殊Token)。

将推理分为Prefill和Decode,是考虑到生成第1个Token和其余Token时计算模式的差异较大,分开实现有利于针对性优化

TGI引入Continuous Batching特性,其中请求的合并和剔除就是通过Router向Server发送Concatenate和Filter的Request实现。

Continuous Batching(或称Inflight Batch)核心思想是在两次Decode的间隙插入新请求的Prefill、各请求的合并和剔除等操作,从而以动态Batch推理的方法提高NPU利用率。

相关文章:

MindSpore Serving与TGI框架 の 对比

一、MindSpore Serving MindSpore Serving是一款轻量级、高性能的服务工具,帮助用户在生产环境中高效部署在线推理服务。 使用MindSpore完成模型训练>导出MindSpore模型,即可使用MindSpore Serving创建该模型的推理服务。 MindSpore Serving包含以…...

两阶段提交协议三阶段提交协议

两阶段提交协议 分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。 XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易…...

6-Docker Compose-tomcat application(指定官方镜像)

1.创建docker-compose.yml文件,添加如下内容并保存 vim docker-compose.yml [root@centos79 ~]# cat docker-compose.yml #yml文件 version: 3 #版本号,默认为3 services:tomcat-ztj: #定…...

宝塔安装的imagemagick不能用,必须自己手动安装

1 安装 用composer安装 2 宝塔安装的imagemagick不能用,必须自己手动安装(3.4.3版本 php 7.3) 1 步骤: wget https://pecl.php.net/get/imagick-3.4.3.tgz tar -zxf imagick-3.4.3.tgz cd imagick-3.4.3 /www/server/php/73…...

解决在test以外的目录下导入junit无效

以上引用来自src目录下的文件,可以看到,和junit有关的导入都飘红,但明明junit已经被正确导入进了项目中。 再看右侧的Maven的依赖下方,junit的右边有一个很不起眼的(test) 这是因为junit作为测试框架,可能包含仅适用于…...

docker 在线安装mysql 8.0.21版本

1、拉取mysql 8.0.21版本镜像 2、查看镜像 docker images 3、在宿主机 /usr/local/mysql 下的 conf 文件夹下,创建 my.cnf 文件,并编辑内容 [mysql] default-character-setutf8 [client] port3306 default-character-setutf8 [mysqld] port3306 se…...

WPF DatePicker与Calendar的使用和样式修改

什么是DatePicker,Calendar Calendar:日历(显示年月日视图控件)DatePicker:日期选择器(是一个更小的控件,点击控件时才会弹出一个日历) Calendar使用 常用属性 DisplayMode&#…...

从0开始python学习-40.通过正则表达式/json进行接口关联

目录 1. 正则表达式:使用re库(需安装-pip install re),只能提取字符串的数据。 1.1 re.seach:提取一个值,得到的是一个对象,通过下标group(1)取值,如果没有匹配到值则返回None 1.…...

【React系列】高阶组件

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 高阶组件 1.1. 认识高阶组件 什么是高阶组件呢?相信很多同学都听说过,也用过 高阶函数&…...

听GPT 讲Rust源代码--src/tools(38)

File: rust/src/tools/clippy/clippy_dev/src/lib.rs rust/src/tools/clippy/clippy_dev/src/lib.rs文件是Clippy开发工具的入口文件,其作用是提供Clippy开发过程中所需的功能和工具。Clippy是一个Rust代码的静态分析工具,用于提供各种有用的代码规范、编…...

.NET C# 如何获取object对象的数据

如何获取object对象的数据 在DAL层,一般会封装一些返回值,返回的类型就会为object ,但是需要其中的值进行判断 public static object SaveFileIns(string filepath){return new { path pathlist, file_name fileNamelist, Message "…...

使用IDEA创建使用 JDK8 的 2.x.x 版本的 Spring Boot 项目以及 Spring Boot 项目如何修改JDK版本

目录 一、在阿里云上官网上创建项目 二、将 IDEA 中创建项目的源地址修改为阿里云官网 三、创建 3.x.x 的项目之后修改配置降低至 2.7.x 版本和使用 JDK8(修改 Spring Boot 的 JDK 版本同理) 从上面的 Spring Boot 官网的截图中可以发现,自…...

游戏服务器整体架构思考

1.启动层 不管是单体架构还是微服务架构,其实服务器本身都是要启动的。 不管是用grpc实现远程调用,还是dubbo,还是说就一个简单的tcp监听,都是要启动的。 启动的时候,肯定要整合下controller接入层,不管是叫…...

labelme 标注的数据集转化为Mask-Rcnn适用的数据集

labelme 标注的数据集转化为Mask-Rcnn适用的数据集 食用步骤 1.labelme标注数据时,将生成的json文件和原图保存在一起 2.只需提供labelme生成的数据的文件夹,和maskrcnn的数据集文件夹,运行代码就会自动进行处理 3.代码会在提供的maskrcn…...

x-cmd pkg | tig - git 文本模式界面

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 tig 由 Jonas Fonseca 于 2006 年使用 C 语言创建的 git 交互式文本命令行工具。旨在开启交互模式快速浏览 git 存储库的信息以及 git 命令的运行。 首次用户 使用 x tig 即可自动下载并使用 在终端运行 eval "…...

信息论与编码期末复习——概念论述简答题(一)

个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…...

[Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目

前面讲解了通过命令行方式来部署k8s项目,下面来讲讲通过腾讯云TKE来快速创建Pod、Deployment、Service部署k8s项目,云平台搭建Kubernetes可参考[Kubernetes]1.Kubernetes(K8S)介绍,基于腾讯云的K8S环境搭建集群以及裸机搭建K8S集群 一.通过腾讯云TKE创建集群 1.创建集群 参考上…...

二叉排序树的创建、插入、查找和删除【数据结构】

二叉排序树 若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。它的左、右树又分为⼆叉排序树 二叉排序树也叫二叉查找树、二叉搜索树 二叉排序树的创建、插入、查找和删除 …...

【管理篇 / 恢复】❀ 07. macOS下用命令刷新固件 ❀ FortiGate 防火墙

【简介】随着苹果电脑的普及,很多管理员都会通过苹果电脑对飞塔防火墙进行管理。当防火墙需要命令状态下刷新固件时,在macOS下用命令刷新固件,将会是一个小小的挑战。 首先是硬件的连接,USB配置线的USB一头,接入MAC的U…...

工作纪实40-使用redis的几种姿势

线上查问题看某个redis的key值,记录一下 1.直接使用telnet进行连接(贼拉方便) telnet ip port > auth pwd1.模糊查询 scan 0 MATCH abc* 2.查看所有key keys * 3.ttl key 查看key的ttl2.使用redis-cli连接(费劲吧啦,还需要本地…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

PHP 8.5 即将发布:管道操作符、强力调试

前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...