📢 转载信息
原文作者:Jason Brownlee
部署机器学习模型以供其他人使用是一项关键任务。本指南专为机器学习从业者设计,提供了一个清晰的路线图,指导如何使用FastAPI框架部署机器学习模型。
FastAPI是一个现代、快速(高性能)的Web框架,用于基于Python标准类型提示构建API。它具有自动数据验证、序列化和交互式API文档等强大的功能,非常适合作为生产级机器学习模型的服务接口。
机器学习模型部署路线图
部署模型的实践路线图通常涉及以下关键步骤:
- 准备模型:确保您的模型已训练完毕并已保存(例如,使用pickle或joblib)。
- 设置环境:创建Python虚拟环境并安装必要的库,包括FastAPI和Uvicorn(ASGI服务器)。
- 创建模型加载器:编写代码以在应用程序启动时加载模型,避免每次请求都重新加载模型。
- 定义API端点:使用FastAPI的装饰器定义接收输入数据并返回预测结果的路由。
- 数据预处理/后处理:在将数据传递给模型之前和之后,对数据进行必要的转换。
- 运行服务:使用Uvicorn启动Web服务器。
让我们逐步探讨这些步骤。
1. 准备工作:安装库
首先,您需要安装FastAPI和用于运行异步Web应用程序的ASGI服务器Uvicorn。您还需要安装scikit-learn,因为我们将使用一个示例模型。
pip install fastapi uvicorn scikit-learn pandas
我们还将使用pandas来帮助处理数据,尽管对于非常简单的输入,它不是必需的。
2. 训练和保存示例模型
为了演示部署,我们需要一个已训练好的模型。我们将使用scikit-learn中的逻辑回归模型作为示例。
创建一个Python脚本(例如train_model.py)来训练模型并将其保存到文件中。
# train_model.py
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from joblib import dump
# 1. 创建一些示例数据(假设我们有一个分类问题)
data = {
'feature1': [10, 12, 20, 22, 30, 32, 40, 42, 50, 52],
'feature2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
'target': [0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
}
df = pd.DataFrame(data)
X = df[['feature1', 'feature2']]
y = df['target']
# 2. 训练模型
model = LogisticRegression()
model.fit(X, y)
# 3. 保存模型
dump(model, 'model.joblib')
print("Model trained and saved as model.joblib")
运行此脚本:
python train_model.py
现在,您应该在工作目录中有一个名为model.joblib的文件。
3. 构建FastAPI应用程序
这是部署的核心部分。我们将创建一个名为app.py的文件,用于加载模型并定义API。
3.1 导入库和定义数据模型
FastAPI使用Pydantic模型来定义输入数据的结构和验证。这使得API的输入非常清晰和健壮。
# app.py
from fastapi import FastAPI
from pydantic import BaseModel
from joblib import load
import pandas as pd
# 1. 初始化FastAPI应用
app = FastAPI()
# 2. 定义请求体的数据模型
class Item(BaseModel):
feature1: float
feature2: float
# 3. 全局变量用于存储模型
model = None
@app.on_event("startup")
def load_model():
global model
# 在应用启动时加载模型
try:
model = load('model.joblib')
print("Model loaded successfully.")
except FileNotFoundError:
print("Error: model.joblib not found. Ensure training script was run.")
model = None
@app.on_event("startup")装饰器确保load_model函数在服务器启动时运行一次,将模型加载到内存中。
3.2 定义根路径
添加一个简单的根路径,用于确认API是否正在运行。
@app.get("/")
def read_root():
return {"message": "ML Model API is running!"}
3.3 定义预测端点
这是接收用户请求并返回预测结果的端点。我们将使用POST请求,因为它通常用于发送需要处理的数据。
@app.post("/predict")
def predict(item: Item):
if model is None:
return {"error": "Model not loaded"}, 500
# 1. 准备输入数据 (FastAPI/Pydantic已经处理了类型转换)
# 将数据转换为模型期望的二维数组格式
input_data = [[item.feature1, item.feature2]]
# 2. 进行预测
prediction = model.predict(input_data)[0]
probability = model.predict_proba(input_data)[0].tolist()
# 3. 返回结果
return {
"prediction": int(prediction),
"probabilities": probability
}
注意,这里将Pydantic模型Item直接作为参数传入predict函数。FastAPI会自动处理:
- 验证传入的JSON数据是否与
Item结构匹配。 - 如果验证失败,自动返回错误响应。
- 如果验证成功,将数据注入
item对象中。
我们对模型预测的结果进行了简单的类型转换(例如,将NumPy整数转换为标准的Python整数),以便JSON序列化能够成功。
最终的app.py代码如下:
# app.py (完整版)
from fastapi import FastAPI
from pydantic import BaseModel
from joblib import load
app = FastAPI()
model = None
class Item(BaseModel):
feature1: float
feature2: float
@app.on_event("startup")
def load_model():
global model
try:
model = load('model.joblib')
print("Model loaded successfully.")
except FileNotFoundError:
print("Error: model.joblib not found. Ensure training script was run.")
model = None
@app.get("/")
def read_root():
return {"message": "ML Model API is running!"}
@app.post("/predict")
def predict(item: Item):
if model is None:
return {"error": "Model not loaded"}, 500
input_data = [[item.feature1, item.feature2]]
prediction = model.predict(input_data)[0]
probability = model.predict_proba(input_data)[0].tolist()
return {
"prediction": int(prediction),
"probabilities": probability
}
4. 运行API服务
使用Uvicorn运行应用程序。我们指定app:app,表示在app.py文件中查找名为app的FastAPI实例。
uvicorn app:app --reload
参数--reload在开发环境中非常有用,它会在代码更改时自动重新启动服务器。
启动后,您会看到类似以下的输出:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [XXXX]
Model loaded successfully.
恭喜!您的模型现在正在运行一个Web服务。
5. 测试API
FastAPI最大的优势之一是它自动为您的API生成交互式文档,通常位于http://127.0.0.1:8000/docs。
您可以访问该URL,找到/predict端点,并点击Try it out按钮来测试服务。
输入一个示例请求体,例如:
{
"feature1": 25.0,
"feature2": 5.5
}
如果模型加载成功,您将收到一个JSON响应,包含预测结果和概率。
生产环境的注意事项
上述示例是一个优秀的起点,但生产部署需要考虑更多因素:
- 并发和性能:Uvicorn可以配置工作进程(workers)和线程(threads)以更好地利用多核CPU。
- 模型序列化:对于大型模型(如深度学习模型),pickle或joblib可能不是最高效的方式。考虑使用如ONNX或特定框架的优化格式。
- 输入验证:对于更复杂的数据结构,Pydantic模型可以包含更严格的验证规则,例如范围检查或枚举值。
- 依赖管理:使用
requirements.txt文件来明确项目的依赖项,方便在生产环境中重现环境。
总而言之,FastAPI提供了一个轻量级、高性能且文档完善的框架,使得将复杂的scikit-learn、XGBoost或任何Python模型封装成可扩展的API服务变得异常简单。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区