【精选优质专栏推荐】


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

在这里插入图片描述

前言

作为数据科学家,你可能已经掌握了构建机器学习模型的能力,但真正能发挥价值的是模型部署之后的应用。如果你希望深入了解机器学习模型的部署流程,这份指南将为你提供全面指导。

构建和部署机器学习模型的流程通常包括以下几个步骤:构建模型、创建用于提供预测的 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。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