当前位置: 首页 > 科技观察

如何使用Python创建机器学习模型

时间:2023-03-14 10:45:59 科技观察

指南你是否遇到过这样的场景,当你训练一个新模型时,有时你不想费心编写Flask代码(Python的web框架)或者将模型容器化并运行它在Docker中运行它并想通过API立即使用该模型?如果你有这个需求,你肯定想了解MLServer。它是一个基于Python的推理服务器,最近推出了一个版本的GA(GeneticAlgorithms遗传算法),这是一个专为生产环境设计的高性能服务器。使用它来确保您的模型是在本地构建的,以匹配投入生产的模型。本文以几种图像模型为例,向您介绍MLServer的使用方法。数据集我们将要使用的数据集是FashionMNIST。它包含70,000张灰度28x28像素的服装图像,涵盖10个不同的类别(例如上衣、连衣裙、外套、裤子等)。如果您想重现本文中的代码,请确保下载文件并将它们解压缩到名为data的文件中。由于这些文件非常大,因此从GitHub存储库中省略了它们。1.训练Scikit-learn模型首先,我们将使用scikit-learn框架训练支持向量机(SVM)模型。然后我们将模型保存到一个名为Fashion-MNIST.joblib的文件中。将熊猫导入为ppdfromsklearnimportsvmimporttimeimportjoblib#LoadTrainingDatatrain=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)#训练模型start=time.time()classifier.fit(X_train.values,y_train.values)end=time.time()exec_time=end-startprint(f'执行时间:{exec_time}秒')#SaveModeljoblib.dump(classifier,"Fashion-MNIST.joblib")注:SVM算法不是特别由于其二次性质,适用于大型数据集。根据您的硬件,此示例中的模型将需要几分钟的时间来训练。2.为Scikit-learn模型服务通过以上步骤,我们得到了一个模型文件Fashion-MNIST.joblib。接下来我们看看如何使用MLServer来提供服务。首先,使用以下命令安装MLServer:pipinstallmlserver。虽然额外的运行时组件是可选的,但为了使模型服务更顺畅,我们还安装了Scikit-Learn和XGBoost的扩展。.完成pipinstallmlserver-sklearnmlserver-xgboost操作后,需要添加如下两个配置文件:(1)settings.json——里面包含了服务器本身的配置。(2)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,在多模型服务场景中特别有用(稍后会详细介绍)。定义用于预构建服务器(如果有)的实现。它与用于训练模型的机器学习框架高度耦合。在我们的案例中,scikit-learn用于训练模型,因此MLServer将使用scikit-learn实现。Parameters配置需要提供模型文件的位置和版本号。通过以上配置,我们可以使用如下命令为我们的模型提供服务:mlserverstart。就这么简单,现在模型就在本地服务器上运行了。此时,它已经可以接受像HTTP和gRPC这样的请求(默认端口是8080和8081)。3.测试模型现在模型已经启动并运行了,让我们发送一些请求来测试它是如何工作的。我们会通过以下URL发送POST请求:http://localhost:8080/v2/models//versions//infer这个URL表示访问之前训练好的scikit-learn模型,这里只需要将MODEL_NAME替换为fashion-sklearn的型号名称,VERSION替换为v1。下面的代码显示了如何导入测试数据,向模型服务器发出请求,并将结果与??实际标签进行比较:importpandasaspdimportrequests#导入测试数据,抓取第一行和对应的labeltest=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]#预测请求参数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"#Makerequestandprintresponseresponse=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],"data类型":"INT64","parameters":null,"data":[0]}]}您可以从响应中看出MLServer已生成请求ID并自动添加模型的元数据和用于服务请求的版本一旦模型投入生产,收集相似的元数据非常重要。它允许我们记录每个请求,以便于审计和故障排除。您可能还会注意到MLServer返回一个数组输出。虽然请求中只发送了一行数据,但是MLServer是对请求进行批量处理,并一起返回的。我们甚至可以通过称为自适应批处理的技术优化我们在生产中处理多个请求的方式。在上面的例子中,也可以找到模型的预测结果。outputs[0].data表示模型已将此样本标记为类别0(值0对应类别T恤/上衣)。这个样本的真实标签0也是如此,因此模型得到了正确的预测。4.训练XGBoost模型通过上面的例子我们学习了如何使用MLServer创建单个模型,接下来我们看看如何处理在不同框架中训练的多个模型。仍然使用FashionMNIST数据集,但这次训练的是XGBoost模型。将pandas导入为pdimportxgboost作为xgbimporttime#LoadTrainingDatatrain=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)#TrainModelparams={'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-startprint(f'Executiontime:{exec_time}seconds')#SaveModelbstmodel.save_model('Fashion_MNIST.json')上面训练XGBoost模型的代码是和之前使用的一样类似于训练scikit-learn模型的代码,只不过这次为了兼容XGBoost格式,我们的模型保存为Fashion_MNIST.json文件。5.服务多模型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模型。您现在可以运行mlserverstart。它将开始处理两种模型的请求。[mlserver]信息-成功加载模型“fashion-sklearn”。[mlserver]信息-成功加载模型“fashion-xgboost”。6.测试多个模型的准确性既然两个模型都在MLServer上运行,我们可以使用测试集中的样本来验证每个模型的准确性。以下代码向每个模型发送一个批处理请求(带有完整的测试集),然后将预测与真实标签进行比较。在整个测试集上执行此操作为我们提供了一种方法来衡量每个模型的准确性并打印最终结果。importpandasaspdimportrequestsimportjson#导入测试数据并从标签中拆分数据test=pd.read_csv('./data/fashion-mnist_test.csv',header=0)y_test=test['label']X_test=test.drop(['label'],axis=1)#Buildtheinferencerequestinference_request={"inputs":[{"name":"predict","shape":X_test.shape,"datatype":"FP64","data":X_test.values.tolist()}]}#向相关模型发送预测请求,对比训练标签的响应并计算准确率definfer(model_name,version):endpoint=f"http://localhost:8080/v2/models/{model_name}/versions/{version}/infer"response=requests.post(endpoint,json=inference_request)#计算准确度correct=0fori,predictioninenumerate(json.loads(response.text)['outputs'][0]['data']):ify_test[i]==prediction:correct+=1accuracy=correct/len(y_test)print(f'ModelAccuracyfor{model_name}:{accuracy}')infer("fashion-xgboost","v1")infer("fashion-sklearn","v1")结果表明,XGBoost模型略优于SVMscikit-learn模型:ModelAccuracyforfashion-xgboost:0.8953ModelAccuracyforfashion-sklearn:0.864总结希望通过以上的描述,你已经了解了使用MLServer服务模型的大致流程。如果您需要更多信息,则需要阅读相关文档并查看不同框架的示例。对于MLFlow用户,MLServer可以直接在MLFlow中为模型提供服务,如果你是Kubernetes用户,你应该知道SeldonCore,这是一个将模型部署到Kubernetes的开源工具(它在幕后使用MLServer)。译者介绍崔昊,51CTO社区编辑,高级架构师,18年软件开发和架构经验,10年分布式架构经验。他曾经是惠普的技术专家。乐于分享,撰写了多篇阅读量超过60万的热门技术文章。《分布式架构原理与实践》作者。参考链接:https://dzone.com/articles/How-to-Utilize-Python-Machine-Learning-Models