目 录CONTENT

文章目录

机器学习从业者使用FastAPI进行模型部署的实践指南

Administrator
2026-01-31 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/the-machine-learning-practitioners-guide-to-model-deployment-with-fastapi/

原文作者:Jason Brownlee


部署机器学习模型以供其他人使用是一项关键任务。本指南专为机器学习从业者设计,提供了一个清晰的路线图,指导如何使用FastAPI框架部署机器学习模型。

FastAPI是一个现代、快速(高性能)的Web框架,用于基于Python标准类型提示构建API。它具有自动数据验证、序列化和交互式API文档等强大的功能,非常适合作为生产级机器学习模型的服务接口。

机器学习模型部署路线图

部署模型的实践路线图通常涉及以下关键步骤:

  • 准备模型:确保您的模型已训练完毕并已保存(例如,使用picklejoblib)。
  • 设置环境:创建Python虚拟环境并安装必要的库,包括FastAPIUvicorn(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会自动处理:

  1. 验证传入的JSON数据是否与Item结构匹配。
  2. 如果验证失败,自动返回错误响应。
  3. 如果验证成功,将数据注入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响应,包含预测结果和概率。

生产环境的注意事项

上述示例是一个优秀的起点,但生产部署需要考虑更多因素:

  1. 并发和性能:Uvicorn可以配置工作进程(workers)和线程(threads)以更好地利用多核CPU。
  2. 模型序列化:对于大型模型(如深度学习模型),picklejoblib可能不是最高效的方式。考虑使用如ONNX或特定框架的优化格式。
  3. 输入验证:对于更复杂的数据结构,Pydantic模型可以包含更严格的验证规则,例如范围检查或枚举值。
  4. 依赖管理:使用requirements.txt文件来明确项目的依赖项,方便在生产环境中重现环境。

总而言之,FastAPI提供了一个轻量级、高性能且文档完善的框架,使得将复杂的scikit-learnXGBoost或任何Python模型封装成可扩展的API服务变得异常简单。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区