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

如何基于MLServer构建Python机器学习服务

文章目录

  • 前言
  • 一、数据集
  • 二、训练 Scikit-learn 模型
  • 三、基于MLSever构建Scikit-learn服务
  • 四、测试模型
  • 五、训练 XGBoost 模型
  • 六、服务多个模型
  • 七、测试多个模型的准确性
  • 总结
  • 参考


前言

在过去我们训练模型,往往通过编写flask代码或者容器化我们的模型并在docker中运行。这篇文章中,我们将分享如何基于mlserver来搭建Web服务。mlserver是基于 python的推理服务器,可以通过简单的代码实现python web服务,但是它的真正优点在于它是一个为生产环境设计的高性能服务器。
在这里插入图片描述


一、数据集

本博客通过使用几个图像模型作为示例,介绍如何使用 MLServer,我们要使用的数据集是Fashion MNIST 数据集。它包含 70,000 张灰度 28x28 像素的服装图像,分为 10 个不同的类别(上衣、连衣裙、外套、裤子等)。

二、训练 Scikit-learn 模型

首先,我们使用scikit-learn框架训练支持向量机 (SVM) 模型。然后我们将模型保存到一个名为Fashion-MNIST.joblib文件中。

import pandas as pd
from sklearn import svm
import time
import joblib#Load Training Data
train = pd.read_csv('../../data/fashion-mnist_train.csv', header=0)
y_train = train['label']
X_train = train.drop(['label'], axis=1)
classifier = svm.SVC(kernel="poly", degree=4, gamma=0.1)#Train Model
start = time.time()
classifier.fit(X_train.values, y_train.values)
end = time.time()
exec_time = end-start
print(f'Execution time: {exec_time} seconds')#Save Model
joblib.dump(classifier, "Fashion-MNIST.joblib")

注意:SVM 算法不是特别适合大型数据集,因为它具有二次性质。根据使用的硬件,本示例中的模型将需要几分钟时间进行训练。

三、基于MLSever构建Scikit-learn服务

好的,所以我们现在有一个保存的模型文件Fashion-MNIST.joblib。让我们来看看我们如何使用 MLServer 来提供服务…

首先,我们需要安装 MLServer。

pip install mlserver

额外的运行时是可选的,但在服务模型时让生活变得非常轻松,我们也会安装 Scikit-Learn 和 XGBoost 的

pip install mlserver-sklearn mlserver-xgboost

你可以在此处找到有关所有推理运行时的详细信息,完成后,我们需要做的就是添加两个配置文件:

  • settings.json- 这包含服务器本身的配置。
  • model-settings.json- 顾名思义,此文件包含我们要运行的模型的配置。对于我们的settings.json文件,只需定义一个参数就足够了:
{"debug": "true"
}

该model-settings.json文件需要更多信息,因为它需要了解我们尝试服务的模型:

{"name": "fashion-sklearn","implementation": "mlserver_sklearn.SKLearnModel","parameters": {"uri": "./Fashion_MNIST.joblib","version": "v1"}
}

name参数为 MLServer 提供了一个唯一标识符,这在为多个模型提供服务时特别有用(我们稍后会谈到)。定义implementation要使用的预建服务器(如果有),它与用于训练模型的机器学习框架紧密耦合。在我们的例子中,我们使用 scikit-learn 训练了模型,因此我们将使用 MLServer 的 scikit-learn 实现。对于模型,parameters我们只需要提供模型文件的位置以及版本号。

就是这样,两个小配置文件,我们准备好使用以下命令为我们的模型提供服务:

mlserver start .

我们现在已经在本地服务器上运行了我们的模型。它现在已准备好接受通过 HTTP 和 gRPC(分别为默认端口8080和8081)的请求。

四、测试模型

现在我们的模型已经启动并运行了。让我们发送一些请求以查看它的运行情况。

要对我们的模型进行预测,我们需要向以下 URL 发送 POST 请求:

http://localhost:8080/v2/models/<MODEL_NAME>/versions//infer

这意味着要访问我们之前训练的 scikit-learn 模型,我们需要用fashion-sklearn替换MODEL_NAME,用 v1替换VERSION。

下面的代码显示了如何导入测试数据,向模型服务器发出请求,然后将结果与实际标签进行比较:

