首页 > 编程语言 >如何基于MLServer构建Python机器学习服务

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

时间:2023-03-31 13:32:20浏览次数:50  
标签:fashion Python 模型 json train 构建 test MLServer model


文章目录

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

前言

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

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


一、数据集

本博客通过使用几个图像模型作为示例,介绍如何使用 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 = 50

start = 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 accuracy
    correct = 0
    for i, prediction in enumerate(json.loads(response.text)['outputs'][0]['data']):
        if y_test[i] == prediction:
            correct += 1
    accuracy = 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



标签:fashion,Python,模型,json,train,构建,test,MLServer,model
From: https://blog.51cto.com/u_15996214/6161657

相关文章

  • Python 应用 - jieba 分词 1:进行批量文本分词_艽野尘梦 better 的博客 - CSDN 博客
    知识点小结os.walk()os.walk()方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。os.walk()方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。importpandasaspdimportmatplotlib.pyplotaspltimportjiebafromPILimp......
  • 东用科技路由器与H3C Router构建IPSec VPN配置指导手册
    东用科技路由器与H3CRouter构建IPSecVPN配置指导手册一、H3CRouter配置:<H3CRouter>system-view//进入配置模式[H3CRouter]local-useradmin//添加本地用户[H3CRouter-luser-cisco]passwordsimpleadmin//为添加的用户设置密码[H3CRouter-luser-cisco]service-typeweb//开......
  • Ubuntu系统python3.9.0安装dlib库的经历
    1.直接condainstalldlib或者是pipinstalldlib库,结果失败。2.根据一些搜索的内容提示先安装dlib依赖的库,再installdlib结果:安装了cmake,再执行dlib安装命令依然失败3.直接去dlib官网下载,dlib代码库,根据其他博客的提示下,编译,执行setup.py安装。结果:表面上成功,在python......
  • 如何方便的给你的python函数进行参数类型检查
    python有时候很麻烦的一点,为了运算速度,不给你做类型检查。这个特性被各路大佬当成重载的秘宝,但是有时候对工程性的项目来说并不安全。这里介绍一个notice工具,会对函数形参标注类型和实参类型不一样时进行输出提醒(不报错,不影响运行)1fromtypingimportget_type_hints2from......
  • Python: utilities
     decimal_to_binarydefdecimal_to_binary(v:float,precison:int=6)->str:ifv==0:return'0b0'binary=''integral=int(v)#integralpartmantissa=v-integral#fractionalpart#conver......
  • 好饭不怕晚,Google基于人工智能AI大语言对话模型Bard测试和API调用(Python3.10)
    谷歌(Google)作为开源过著名深度学习框架Tensorflow的超级大厂,是人工智能领域一股不可忽视的中坚力量,旗下新产品Bard已经公布测试了一段时间,毁誉参半,很多人把Google的Bard和OpenAI的ChatGPT进行对比,GoogleBard在ChatGPT面前似乎有些技不如人。事实上,GoogleBard并非对标ChatGPT......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能编写Python注释文档字符串从0到1快速入门
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-类比语句智能生成从0到1快速入门——官网推荐
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-自然语言智能获取颜色从0到1快速入门——官网
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......
  • python zip()函数
    Pythonzip()函数描述zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*号操作符,可以将元组解压为列表。zip方法在Python2和Python3中的不同:......