使用 FastAPI 和 Docker 部署机器学习模型分步指南

Step-by-Step Guide to Deploying Machine Learning Models with FastAPI and Docker

使用 FastAPI 和 Docker 部署机器学习模型分步指南
图片来源:编辑 | Midjourney

您已经训练好了机器学习模型,并且在测试数据上表现出色。但事实是:一个模型放在 Jupyter Notebook 中并不能帮助任何人。只有当您将其部署到生产环境,真正的用户才能从您的工作中受益。

在本文中,我们将使用 scikit-learn 的样本数据集来构建一个糖尿病进展预测器。我们将从原始数据一路构建到一个随时可以部署到云端的容器化 API。

通过跟随本教程进行编码,您将获得:

  • 一个已训练的随机森林模型,可预测糖尿病进展分数
  • 一个使用 FastAPI 构建的 REST API,接受患者数据并返回预测结果
  • 一个已完全容器化、可用于部署的应用程序

让我们开始吧。

🔗 GitHub 上的代码链接

设置您的开发环境

在我们开始编码之前,先准备好您的开发环境。您需要:

  • Python 3.11+(虽然 3.9+ 也可以)
  • 已安装并正在运行的 Docker
  • 对 Python 和 API 的基本了解(我会解释非关键部分)

项目结构

这是我们将如何组织项目目录中的所有内容:

安装依赖项

让我们创建一个干净的虚拟环境:

现在安装所需的库:

构建用于预测糖尿病进展的机器学习模型

让我们从创建机器学习模型开始。创建 train_model.py 文件:

我们选择随机森林是因为它很稳健,能很好地处理不同的特征尺度,并且还能提供特征重要性洞察。

让我们加载并探索我们的糖尿病数据集:

糖尿病数据集包含 442 名患者的记录,具有 10 个生理特征。目标是基线一年后疾病进展的量化度量:数值越高表示进展越严重。

输出

现在我们来准备数据:

80/20 的划分给了我们足够的训练数据,同时也保留了可靠的测试集。使用 `random_state=42` 可以确保结果的可复现性。

输出

是时候训练我们的模型了:

我们将 `max_depth` 设置为 10,以防止在该相对较小的数据集上过拟合。拥有 100 棵树,我们在不过度计算的情况下获得了良好的性能。

让我们评估一下我们的模型:

R² 分数告诉我们模型解释了疾病进展中多大比例的方差。对于这个数据集来说,任何高于 0.4 的分数都算相当不错!

输出

最后,让我们保存训练好的模型:

运行此脚本来训练您的模型:

您应该会看到显示模型性能的输出,并确认已保存模型。

创建 FastAPI 应用程序

现在是激动人心的部分:将我们的模型变成一个 Web API。

如果尚未创建,请创建 `app` 目录和空的 `__init__.py` 文件:

现在创建 `app/main.py` 文件,其中包含我们的 API 代码:

FastAPI 使用 Pydantic 进行请求验证。这意味着它会自动验证传入数据,并在出现问题时提供清晰的错误消息。

让我们定义输入数据结构:

示例值有助于 API 用户理解预期的输入格式。请注意,糖尿病数据集的特征已经过标准化。

接下来,我们初始化 FastAPI 应用并将模型加载到 FastAPI 环境中:

最后,让我们创建预测端点:

解释函数通过为数值预测提供上下文,有助于使我们的 API 更用户友好。

我们还可以添加一个健康检查端点:

本地测试 API

在容器化之前,让我们在本地测试我们的 API。从项目根目录运行以下命令:

在浏览器中打开 `https://:8000/`,您会看到 FastAPI 应用正在运行。尝试使用示例数据进行预测。

您也可以使用 curl 进行测试:

您应该会得到以下结果:

使用 Docker 进行容器化

现在我们将所有内容打包成一个 Docker 容器。首先,创建 requirements.txt 文件:

我们固定了特定的版本,以确保跨环境的一致性。

现在创建 Dockerfile:

slim 镜像使我们的容器保持小巧,而 `--no-cache-dir` 可防止 pip 存储缓存的包,进一步减小了大小。

构建您的 Docker 镜像:

运行容器:

您的 API 现在正在容器中运行!像之前一样进行测试。

发布到 Docker Hub

现在您的容器化 API 在本地运行正常,让我们通过 Docker Hub 与世界分享它。此步骤对于云部署至关重要。大多数云平台可以直接从 Docker Hub 拉取,使部署无缝进行。

设置 Docker Hub

首先,如果您还没有 Docker Hub 账户,则需要一个。

  1. 访问 hub.docker.com 并注册。
  2. 选择一个您喜欢的用户名。它将成为您镜像 URL 的一部分。

登录 Docker Hub

从您的终端登录 Docker Hub:

您将被提示输入 Docker Hub 用户名和密码。请仔细输入。这将创建一个身份验证令牌,允许您推送镜像。

标记您的镜像

在推送之前,我们需要用您的 Docker Hub 用户名标记我们的镜像。Docker 使用特定的命名约定:

将 `your-username` 替换为您的实际 Docker Hub 用户名。`v1.0` 是一个版本标签。版本化您的镜像以便跟踪更改和在需要时回滚是一种良好的做法。

我们还创建一个 `latest` 标签,许多部署平台默认使用它:

检查您的已标记镜像:

您应该会看到三个条目:您的原始镜像和两个新标记的版本。

推送到 Docker Hub

现在让我们将您的镜像推送到 Docker Hub:

第一次推送可能需要几分钟,因为 Docker 会上传所有层。之后的推送应该会快很多。

您可以通过拉取并运行已发布的镜像来验证一切是否正常工作。

再次测试 API,确保一切仍然正常工作。如果正常,您的模型现在已公开可用,并已准备好进行云部署。

总结

恭喜!您刚刚构建了一个完整的机器学习部署管道。

  • 使用医学数据训练了一个强大的随机森林模型
  • 使用 FastAPI 创建了一个可工作的 REST API
  • 使用 Docker 对应用程序进行了容器化

您的模型现在已准备好进行云部署!您可以将其部署到 AWS ECS、Fargate、Google Cloud 或 Azure。

想进一步扩展?您可以考虑添加以下内容:

  • 身份验证和速率限制
  • 模型监控和日志记录
  • 批量预测端点

您现在已掌握将任何机器学习模型部署到生产环境的基础知识。祝您编码愉快!

对 *使用 FastAPI 和 Docker 部署机器学习模型的分步指南* 的一条回复

  1. Temitope 2025 年 6 月 15 日 上午 11:48 #

    令人印象深刻 👏
    谢谢您分享这个

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。