import pandas as pd
import requests#Import test data, grab the first row and corresponding label
test = pd.read_csv('../../data/fashion-mnist_test.csv', header=0)
y_test = test['label'][0:1]
X_test = test.drop(['label'],axis=1)[0:1]#Prediction request parameters
inference_request = {"inputs": [{"name": "predict","shape": X_test.shape,"datatype": "FP64","data": X_test.values.tolist()}]
}
endpoint = "http://localhost:8080/v2/models/fashion-sklearn/versions/v1/infer"#Make request and print response
response = requests.post(endpoint, json=inference_request)
print(response.text)
print(y_test.values)

运行test.py上面的代码时,我们从 MLServer 得到以下响应:

{"model_name": "fashion-sklearn","model_version": "v1","id": "31c3fa70-2e56-49b1-bcec-294452dbe73c","parameters": null,"outputs": [{"name": "predict","shape": [1],"datatype": "INT64","parameters": null,"data": [0]}]
}

你会注意到 MLServer 已生成一个请求 ID,并自动添加了有关用于满足我们请求的模型和版本的元数据。一旦我们的模型投入生产,捕获这种元数据就非常重要;它允许我们记录每个请求以用于审计和故障排除目的。

你可能还会注意到 MLServer已返回一个数组outputs。在我们的请求中,我们只发送了一行数据,但MLServer也处理批量请求并将它们一起返回。你甚至可以使用一种称为自适应批处理的技术来优化在生产环境中处理多个请求的方式。

在我们上面的示例中,可以找到模型的预测,其中outputs[0].data显示模型已将此样本标记为类别0(值 0 对应于类别t-shirt/top)。该样本的真实标签也是,0所以模型得到了正确的预测!

五、训练 XGBoost 模型

现在我们已经了解了如何使用 MLServer 创建和提供单个模型,让我们来看看我们如何处理在不同框架中训练的多个模型。

我们将使用相同的 Fashion MNIST 数据集,但这次我们将训练XGBoost模型。


import pandas as pd
import xgboost as xgb
import time#Load Training Data
train = pd.read_csv('../../data/fashion-mnist_train.csv', header=0)
y_train = train['label']
X_train = train.drop(['label'], axis=1)
dtrain = xgb.DMatrix(X_train.values, label=y_train.values)#Train Model
params = {'max_depth': 5,'eta': 0.3,'verbosity': 1,'objective': 'multi:softmax','num_class' : 10
}
num_round = 50start = time.time()
bstmodel = xgb.train(params, dtrain, num_round, evals=[(dtrain, 'label')], verbose_eval=10)
end = time.time()
exec_time = end-start
print(f'Execution time: {exec_time} seconds')#Save Model
bstmodel.save_model('Fashion_MNIST.json')

上面用于训练 XGBoost 模型的代码与我们之前用于训练 scikit-learn 模型的代码类似,但这次我们的模型以 XGBoost 兼容格式保存为Fashion_MNIST.json。

六、服务多个模型

MLServer 的一个很酷的事情是它支持多模型服务。这意味着您不必为要部署的每个 ML 模型创建或运行新服务器。使用我们上面构建的模型,我们将使用此功能同时为它们提供服务。

当 MLServer 启动时,它将在目录(和任何子目录)中搜索model-settings.json文件。如果您有多个model-settings.json文件,那么它会自动为所有文件提供服务。

settings.json注意:您仍然只需要根目录中的一个(服务器配置)文件

这是我的目录结构的细分以供参考:

.
├── data
│   ├── fashion-mnist_test.csv
│   └── fashion-mnist_train.csv
├── models
│   ├── sklearn
│   │   ├── Fashion_MNIST.joblib
│   │   ├── model-settings.json
│   │   ├── test.py
│   │   └── train.py
│   └── xgboost
│       ├── Fashion_MNIST.json
│       ├── model-settings.json
│       ├── test.py
│       └── train.py
├── README.md
├── settings.json
└── test_models.py

请注意,有两个model-settings.json文件 - 一个用于 scikit-learn 模型,一个用于 XGBoost 模型。

我们现在可以运行mlserver start .,它将开始处理两个模型的请求。

[mlserver] INFO - Loaded model 'fashion-sklearn' succesfully.
[mlserver] INFO - Loaded model 'fashion-xgboost' succesfully.

七、测试多个模型的准确性

现在这两个模型都在 MLServer 上启动并运行,我们可以使用测试集中的样本来验证我们每个模型的准确性。

以下代码向每个模型发送一个批处理请求(包含完整的测试集),然后将收到的预测与真实标签进行比较。在整个测试集上执行此操作可以衡量每个模型的准确性。


