📢 转载信息
原文链接:https://machinelearningmastery.com/the-complete-guide-to-docker-for-machine-learning-engineers/
原文作者:Bala Priya C
在本文中,您将学习如何使用Docker来打包、运行和交付一个完整的机器学习预测服务,涵盖了从训练模型到将其作为API提供服务以及将其分发为容器镜像的工作流程。
我们将涵盖的主题包括:
- 机器学习核心Docker概念(镜像、容器、层、缓存)。
- 训练一个简单的分类器并使用 FastAPI 提供预测服务。
- 编写高效的Dockerfile,在本地运行容器,并推送到Docker Hub。
让我们开始吧。
机器学习工程师的Docker完整指南
图片作者:Author
引言
机器学习模型在不同环境中的表现往往不同。由于版本不匹配、缺少依赖项或系统级差异,一个在您笔记本电脑上可以工作的模型可能会在同事的机器或生产环境中失败。这使得协作和部署变得不必要的复杂。
Docker通过将您的整个机器学习应用程序——模型、代码、依赖项和运行时环境——打包到一个标准化的容器中来解决这些问题,该容器在任何地方都能以相同的方式运行。因此,您可以一次构建,随处运行,而不会出现配置不匹配或依赖冲突。
本文将向您展示如何使用一个简单的示例来容器化机器学习模型。您将了解到:
- 面向机器学习的Docker基础知识
- 构建和部署机器学习模型
- 使用Docker容器化机器学习应用程序
- 编写针对机器学习应用程序优化的Dockerfile
让我们迈出第一步,开始交付真正能在任何地方运行的模型。
先决条件
在学习如何使用Docker容器化机器学习模型之前,请确保您已具备以下条件。
必需的:
- 您的机器上安装了 Python 3.11(或最新版本)。
- 已安装 FastAPI 和所需依赖项(别担心,我们会逐步安装!)。
- 基本的命令行/终端知识。
- 已安装 Docker Desktop(请在此下载)。
- 文本编辑器或IDE。
有帮助但非必需的:
- 对机器学习概念有基本的了解。
- 熟悉 Python 虚拟环境。
- REST API 经验。
检查您的Docker安装情况:
如果这两个命令都能正常工作,那么您已经准备就绪!
面向机器学习工程师的Docker基础知识
在我们构建第一个机器学习容器之前,让我们了解一些基本概念。Docker乍一看可能有些复杂,但一旦您掌握了这些核心思想,一切都会迎刃而解。
什么是Docker,为什么机器学习工程师应该关心?
Docker 是一个平台,它将您的应用程序及其所有依赖项打包到一个称为容器的标准单元中。对于机器学习工程师而言,Docker解决了开发和部署中的几个相关挑战。
机器学习工作流程中一个常见问题是代码由于Python或库版本不匹配而在不同机器上表现不一致。Docker通过封装整个运行时环境来消除这种可变性,确保了在任何地方都能保持一致的行为。
机器学习项目通常依赖于复杂的软件栈,这些栈具有严格的版本要求,例如与特定 CUDA 版本绑定的 TensorFlow,或者与某些 NumPy 版本冲突的 PyTorch。Docker容器可以干净地隔离这些依赖项,防止版本冲突并简化设置。
可复现性是机器学习研究和生产的基础。通过将代码、库和系统依赖项打包到单个镜像中,Docker可以精确地重现实验和结果。
模型部署通常涉及跨不同机器或云平台重新配置环境。使用Docker,一次构建的环境可以在任何地方运行,从而最大限度地减少设置时间和部署风险。
Docker 镜像 vs 容器
这是最需要理解的概念。许多初学者混淆了镜像和容器,但它们有着根本的不同。
Docker 镜像就像一个蓝图或食谱。它是一个只读模板,包含:
- 操作系统(通常是轻量级Linux发行版)。
- 您的应用程序代码。
- 所有依赖项和库。
- 配置文件。
- 运行应用程序的指令。
您可以将其视为编程中的类定义。它定义了细节,但本身不会执行任何操作。
Docker 容器是镜像的运行实例。它就像从一个类实例化出来的对象。您可以从同一个镜像创建多个容器,就像您可以从同一个类创建多个对象一样。
这是一个示例:
我们还没有介绍Docker命令。但目前,您只需知道可以使用 docker build 命令构建一个镜像,并使用 docker run 命令从镜像启动容器。您创建了一个镜像,但启动了三个独立的运行中容器。每个容器都从相同的镜像启动,并具有自己独立的内存和进程。
Dockerfile
Dockerfile是您编写构建镜像指令的地方。它是一个纯文本文件(字面上就是名为 Dockerfile 且没有扩展名),Docker从上到下读取它。
Docker以层的方式构建镜像。Dockerfile中的每条指令都会在您的镜像中创建一个新层。Docker 会缓存这些层,如果没有任何更改,这使得重新构建更快。
使用卷持久化数据
容器是易失性的。也就是说,当您删除一个容器时,其中所有内容都会消失。这对需要保存训练日志、模型检查点和实验结果的机器学习工程师来说是个问题。
卷通过将主机机器的目录挂载到容器中来解决这个问题:
现在写入/path/in/container的文件实际上位于主机上的/path/on/host。即使您删除了容器,这些文件也会保留下来。
对于机器学习工作流程,您可能会挂载:
这样,您的训练好的模型、数据集和日志就会保存在容器外部。
网络和端口映射
当您运行一个容器时,它拥有自己的网络命名空间。要访问容器内部运行的服务,您需要映射端口:
这将把您机器上的8000端口映射到容器内的8000端口。格式是 host_port:container_port。
对于机器学习API,这使您能够同时运行多个模型版本:
为什么选择Docker而不是虚拟环境?
您可能会问:“为什么不只使用venv或conda呢?” 这是Docker优于虚拟环境的原因:
虚拟环境只隔离 Python 包。它们不隔离系统库(如 CUDA 驱动程序)、操作系统差异(Windows vs Linux)或系统级依赖项(如 libgomp、libgfortran)。
Docker隔离了一切。您的容器在MacBook、队友的Windows PC以及云端的Linux服务器上运行方式相同。此外,与使用虚拟环境相比,Docker使同时运行不同Python版本变得轻而易举。
使用Docker容器化机器学习应用程序
既然我们了解了Docker基础知识,让我们来构建一些实用的东西。我们将使用 scikit-learn 的葡萄酒数据集 创建一个葡萄酒质量预测模型,并将其部署为生产就绪的API。我们将涵盖以下内容:
- 构建和训练一个随机森林分类器。
- 创建一个FastAPI应用程序来提供预测。
- 编写一个高效的Dockerfile。
- 在本地构建和运行容器。
- 测试API端点。
- 将镜像推送到Docker Hub以供分发。
让我们开始吧!
第 1 步:设置项目
首先,创建一个具有以下推荐结构的项目的目录:
接下来,创建一个虚拟环境并激活它:
然后安装所需的包:
第 2 步:构建机器学习模型
首先,我们需要创建机器学习模型。我们将使用内置于scikit-learn中的葡萄酒数据集。
创建一个名为 train_model.py 的文件:
这段代码的作用是:我们加载包含13种葡萄酒化学特征的葡萄酒数据集。在将数据拆分为训练集和测试集后,我们使用StandardScaler缩放特征。我们训练一个随机森林分类器,并保存模型和缩放器。为什么要保存缩放器?因为当我们稍后进行预测时,我们需要用与训练数据缩放完全相同的方式来缩放新数据。
运行此脚本以训练并保存您的模型:
您应该会看到显示模型准确率的输出,以及文件已保存的确认信息。
第 3 步:创建 FastAPI 应用程序
现在让我们使用 FastAPI 创建一个API,它加载我们训练好的模型并提供预测服务。
创建一个名为 app.py 的文件:
评论区