📢 转载信息
原文链接:https://machinelearningmastery.com/the-complete-guide-to-docker-for-machine-learning-engineers/
原文作者:Jason Brownlee
Docker是用于构建、发布和运行应用程序的开源工具。它能将应用程序及其所有依赖项打包到一个名为容器的便携式单元中。容器是独立的、可执行的软件单元,其中包含运行特定应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
对于机器学习工程师而言,Docker在解决环境依赖和可复现性问题方面特别有用。本指南旨在为机器学习工程师提供一个全面的Docker使用教程。
Docker的起源和基本概念
Docker项目始于2013年,旨在简化应用程序的打包和部署过程。它基于Linux容器技术(cgroups和namespaces),提供了一种更轻量级、更快速的替代传统虚拟机(VMs)的部署方式。
镜像(Images)
Docker镜像是一个只读模板,用于创建容器。它包含运行应用程序所需的所有代码、库、依赖项和配置。镜像可以通过分层结构构建,这意味着可以重复使用现有镜像的基础层,从而实现快速构建和高效存储。
容器(Containers)
容器是镜像的运行实例。当启动一个镜像时,Docker会在其上添加一个可写层,使您能够在运行时修改文件系统。容器是隔离的,这意味着容器中的进程与其他主机进程以及其他容器是隔离的。
仓库(Registries)
Docker仓库是存储和分发Docker镜像的地方。Docker Hub是最大的公共仓库,但您也可以设置私有仓库,如AWS ECR、Google Artifact Registry等。
Dockerfile
Dockerfile是一个文本文件,包含一系列指令,用于自动构建Docker镜像。它定义了镜像的构建步骤,包括基础镜像选择、文件复制、依赖安装和启动命令等。
为什么机器学习工程师需要Docker?
机器学习项目通常依赖于特定的软件版本和库,这使得在不同环境中复现实验结果变得困难。Docker通过以下方式解决了这些挑战:
- 可复现性: 确保模型在任何地方都能以相同的方式运行,因为所有依赖项都已打包在容器中。
- 环境隔离: 不同的项目可以使用不同的Python版本或TensorFlow/PyTorch版本,而不会相互干扰。
- 便捷的部署: 容器化的模型可以轻松地从开发环境迁移到测试和生产环境。
- 简化依赖管理: 无需在主机系统上安装大量的库和特定版本的依赖项。
Docker安装和基础命令
安装Docker是使用它的第一步。您需要安装Docker Desktop(适用于Windows和macOS)或Docker Engine(适用于Linux)。
安装Docker
请访问 Docker官方网站 下载并安装适合您操作系统的版本。
基础命令
以下是一些最常用的Docker命令:
# 拉取一个基础镜像(例如Ubuntu)
docker pull ubuntu:latest
# 运行一个容器
docker run -it ubuntu:latest /bin/bash
# 列出本地镜像
docker images
# 列出运行中的容器
docker ps
# 停止并移除一个容器
docker stop <container_id>
docker rm <container_id>
在上面的docker run命令中:
-it:分配一个伪终端(interactive)并保持连接(tty)。ubuntu:latest:指定要使用的镜像。/bin/bash:在容器内执行的命令。
构建自定义Docker镜像
构建镜像的核心是Dockerfile。一个典型的Dockerfile从一个基础镜像开始,然后逐步添加内容。
示例:构建一个Python环境镜像
假设您有一个Python项目,需要TensorFlow和Pandas库。您的项目文件结构如下:
.
├── Dockerfile
├── requirements.txt
└── train.py
requirements.txt 文件内容:
tensorflow==2.10.0
pandas==1.5.3
numpy==1.23.5
Dockerfile 内容:
# 1. 指定基础镜像
FROM python:3.9-slim
# 2. 设置工作目录
WORKDIR /app
# 3. 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. 复制应用程序代码
COPY .
# 5. 定义容器启动时运行的默认命令
CMD ["python", "train.py"]
构建镜像
在包含Dockerfile的目录下执行以下命令:
docker build -t ml-trainer:v1 .
这里,-t参数用于给镜像打上标签(tag),格式为名称:标签。
运行容器
构建完成后,您可以运行一个容器来执行您的训练脚本:
docker run ml-trainer:v1
如果您希望将本地数据(例如数据集)挂载到容器中,可以使用-v参数:
docker run -v /path/to/local/data:/app/data ml-trainer:v1
将镜像推送到仓库
为了在其他机器上使用您的镜像,您需要将其推送到Docker仓库(如Docker Hub)。
- 登录仓库:
docker login - 给镜像重新标记(Tag): 如果推送到Docker Hub,标签需要包含您的用户名。
docker tag ml-trainer:v1 your_dockerhub_username/ml-trainer:v1 - 推送镜像:
docker push your_dockerhub_username/ml-trainer:v1
Dockerfile的最佳实践
遵循最佳实践可以使您的镜像更小、更安全、构建更快:
- 使用更小的基础镜像: 优先选择
alpine或slim版本(如python:3.9-slim)而不是完整的发行版。 - 利用缓存: 尽量将变化不频繁的指令放在前面(如基础镜像、安装系统包),变化频繁的指令放在后面(如复制代码)。
- 合并RUN指令: 尽可能将多个
RUN指令合并为一个,以减少最终镜像的层数。例如,将apt-get update和apt-get install合并。 - 清理缓存: 在安装包后立即清理缓存(如
pip cache purge或rm -rf /var/lib/apt/lists/*),以减小镜像大小。 - 使用
COPY而非ADD: 除非需要解压或拉取远程URL,否则COPY更清晰、更可预测。
使用Docker Compose
对于包含多个服务(如模型API、数据库、缓存服务)的复杂项目,Docker Compose非常有用。它使用一个YAML文件来定义和运行多容器Docker应用程序。
示例:定义一个服务
docker-compose.yml 文件示例:
version: '3.8'
services:
trainer:
build: .
image: ml-trainer:latest
volumes:
- ./data:/app/data
command: python train.py
使用docker compose up即可启动并管理定义的所有服务。
总结
Docker为机器学习工程师提供了一个强大的工具集,用于解决环境依赖和部署的可复现性问题。从理解镜像和容器的基础知识,到编写高效的Dockerfile,再到使用Docker Compose管理复杂的工作流,掌握这些技能是构建健壮、可扩展的机器学习系统的关键。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区