import pandas as pd
import requests
import json#Import the test data and split the data from the labels
test = pd.read_csv('./data/fashion-mnist_test.csv', header=0)
y_test = test['label']
X_test = test.drop(['label'],axis=1)#Build the inference request
inference_request = {"inputs": [{"name": "predict","shape": X_test.shape,"datatype": "FP64","data": X_test.values.tolist()}]
}#Send the prediction request to the relevant model, compare responses to training labels and calculate accuracy
def infer(model_name, version):endpoint = f"http://localhost:8080/v2/models/{model_name}/versions/{version}/infer"response = requests.post(endpoint, json=inference_request)#calculate accuracycorrect = 0for i, prediction in enumerate(json.loads(response.text)['outputs'][0]['data']):if y_test[i] == prediction:correct += 1accuracy = correct / len(y_test)print(f'Model Accuracy for {model_name}: {accuracy}')infer("fashion-xgboost", "v1")
infer("fashion-sklearn", "v1")

结果表明,XGBoost 模型略优于 SVM scikit-learn 模型:

Model Accuracy for fashion-xgboost: 0.8953
Model Accuracy for fashion-sklearn: 0.864


总结

希望现在你已经了解使用MLServer为模型提供服务是多么容易。

参考

https://dev.to/ukcloudman/serving-python-machine-learning-models-with-ease-37kh

相关文章:

如何基于MLServer构建Python机器学习服务

文章目录前言一、数据集二、训练 Scikit-learn 模型三、基于MLSever构建Scikit-learn服务四、测试模型五、训练 XGBoost 模型六、服务多个模型七、测试多个模型的准确性总结参考前言 在过去我们训练模型&#xff0c;往往通过编写flask代码或者容器化我们的模型并在docker中运行…...

9.1 IGMPv1实验

9.4.1 IGMPv1 实验目的 熟悉IGMPv1的应用场景掌握IGMPv1的配置方法实验拓扑 实验拓扑如图9-7所示&#xff1a; 图9-7&#xff1a;IGMPv1 实验步骤 &#xff08;1&#xff09;配置IP地址 MCS1的配置 MCS1的IP地址配置如图9-8所示&#xff1a; 图9-8&#xff1a;MCS1的配置 …...

软考高级系统分析师系列论文之十:论实时控制系统与企业信息系统的集成在通信业应用

软考高级系统分析师系列论文之十:论实时控制系统与企业信息系统的集成在通信业应用 一、摘要二、正文三、总结一、摘要 近年来,在应用需求的强大驱动下,我国通信业有了长足的进步。现有通信行业中的许多企业单位,如电信公司或移动集团,其信息系统的主要特征之一是对线路的…...

NIO与零拷贝

目录 一、零拷贝的基本介绍 二、传统IO数据读写的劣势 三、mmap优化 四、sendFile优化 五、 mmap 和 sendFile 的区别 六、零拷贝实战 6.1 传统IO 6.2 NIO中的零拷贝 6.3 运行结果 一、零拷贝的基本介绍 零拷贝是网络编程的关键&#xff0c;很多性能优化都离不开。 在…...

【PAT甲级题解记录】1151 LCA in a Binary Tree (30 分)

【PAT甲级题解记录】1151 LCA in a Binary Tree (30 分) 前言 Problem&#xff1a;1151 LCA in a Binary Tree (30 分) Tags&#xff1a;树的遍历 并查集 LCA Difficulty&#xff1a;剧情模式 想流点汗 想流点血 死而无憾 Address&#xff1a;1151 LCA in a Binary Tree (30 分…...

Android 获取手机语言环境 区分简体和繁体,香港,澳门,台湾繁体

安卓和IOS 系统语言都是准守&#xff1a;ISO 639 ISO 代码表IOS&#xff1a;plus.os.language ios正常&#xff0c;安卓下简体和繁体语言&#xff0c;都是zh安卓获取系统语言方法&#xff1a;Locale.getDefault().language手机切换到繁体&#xff08;台湾&#xff0c;香港&…...

一文搞懂Python时间序列

Python时间序列1. datetime模块1.1 datetime对象1.2 字符串和datatime的相互转换2. 时间序列基础3. 重采样及频率转换4. 时间序列可视化5. 窗口函数5.1 移动窗口函数5.2 指数加权函数5.3 二元移动窗口函数时间序列&#xff08;Time Series&#xff09;是一种重要的结构化数据形…...

