如何利用 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, header0) y_train train[label] X_train train.drop([label], axis1) classifier svm.SVC(kernelpoly, degree4, gamma0.1) #Train Model start time.time() classifier.fit(X_train.values, y_train.values) end time.time() exec_time end-start print(fExecution 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, header0) y_test test[label][0:1] X_test test.drop([label],axis1)[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, jsoninference_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, header0) y_train train[label] X_train train.drop([label], axis1) dtrain xgb.DMatrix(X_train.values, labely_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_eval10) end time.time() exec_time end-start print(fExecution 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, header0) y_test test[label] X_test test.drop([label],axis1) #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 fhttp://localhost:8080/v2/models/{model_name}/versions/{version}/infer response requests.post(endpoint, jsoninference_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(fModel 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万, 他还是《分布式架构原理与实践》的作者。参考链接