深度学习的环境配置是一件麻烦事。如果在不同电脑或服务器上手动安装这些环境,可能会遇到版本不一致、依赖冲突、CUDA 不兼容等问题。Docker 的作用就是将项目运行所需的系统环境、Python 环境和依赖库统一打包成镜像,使项目可以在不同机器上以相同环境运行。

docker 的基本知识在这篇文章中有所提及:

你可能需要的 Docker 知识-CSDN博客

本文介绍如何在 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
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