GeoServer发布数据进阶

GeoServer发布数据进阶 GeoServer介绍 GeoServer是用于共享地理空间数据的开源服务器。 它专为交互操作性而设计&#xff0c;使用开放标准发布来自任何主要空间数据源的数据。 GeoServer实现了行业标准的 OGC 协议&#xff0c;例如网络要素服务 &#xff08;WFS&#xff09;…...

Docker离线部署

Docker离线部署 目录 1、需求说明 2、下载docker安装包 3、上传docker安装包 4、解压docker安装包 5、解压的docker文件夹全部移动至/usr/bin目录 6、将docker注册为系统服务 7、重启生效 8、设置开机自启 9、查看docker版本信息 1、需求说明 大部份公司为了服务安全…...

《数据库系统概论》学习笔记——第七章 数据库设计

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 这一章概念比较多。最重点就是7.4节。 7.1 数据库设计概述 数据库设计定义&#xff1a; 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#x…...

【Datawhale图机器学习】半监督节点分类:标签传播和消息传递

半监督节点分类&#xff1a;标签传播和消息传递 半监督节点分类问题的常见解决方法&#xff1a; 特征工程图嵌入表示学习标签传播图神经网络 基于“物以类聚&#xff0c;人以群分”的Homophily假设&#xff0c;讲解了Label Propagation、Relational Classification&#xff…...

【分布式缓存学习篇】Redis数据结构

一、Redis的数据结构 二、String 数据结构 2.1 字符串常用操作 //存入字符串键值对 SET key value //批量存储字符串键值对 MSET key value [key value ...] //存入一个不存在的字符串键值对 SETNX key value //获取一个字符串键值 GET ke…...

【跟着ChatGPT学深度学习】ChatGPT带我入门NLP

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

RGB888与RGB565颜色

颜色名称RGB888原色RGB565还原色英RGB888[Hex]RGB888_R[Hex]RGB888_G[Hex]RGB888_B[Hex]RGB565[Hex]RGB565_R[Hex]RGB565_G[Hex]RGB565_B[Hex]黑色Black0x0000000000000x0000000昏灰Dimgray0x6969696969690x6B4DD1AD灰色Gray0x8080808080800x8410102010暗灰Dark Gray0xA9A9A9A9…...

常见的域名后缀有哪些?不同域名后缀的含义是什么?

域名发展至今&#xff0c;已演变出各种各样的域名后缀&#xff0c;导致很多网站管理人员在注册域名时不知该如何选择。下面&#xff0c;中科三方针对常见域名后缀种类&#xff0c;以及不同域名后缀的含义做下简单介绍。 什么是域名后缀&#xff1f; 域名是由一串由点分隔开的…...

LevelDB架构介绍以及读、写和压缩流程

LevelDB 基本介绍 是一个key/value存储&#xff0c;key值根据用户指定的comparator排序。 特性 keys 和 values 是任意的字节数组。数据按 key 值排序存储。调用者可以提供一个自定义的比较函数来重写排序顺序。提供基本的 Put(key,value)&#xff0c;Get(key)&#xff0c;…...

华为OD机试模拟题 用 C++ 实现 - 快递货车(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明快递货车题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单…...

伺服三环控制深层原理解析

我们平时使用的工业伺服,通常是成套伺服,即驱动器和电机型号存在配对关系。 但有些时候,我们要用电机定转子和编码器制作非成套电机,这种时候,我们需要对驱动器进行各种设置才能驱动电机。 此篇文章将通过介绍伺服控制的三环控制原理入手来说明我们调试非成套伺服时需要…...

Cornerstone完整的基于 Web 的医学成像平台(一)

1.简介 Cornerstone是一个开源的基于Web的医学成像平台&#xff0c;它提供了一个易于使用的界面&#xff0c;可以用于加载、显示和处理医学图像。Cornerstone可以用于许多医学图像处理应用程序&#xff0c;例如计算机断层扫描&#xff08;CT&#xff09;、磁共振成像&#xff…...

老板让我在Linux中使用traceroute排查服务器网络问题,幸好我收藏了这篇文章!

一、前言 作为网络工程师或者运维工程师&#xff0c;traceroute命令不会陌生&#xff0c;它的作用类似于ping命令&#xff0c;用于诊断网络的连通性&#xff0c;不过traceroute命令输出的命令会比ping命令丰富的多&#xff0c;可以跟踪从源系统到目标系统的路径。 很多工程师…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...