机器学习模型部署实用指南
【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。
文章目录

前言
作为数据科学家,你可能已经掌握了构建机器学习模型的能力,但真正能发挥价值的是模型部署之后的应用。如果你希望深入了解机器学习模型的部署流程,这份指南将为你提供全面指导。
构建和部署机器学习模型的流程通常包括以下几个步骤:构建模型、创建用于提供预测的 API、将 API 容器化,以及部署到云端。
本指南将重点涵盖以下内容:
- 使用 Scikit-learn 构建机器学习模型
- 使用 FastAPI 创建 REST API 来提供模型预测
- 使用 Docker 对 API 进行容器化

我们将使用加州房价数据集构建一个简单的回归模型来预测房价。最终,你将得到一个容器化应用,可以根据选定的输入特征提供房价预测。
项目环境设置
在开始之前,请确保已安装以下软件:
-
最新版本的 Python(推荐 Python 3.11 或更高)
-
用于容器化的 Docker;请根据操作系统下载并安装 Docker
为了更顺利地跟随本教程,建议具备基本的机器学习模型构建和 API 使用经验。
推荐的项目目录结构如下:
project-dir/
│
├── app/
│ ├── __init__.py # 空文件
│ └── main.py # 提供预测 API 的 FastAPI 代码
│
├── model/
│ └── linear_regression_model.pkl # 已保存的训练模型(运行 model_training.py 后生成)
│
├── model_training.py # 训练并保存模型的脚本
├── requirements.txt # 项目依赖
└── Dockerfile # Docker 配置
我们需要安装一些 Python 库。
首先,在项目环境中创建并激活虚拟环境:
$ python3 -m venv v1
$ source v1/bin/activate
对于本项目,需要 pandas 和 scikit-learn 来构建机器学习模型,以及 FastAPI 和 Uvicorn 来创建用于提供模型预测的 API。
使用 pip 安装所需的依赖包:
$ pip3 install pandas scikit-learn fastapi uvicorn
你可以在 GitHub 上获取本教程的完整代码。
构建机器学习模型
接下来,我们将使用 scikit-learn 内置的加州房价数据集训练一个线性回归模型。该模型将根据选择的特征预测房价。
在项目目录下创建名为 model_training.py 的文件:
# model_training.py
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pickle
import os
# 加载数据集
data = fetch_california_housing(as_frame=True)
df = data['data']
target = data['target']
# 选择部分特征
selected_features = ['MedInc', 'AveRooms', 'AveOccup']
X = df[selected_features]
y = target
# 训练集和测试集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 创建 'model' 文件夹以保存训练模型
os.makedirs('model', exist_ok=True)
# 使用 pickle 保存训练好的模型
with open('model/linear_regression_model.pkl', 'wb') as f:
pickle.dump(model, f)
print("Model trained and saved successfully.")
该脚本完成以下操作:
-
加载加州房价数据集
-
选择三个特征(MedInc、AveRooms、AveOccup)
-
训练线性回归模型
将训练好的模型保存到 model/ 文件夹中,文件名为 linear_regression_model.pkl
注意:为了简化示例,这里仅使用了少量特征,你也可以尝试增加更多特征。
运行脚本训练模型并保存:
$ python3 model_training.py
执行完成后,你将看到如下提示,并可在 model/ 目录下找到 .pkl 文件:
Model trained and saved successfully.
创建 FastAPI 应用
接下来,我们将使用 FastAPI 创建一个提供预测的 API。
在 app/ 文件夹中创建两个文件:__init__.py(空文件)和 main.py。这样做便于后续使用 Docker 对 FastAPI 应用进行容器化。
在 main.py 中编写如下代码:
# app/main.py
from fastapi import FastAPI
from pydantic import BaseModel
import pickle
import os
# 使用 Pydantic 定义输入数据的模式
class InputData(BaseModel):
MedInc: float
AveRooms: float
AveOccup: float
# 初始化 FastAPI 应用
app = FastAPI(title="House Price Prediction API")
# 在启动时加载模型
model_path = os.path.join("model", "linear_regression_model.pkl")
with open(model_path, 'rb') as f:
model = pickle.load(f)
@app.post("/predict")
def predict(data: InputData):
# 准备预测数据
input_features = [[data.MedInc, data.AveRooms, data.AveOccup]]
# 使用加载的模型进行预测
prediction = model.predict(input_features)
# 返回预测结果
return {"predicted_house_price": prediction[0]}
该 FastAPI 应用提供 /predict 接口,接收三个特征(MedInc、AveRooms、AveOccup),使用训练好的模型进行房价预测,并返回预测结果。
使用 Docker 容器化应用
现在,将 FastAPI 应用容器化。在项目根目录下创建 Dockerfile 和 requirements.txt 文件。
创建 Dockerfile
Dockerfile 内容如下:
# 使用 Python 3.11 作为基础镜像
FROM python:3.11-slim
# 设置容器内工作目录
WORKDIR /code
# 复制依赖文件
COPY ./requirements.txt /code/requirements.txt
# 安装 Python 依赖
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# 复制 app 文件夹到容器中
COPY ./app /code/app
# 复制模型文件夹(包含训练好的模型)到容器中
COPY ./model /code/model
# 暴露 FastAPI 所用端口 80
EXPOSE 80
# 使用 Uvicorn 启动 FastAPI 应用
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
说明:
1.使用轻量级 Python 3.11 slim 镜像
2.设置工作目录为 /code
3.复制 requirements.txt 并安装依赖(无缓存)
4.将 FastAPI 应用和模型文件复制到容器中
5.暴露端口 80,使应用可访问
6.使用 Uvicorn 启动 FastAPI 应用
该配置可高效地在容器化环境中部署 FastAPI 应用。
创建 requirements.txt 文件
在项目根目录下创建 requirements.txt 文件,列出所有依赖:
fastapi
uvicorn
scikit-learn
pandas
构建 Docker 镜像
在准备好 Dockerfile、requirements.txt 和 FastAPI 应用之后,即可构建 Docker 镜像并运行容器。

