机器学习模型部署指南:使用Flask与Docker实现REST API服务

机器学习模型部署指南:使用Flask与Docker实现REST API服务

在机器学习项目的完整生命周期中,模型训练固然重要,但将训练好的模型部署为可供其他系统调用的服务,才是其产生实际价值的关键一步。本文将详细介绍如何使用轻量级Web框架Flask和容器化技术Docker,将机器学习模型封装为高可用、易扩展的REST API服务。

一、 项目准备与模型序列化

在部署之前,我们首先需要一个训练好的模型。假设我们已经使用Scikit-learn训练了一个简单的鸢尾花分类模型,并将其保存为文件 iris_model.pkl

# save_model.py
import pickle
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# 加载数据并训练一个简单模型
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)
model = RandomForestClassifier()
model.fit(X_train, y_train)

# 将模型序列化保存
with open('iris_model.pkl', 'wb') as f:
    pickle.dump(model, f)
print("模型已保存为 iris_model.pkl")

提示:在复杂的生产环境中,模型特征工程和数据预处理逻辑也需要一并保存和部署。你可以使用 dblens SQL编辑器 来管理和查询模型训练过程中产生的元数据和日志,其强大的数据查询与可视化能力能帮助你更好地追踪模型版本和性能指标。

二、 使用Flask构建REST API

Flask是一个用Python编写的微型Web框架,非常适合快速构建API。我们将创建一个简单的应用,提供预测接口。

首先,安装必要的依赖:

pip install flask scikit-learn

接着,创建我们的API主文件 app.py

# app.py
from flask import Flask, request, jsonify
import pickle
import numpy as np

app = Flask(__name__)

# 在服务启动时加载模型
MODEL_PATH = 'iris_model.pkl'
with open(MODEL_PATH, 'rb') as f:
    model = pickle.load(f)

# 定义特征列名(仅用于文档说明)
FEATURE_NAMES = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']

@app.route('/')
def home():
    return jsonify({'message': '鸢尾花分类模型API服务已启动', 'status': 'healthy'})

@app.route('/predict', methods=['POST'])
def predict():
    """
    预测接口
    期望的JSON输入格式:
    {
        "features": [5.1, 3.5, 1.4, 0.2]
    }
    """
    data = request.get_json()
    
    # 简单的输入验证
    if not data or 'features' not in data:
        return jsonify({'error': '请求中未包含 features 字段'}), 400
    
    features = data['features']
    try:
        features_array = np.array(features).reshape(1, -1)
    except Exception as e:
        return jsonify({'error': f'特征格式错误: {str(e)}'}), 400
    
    # 进行预测
    prediction = model.predict(features_array)
    probability = model.predict_proba(features_array).tolist()
    
    # 返回结果
    return jsonify({
        'predicted_class': int(prediction[0]),
        'class_probabilities': probability[0],
        'input_features': features
    })

if __name__ == '__main__':
    # 在生产环境中应使用WSGI服务器(如Gunicorn)
    app.run(host='0.0.0.0', port=5000, debug=False)

现在,你可以通过运行 python app.py 启动服务,并使用curl或Postman测试API:

curl -X POST http://localhost:5000/predict \
     -H "Content-Type: application/json" \
     -d '{"features": [5.1, 3.5, 1.4, 0.2]}'

三、 使用Docker进行容器化部署

为了确保服务在任何环境(开发、测试、生产)中都能一致运行,我们使用Docker进行容器化。

1. 创建Dockerfile

在项目根目录创建 Dockerfile

# 使用官方Python轻量级镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 声明服务端口
EXPOSE 5000

# 定义容器启动命令
CMD ["python", "app.py"]

2. 创建requirements.txt

flask==2.3.3
scikit-learn==1.3.0
numpy==1.24.3

3. 构建并运行Docker镜像

在包含Dockerfile的目录下执行:

# 构建镜像
docker build -t iris-model-api .

# 运行容器,将宿主机的5000端口映射到容器的5000端口
docker run -p 5000:5000 iris-model-api

现在,你的API服务已经在Docker容器中运行,实现了环境隔离和依赖固化。

四、 进阶优化与生产化考虑

1. 使用Gunicorn作为WSGI服务器

Flask自带的开发服务器不适合生产环境。我们可以使用Gunicorn。修改Dockerfile的CMD指令:

CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app", "-w", "4"]

2. 添加健康检查与监控

可以在Flask应用中添加一个 /health 端点,用于Kubernetes等编排工具的健康检查。

3. 日志记录

确保应用日志被正确输出到标准输出/错误,便于Docker收集。

提示:在部署和维护多个微服务时,API的调用日志、性能指标和错误信息会大量产生。使用 QueryNote 这样的云端笔记与查询工具,可以方便地记录和分享不同服务版本的部署配置、遇到的问题及解决方案,实现团队知识的高效沉淀。其与 dblens SQL编辑器 的联动,更能让你快速查询和分析日志数据库,定位服务瓶颈。

五、 总结

通过本文的步骤,我们完成了一个机器学习模型从本地文件到可远程调用的REST API服务的完整部署流程:

  1. 模型序列化:将训练好的模型保存为文件。
  2. API封装:使用Flask框架构建接收请求、调用模型并返回预测结果的Web服务。
  3. 容器化:通过Docker将应用及其所有依赖打包成镜像,实现环境一致性和便捷部署。

这种 Flask + Docker 的组合方案具有轻量、灵活、易于理解和实施的优点,非常适合中小型项目或作为复杂机器学习平台的单个服务组件。它打通了模型从“实验室”到“生产环境”的最后一公里,让算法能力能够真正融入业务系统,驱动决策。

当然,对于超大规模、高并发的生产场景,可能需要考虑更专业的模型服务框架(如TensorFlow Serving, TorchServe)、API网关、服务网格和完整的Kubernetes编排。但本文介绍的核心思想——将模型包装为标准化接口并进行容器化部署——仍然是所有高级方案的基础。

posted on 2026-02-02 23:23  DBLens数据库开发工具  阅读(65)  评论(0)    收藏  举报