如何利用 Python 创建机器学习模型
你有没有碰到过这种情形, 就是当你训练好了一个新的模型之后, 有时候你不想费心思去编写Flask Code(那个 Web 框架), 也不想把模型进行容器化然后在其中运行它, 而是想着直接通过 API 去马上使用这个模型呢?
要是你存在这个需求, 那必定就是想要去了解。它属于一个基于某种情况的推理服务器, 近期已然推出了GA(也就是遗传算法)的版本, 这可是一款专门针对生产环境而设计的具备高性能的服务器。
运用它能够保证于本地开展模型构建, 和投入到生产环境里的模型维持一致。
本文以几个图像模型为例,向您介绍如何使用 。
数据集
我们所要运用的数据集是MNIST, 其含有70,000张灰度且为28x28像素的服装图像, 这些图像覆盖了10个不同的类别, 像上衣、连衣裙、外套、裤子这类。
若您期望能再现本文之中所呈现的代码, 那就务必要确认去下载那些文件且把它们进行解压缩, 放置到名为 data 的地方, 鉴于文件体积极为庞大, 故而存储库里面将它们省略掉了。
1.训练 -learn 模型
起初, 我们会运用 -learn 框架去训练一个支持向量机, 也就是 SVM 模型。紧接着把模型存储到一个叫做 -MNIST 的文件里头。
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")1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.留意, SVM算法并非格外适配大型数据集, 缘由在于它具备二次性质。依据您的硬件状况, 此示例里的模型将会耗费几分钟的时长来开展训练。
2.服务于 -learn 模型
依照上面提及的所有步骤, 我们最终成功获取到了一个名为MNIST的模型文件。紧接着要去探究一下, 究竟该以怎样的方式运用它来实现提供服务这一目的。
首先,通过如下命令安装 :pip 。
虽说额外的运行时组件属于可选择的范围, 然而在服务模型之际会相对更加顺畅, 并且我们同样会去安装 -Learn 以及 的扩展。
完成pip - -操作后,就需要添加如下两个配置文件:
(1).json- 这包含服务器本身的配置。
(2)所提到的名为model-.json- 的文件, 按照其名称所表达的含义来讲, 这个文件当中涵盖了那些用于运行的模型配置。
对于.json文件,只定义一个参数就足够了:
{ "debug": "true" }1.2.3.那个model-.json文件, 是需要更多信息的, 原因在于, 那里边它需要去了解服务模型的相关信息。
{ "name": "fashion-sklearn", "implementation": "mlserver_sklearn.SKLearnModel", "parameters": { "uri": "./Fashion_MNIST.joblib", "version": "v1" } }1.2.3.4.5.6.7.8.name参数给出了唯一标识符, 这在多模型服务场景里很有用, 稍后会提及。要定义用来预构建服务器的, 要是有的话。它跟用于训练模型的机器学习框架紧密关联。在我们的实例中用 -learn训练模型, 所以会用 -learn达成。配置得给出模型文件的位置以及版本号。
凭借前面所进行那个配置, 能够借助以下命令来给我们的模型给予服务, 此命令为: start。
就是这般容易, 当下已然使得模型在本地服务器上运转起来了, 此刻, 它已能够接纳诸如 HTTP 那般, 以及 gRPC(其默认端口为 8080 和 8081)的请求了。
3.测试模型
模型已被启动, 处于并且状态上是正常运行着的, 那么此刻我们来发送一些请求用于测试当下它的运转情况, 以此来了解运行情况。
我们会通过如下URL 发送一个 POST 请求:
:8080/v2/////infer
这个URL所表示的是, 去访问之前训练好的那个 -learn 模型, 在此处, 仅仅是要把带有 - 的模型名称予以替换, 与此同时, 还要把用 v1 进行替换。
跟着下面的代码, 能呈现出怎样导入测试数据的情况, 接着是怎样向模型服务器发出请求的状况, 随后是怎样将结果跟实际标签进行比较的情形:
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)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.运行上面的test.py之后,会从 得到以下响应:
"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 ] } ] }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.可从响应当中, 知道已生成了一个请求ID, 且自动添加了用于服务请求的模型以及版本的元数据, 在模型投入生产后, 收集类似的元数据有着相当的重要性, 这能让我们记录每个请求, 进而便利地去进行审计以及故障排除。
您或许也留意到, 返回一个数组, 尽管于请求里仅发送了一行数据, 然而处理批量请求, 并一同返回, 而我们甚至能够借助一种称作自适应批处理的技术, 从而优化在生产环境里处理多个请求的方式。
于之上述示例里头, 亦能够寻觅到模型所预测之结果。.data显示模型已为该样本标记作类别0 , 数值0便是对应着类别t-shirt/top。该样本真实标签同样为0亦如此这般, 所以模型经获正确之预测。
4.训练 模型
借由上面所举的例子, 我们知悉了怎样去运用, 从而创建单个模型, 紧跟着, 让我们瞧瞧如何去处理, 那些于不同框架里训练的多个模型。
依旧使用 MNIST 数据集,但这次将训练模型。
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')1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.上头用在训练模型的代码, 跟先前拿来训练 -learn 模型的代码相像, 然而这一回, 模型为了适配的格式, 把它存成.json 文件了。
5.服务多个模型
某个具有的优点是对多模型服务予以支持, 这所表达的意思是, 针对部署的每一个ML模型, 并不需要去创建或者运行新的服务器, 运用上面构建而成的模型, 会把此功能利用起来, 同时为其提供服务。
当开启之际, 它会于目录以及任何子目录之内寻找model-.json文件。要是您存有多个model-.json文件, 进而它会自动为全部文件予以服务。
留意: 您依旧仅需指明根目录里的, 由(服务器配置)修饰的那个文件.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.py1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.请注意, 存在两个model-.json文件, 其中一个是提供给用于-learn模型的, 另一个则是供模型之用的。
现在可以运行 start .,它将开始处理两个模型的请求。
[mlserver] INFO - Loaded model 'fashion-sklearn' succesfully. [mlserver] INFO - Loaded model 'fashion-xgboost' succesfully.1.2.6.测试多个模型的准确性
当下, 在特定的某个地方, 存在两个模型在运行着, 我们能够借助测试集中所包含的样本, 去验证每一个模型的精确程度, 以此来确定其准确性。
如下代码, 会向各个模型寄出一个含有完整测试集的批处理请求, 接着把预测值跟真实标签予以比较, 在整个测试集上开展此操作, 给我们提供了衡量每个模型准确性的办法, 随后将最终结果打印出来。
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")1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.结果表明, 模型略微优于 SVM -learn 模型:
Model Accuracy for fashion-xgboost: 0.8953 Model Accuracy for fashion-sklearn: 0.8641.2.总结
期望凭借上述的阐述, 您已然知悉运用服务模型的大致流程。要是想要知晓更多的讯息, 您就得去阅读相关的文档并且查看不同框架的示例。
使用者那边, 能够依托利用把模型于当中予以提供, 假设各位恰是使用者本人, 应当知晓Core这一事物, 它属于一款把模型部署至所在之处的开源工具此物于后端运用着。
译者介绍
名为崔皓的人, 是51CTO社区的编辑, 身为资深架构师, 有着18年软件开发以及架构方面的经验, 还有10年分布式架构的经验, 曾担任过惠普的技术专家, 他乐于去分享, 撰写了好多热门技术文章, 这些文章阅读量超过60万, 他还是《分布式架构原理与实践》的作者。
参考链接: