随着机器学习在商业决策中的采用呈指数级增长,预计到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'))