机器学习与性能工程

随着机器学习在商业决策中的采用呈指数级增长,预计到2024年市场规模将达到306亿美元。云计算提供的计算能力、基础设施和自动化的便捷性进一步加速了这一趋势。数据科学家和工程师利用机器学习的力量设计创新的解决方案/服务,其中之一就是模型即服务(MaaS)。使用了许多这样的服务,而不知道它们是如何构建或在网络上提供的,例如数据可视化、面部识别、自然语言处理、预测分析等。简而言之,MaaS封装了所有复杂的数据、模型训练与评估、部署等,让客户可以根据自己的目的使用它。

尽管使用这些服务感觉很简单,但在构建这样的服务时存在许多挑战,例如:如何维护服务?如何确保模型的准确性不会随时间下降?等等。与任何服务或应用程序一样,需要考虑的一个主要因素是服务/API能够处理的负载或流量,以确保其正常运行时间。API的最佳特性是具有出色的性能,而测试这一点的唯一方法是通过压力测试API,看看它如何响应。这就是负载测试

在这篇博客中,将不仅探讨如何构建这样的服务,还将探讨如何对服务进行负载测试,以规划生产环境中的硬件/基础设施需求。将按照以下顺序实现这一点:使用FastAPI构建一个简单的API;用Python构建一个分类模型;用FastAPI包装模型;用Postman客户端测试API;用Locust进行负载测试。让开始吧!

创建一个简单的Web API使用FastAPI:以下代码显示了FastAPI的基本实现。该代码用于创建一个简单的Web-API,当接收到特定输入时产生特定输出。以下是代码的分解:加载库;创建一个app对象;创建一个带有@app.get()的路由;编写一个具有定义的主机和端口号的驱动函数。

from fastapi import FastAPI, Request from typing import Dict from pydantic import BaseModel import uvicorn import numpy as np import pickle import pandas as pd import json app = FastAPI() @app.get("/") async def root(): return {"message": "Built with FastAPI"} if __name__ == '__main__': uvicorn.run(app, host='127.0.0.1', port=8000)

执行后,可以在浏览器中导航到URL:http://localhost:8000,并观察结果,这种情况下将是‘Built withFastAPI’。

机器学习模型创建API使用FastAPI:现在已经对FastAPI有了很好的了解,让看看如何将机器学习模型(用Python开发)包装成API。将使用乳腺癌威斯康星(诊断)数据集。这个ML项目的目标是预测一个人是否有良性或恶性肿瘤。将使用VSCode作为编辑器,并注意将使用Postman客户端测试服务。

将遵循以下步骤。首先构建分类模型——KNeighborsClassifier()。构建服务器文件,该文件将具有FlastAPI框架中的API逻辑。最后,将使用Postman测试服务。步骤1:分类模型。一个简单的分类模型,标准过程是加载数据,将数据拆分为训练/测试,然后构建模型并将模型以pickle格式保存在驱动器上。不会深入模型构建的细节,因为文章是关于负载测试的。

import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier import joblib, pickle import os import yaml CONFIG_PATH = "../Configs" def load_config(config_name): """[The function takes the yaml config file as input and loads the the config] Args: config_name ([yaml]): [The function takes yaml config as input] Returns: [string]: [Returns the config] """ with open(os.path.join(CONFIG_PATH, config_name)) as file: config = yaml.safe_load(file) return config config = load_config("config.yaml") filename = "../../Data/breast-cancer-wisconsin.csv" data = pd.read_csv(filename) data = data.replace('?', -99999) data = data.drop(config["drop_columns"], axis=1) X = np.array(data.drop(config["target_name"], 1)) y = np.array(data[config["target_name"]]) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=config["test_size"], random_state= config["random_state"]) classifier = KNeighborsClassifier(n_neighbors=config["n_neighbors"], weights=config["weights"], algorithm=config["algorithm"], leaf_size=config["leaf_size"], p=config["p"], metric=config["metric"], n_jobs=config["n_jobs"]) classifier.fit(X_train, y_train) result = classifier.score(X_test, y_test) print("Accuracy score is. {:.1f}".format(result)) pickle.dump(classifier, open('../../FastAPI//Models/KNN_model.pkl','wb'))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485