深度学习项目 Docker 镜像制作与使用
如果在不同电脑或服务器上手动安装这些环境,可能会遇到版本不一致、依赖冲突、CUDA 不兼容等问题。的作用就是将项目运行所需的系统环境、Python 环境和依赖库统一打包成镜像,使项目可以在不同机器上以相同环境运行。
深度学习的环境配置是一件麻烦事。如果在不同电脑或服务器上手动安装这些环境,可能会遇到版本不一致、依赖冲突、CUDA 不兼容等问题。Docker 的作用就是将项目运行所需的系统环境、Python 环境和依赖库统一打包成镜像,使项目可以在不同机器上以相同环境运行。
docker 的基本知识在这篇文章中有所提及:
本文介绍如何在 Windows 的 WSL 环境中,将一个深度学习项目制作成 Docker 镜像,并将镜像上传到 Docker Hub,以及其他用户如何下载并直接使用该镜像。
一、项目准备
Transformer 模型原理与实现_transformer实现-CSDN博客
以此 Transformer 深度学习项目为例,项目环境要求如下:
Python = 3.10
PyTorch = 1.12.1
CUDA = 11.3
tqdm = 4.67.1
sentencepiece = 0.2.1
sacrebleu = 2.5.1
numpy = 1.23.3
matplotlib = 3.10.8
项目结构如下:
transformer/
│
├── data/ # 数据文件
│ └── json/
│
├── tokenizer/ # SentencePiece 分词模型
│
├── results/ # 训练结果与曲线
│
├── transformer_model.py # 模型结构定义
├── beam_decoder.py # Beam Search 解码
├── train.py # 训练入口
├── translate.py # 推理入口
├── data_loader.py # 数据加载与 mask 构造
├── utils.py # 工具函数
├── config.py # 参数配置
├── requirements.txt # Python 依赖文件
1.1 准备 requirements.txt
由于项目要求使用 CUDA 11.3 版本的 PyTorch,因此 requirements.txt 中不应简单写作 torch==1.12.1,而应使用 CUDA 11.3 对应的 PyTorch wheel。
requirements.txt 内容如下:
--extra-index-url https://download.pytorch.org/whl/cu113
torch==1.12.1+cu113
tqdm==4.67.1
sentencepiece==0.2.1
sacrebleu==2.5.1
numpy==1.23.3
matplotlib==3.10.8
其中 torch==1.12.1+cu113 表示安装支持 CUDA 11.3 的 PyTorch 1.12.1
1.2 Dockerfile
在项目根目录 transformer/ 下新建 Dockerfile,内容如下:
FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04
# 这个 Docker 镜像从 NVIDIA 官方 CUDA 镜像开始构建
ENV DEBIAN_FRONTEND=noninteractive # 安装软件时不要弹出交互式询问
ENV PYTHONUNBUFFERED=1 # Python 的输出不要缓存,直接打印到终端
ENV PIP_NO_CACHE_DIR=1 # pip 安装 Python 包时不要保留缓存文件
WORKDIR /workspace # 设置当前工作目录
# 安装基础工具
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
git \
ca-certificates \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 更新 Ubuntu 软件源,安装 wget、git、证书和编译工具,然后清理缓存,减小镜像体积。
# 安装 Miniconda,用于固定 Python 3.10
RUN wget -q https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-x86_64.sh -O /tmp/miniconda.sh && \
bash /tmp/miniconda.sh -b -p /opt/conda && \
rm /tmp/miniconda.sh
ENV PATH=/opt/conda/bin:$PATH
# 把 Conda 的命令目录加入系统环境变量 PATH
# 安装指定 Python 版本
RUN conda install -y python=3.10 pip && \
conda clean -afy
# 先复制依赖文件,安装 Python 依赖
COPY requirements.txt /workspace/requirements.txt
RUN python -m pip install --upgrade pip && \
pip install -r /workspace/requirements.txt
# 复制整个项目到镜像中
COPY . /workspace
# 默认进入 bash
CMD ["bash"]
1.3 .dockerignore
为了避免将缓存文件、训练结果、大模型权重等内容复制进镜像,在项目根目录下新建 .dockerignore 文件:
__pycache__/
*.pyc
.git/
.vscode/
.idea/
results/
*.pth
*.pt
*.ckpt
1.4 环境测试脚本 test_env.py
在项目根目录下新建 test_env.py:
import torch
import numpy as np
import tqdm
import sentencepiece
import sacrebleu
import matplotlib
print("===== Environment Check =====")
print("torch:", torch.__version__)
print("torch cuda:", torch.version.cuda)
print("cuda available:", torch.cuda.is_available())
if torch.cuda.is_available():
print("gpu name:", torch.cuda.get_device_name(0))
print("numpy:", np.__version__)
print("tqdm:", tqdm.__version__)
print("sentencepiece:", sentencepiece.__version__)
print("sacrebleu:", sacrebleu.__version__)
print("matplotlib:", matplotlib.__version__)
用于检查 PyTorch、CUDA、NumPy 等依赖是否正确安装
二、构建 Docker 镜像
首先打开 Windows 上的 Docker Desktop,打开 WSL Ubuntu 终端,进入项目所在文件夹,执行:
docker --version
输出 Docker 版本号,继续执行:
docker ps
正常显示容器列表表头,说明 WSL 已经可以正常连接 Docker