在项目根目录下运行以下命令构建 Docker 镜像:
$ docker build -t house-price-prediction-api .
构建完成后,运行容器:
$ docker run -d -p 80:80 house-price-prediction-api
此时,API 应该已在 http://127.0.0.1:80 上运行。
你可以使用 curl 或 Postman 测试 /predict 接口,发送 POST 请求。例如:
curl -X 'POST' \
'http://127.0.0.1:80/predict' \
-H 'Content-Type: application/json' \
-d '{
"MedInc": 3.5,
"AveRooms": 5.0,
"AveOccup": 2.0
}'
返回结果示例:
{
"predicted_house_price": 2.3248705765077062
}
为 Docker 镜像打标签并推送到 Docker Hub
构建并测试镜像后,你可以将其推送到 Docker Hub,以便共享或在云平台上部署。
1.登录 Docker Hub:
$ docker login
系统会提示输入 Docker Hub 的账号和密码。
2.为 Docker 镜像打标签:
$ docker tag house-price-prediction-api your_username/house-price-prediction-api:v1
将 your_username 替换为你的 Docker Hub 用户名。
提示:为模型文件添加版本号是个好习惯。更新模型后,可使用新标签重建镜像,并推送到 Docker Hub。
3.推送镜像到 Docker Hub:
$ docker push your_username/house-price-prediction-api:v1
其他开发者可以通过以下命令拉取并运行镜像:
$ docker pull your_username/house-price-prediction-api:v1
$ docker run -d -p 80:80 your_username/house-price-prediction-api:v1
任何拥有访问权限的人都可以拉取并运行该容器。
总结
本教程涵盖了以下内容:
-
使用 scikit-learn 训练机器学习模型
-
构建 FastAPI 应用以提供预测服务
-
使用 Docker 对应用进行容器化
此外,我们还介绍了如何将 Docker 镜像推送到 Docker Hub,以便更方便地分发和部署。
下一步,你可以将这个容器化应用部署到云端,例如使用 AWS ECS、GCP 或 Azure,在生产环境中运行该 API。
更多推荐


所有评论(0)