在 Dockerfile 所在的项目根目录下执行:
docker build -t transformer-cu113 .
该命令含义为:
docker build 构建 Docker 镜像
-t transformer-cu113 给镜像命名为 transformer-cu113
. 使用当前目录作为构建上下文
构建过程中,Docker 依次执行 Dockerfile 中的命令

构建完成后,执行:
docker images
看到输出:
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
transformer-cu113:latest b4d0d7f1e3c3 12.6GB 4.31GB

说明本地已经生成了一个名为 transformer-cu113 的 Docker 镜像,Docker 镜像不是一个普通文件,不会出现在项目文件夹中。它保存在 Docker 的本地镜像库中,可以通过 docker images 查看。
三、测试并运行镜像
3.1 镜像测试
运行以下命令进入容器内部:
docker run --rm -it --gpus all transformer-cu113 bash
这条命令的意思是:启动 transformer-cu113 镜像对应的容器,给它使用 GPU 的权限,然后进入容器内部的 bash 终端。
运行环境测试:
python test_env.py
输出:
torch: 1.12.1+cu113
torch cuda: 11.3
cuda available: True

说明 PyTorch 和 CUDA 环境配置正确,容器可以使用 GPU
3.2 运行训练代码
使用目录挂载方式运行训练,这样训练结果会保存到宿主机项目目录中,而不是保存在临时容器内部。
在 WSL 项目目录下执行:
docker run --rm -it --gpus all \
-v "$(pwd)":/workspace \
-w /workspace \
transformer-cu113 \
python train.py
命令说明:
--rm 容器运行结束后自动删除临时容器。
-it 使用交互模式运行,方便查看训练输出。
--gpus all 允许容器使用宿主机的所有 NVIDIA GPU。
-v "$(pwd)":/workspace 将当前 WSL 项目目录挂载到容器中的 /workspace。
-w /workspace 设置容器的工作目录为 /workspace。
transformer-cu113 使用前面构建好的 Docker 镜像。
python train.py 执行训练入口文件。
训练完成后,结果会保存在项目目录中的 results/ 文件夹中
3.3 运行推理代码
推理入口为 translate.py,可以执行:
docker run --rm -it --gpus all \
-v "$(pwd)":/workspace \
-w /workspace \
transformer-cu113 \
python translate.py
四、Docker Hub
4.1 上传
在 WSL 终端中执行:
docker login
根据提示输入 Docker Hub 用户名和密码,或使用访问令牌登录。
上传之前,需要把镜像重新打 tag,加上自己的 Docker Hub 用户名,将本地镜像 transformer-cu113 标记为 Docker Hub 格式:
docker tag transformer-cu113 yourname/transformer-cu113:latest
推送 latest 标签:
docker push yourname/transformer-cu113:latest

推送完成后,Docker Hub 上就会出现该镜像。其他用户可以通过 docker pull 下载使用。

4.2 下载
假设镜像已经上传到 Docker Hub,名称为:
yourname/transformer-cu113
其他用户可以执行:
docker pull yourname/transformer-cu113
下载完成后,同样可进入项目目录运行训练:
docker run --rm -it --gpus all \
-v "$(pwd)":/workspace \
-w /workspace \
yourname/transformer-cu113 \
python train.py
运行推理:
docker run --rm -it --gpus all \
-v "$(pwd)":/workspace \
-w /workspace \
yourname/transformer-cu113 \
python translate.py
如果只是想进入容器环境:
docker run --rm -it --gpus all yourname/transformer-cu113 bash
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)