构建一个docker镜像,将MAE预训练过程的环境打包上传
생성일: 2025년 4월 10일
생성일: 2025년 4월 10일
构建一个docker镜像,将MAE预训练过程的环境打包上传
下面给出一个示例流程,帮助你构建一个包含 MAE 预训练依赖环境的 Docker 镜像,并上传到镜像仓库(如 DockerHub)。假设你已经有一套可运行 MAE 预训练的 Python 环境或依赖清单,以下示例基于 PyTorch 的环境进行演示。你可以根据自身需求或官方代码仓库的要求自行调整。
确认依赖
确保你已经列出了 MAE 预训练所需的所有依赖库/版本号。可以从官方 README 或你现有的 Python 环境中导出依赖列表。例如,你可以将这些依赖写入 requirements.txt
文件。
准备 Dockerfile
建议在一个空文件夹内新建 Dockerfile
文件,后面会具体解释内容。
(可选) DockerHub 账号
如果你想把镜像上传到 DockerHub,需要先在 DockerHub 注册账号,然后在本地执行 docker login
登录。
下面提供一个示例 Dockerfile,主要包含以下内容:
dockerfile# 1. 选择基础镜像:以官方 CUDA 镜像为例,使用 Ubuntu 20.04 + CUDA 11.3 + cuDNN8 FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04 # 2. 设置时区、语言等环境变量(可按需修改) ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Asia/Shanghai # 3. 安装系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends \ wget \ git \ curl \ python3 \ python3-pip \ && rm -rf /var/lib/apt/lists/* # 4. (可选) 建立一个新用户,避免使用 root # RUN useradd -ms /bin/bash maeuser # USER maeuser # WORKDIR /home/maeuser # 5. 设置工作目录 WORKDIR /workspace # 6. (可选) 如果你需要指定特定版本的 pip RUN python3 -m pip install --upgrade pip # 7. 拷贝 requirements.txt 进容器 COPY requirements.txt /workspace/requirements.txt # 8. 安装 Python 依赖(以 pip 方式为例,如果使用 conda,请修改相应命令) RUN pip install -r requirements.txt # 9. (可选) 安装 PyTorch,如果 requirements.txt 里没写,可以在这里指定 # 你需要根据 CUDA 版本选择对应的 PyTorch 版本,比如: # RUN pip install torch==1.13.0+cu113 torchvision==0.14.0+cu113 --extra-index-url https://download.pytorch.org/whl/cu113 # 或者使用不带 +cu113 的通用版本,让 PyTorch 自动选择 RUN pip install torch torchvision # 10. 将本地的 MAE 项目代码拷贝进容器(假设当前目录下有 mae 项目文件夹) COPY . /workspace/mae # 11. 设置默认命令(可选):容器启动时进入 bash CMD ["/bin/bash"]
nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
,它自带 CUDA 11.3 + cuDNN v8 的开发环境。根据你的需求,也可以选择其他版本的 CUDA 或者使用官方的 pytorch/pytorch
镜像做为基底。requirements.txt
来安装可以更清晰地管理依赖。在 requirements.txt
中应包含 MAE 官方要求的依赖(transformers、timm、numpy、scipy 等),如果你想在 Dockerfile 中手动指定 PyTorch、cuda 等版本,也可以直接写在 Dockerfile 里。docker build . -t mae:v1
命令时,这句命令会将本地的当前目录下的所有文件拷贝到容器的 /workspace/mae
目录。如果项目里文件较多,可以只拷贝需要的文件。将上述 Dockerfile 和 requirements.txt
放在同一路径下,进入该路径,然后执行:
bash# 命令最后的 “.” 指的是当前目录 docker build -t mae:v1 .
-t mae:v1
:为镜像指定一个名字(mae
)和标签(v1
)。.
表示 Dockerfile 位于当前路径,并且会将当前路径下的文件打包到 build context 中。Docker 会依照 Dockerfile 步骤一步步执行,直到镜像构建成功。
查看镜像
bashdocker images
看到有 mae:v1
的镜像即说明构建成功。
启动容器
如果要用 GPU:
bashdocker run --gpus all -it mae:v1 /bin/bash
进入容器后,可以执行 python3
、pip list
等检查环境,也可以尝试运行 MAE 的训练脚本。
(可选) 挂载本地目录
如果不想把项目都 COPY 进容器,可以在启动时用 -v
选项挂载本地代码到容器内:
bashdocker run --gpus all -it \ -v /path/to/your/mae_project:/workspace/mae \ mae:v1 /bin/bash
如果你已经在 DockerHub 注册并登录本地 Docker(docker login
),可以将本地镜像推送到你的仓库:
username
,要推送到仓库名 mae
,可以执行:
bashdocker tag mae:v1 username/mae:v1
bashdocker push username/mae:v1
username/mae
下多了一个标签 v1
。这样别人在任何地方只需要执行:
bashdocker pull username/mae:v1
就可以获取你的镜像并直接使用了。
镜像体积大
nvidia/cuda:xx.xx-base-ubuntu20.04
或者 pytorch/pytorch:xx.xx-cudaX.Y-cudnn8-devel
) 并有选择地安装需要的包。使用 conda
continuumio/miniconda3
镜像作为基础镜像,然后在 Dockerfile 中使用 conda create -n mae python=3.9 && conda activate mae
的方式安装依赖。多 GPU/分布式训练
torch.distributed
或者 horovod
),需要在 Dockerfile 中安装对应的库,比如 RUN pip install horovod
,并且在运行容器时做好网络端口映射或使用容器编排工具(K8S、docker-compose 等)。其他容器服务平台
以上便是构建一个带有 MAE 预训练环境的 Docker 镜像并上传到公共仓库的主要步骤示例。根据自己的实际需求和项目依赖,你可以在 Dockerfile 中进行灵活修改。祝你构建顺利,若有更多需求可以继续提问!
ERROR: failed to solve: nvidia/cuda:11.8.1-cudnn8-devel-ubuntu20.04: failed to resolve source metadata for docker.io/nvidia/cuda:11.8.1-cudnn8-devel-ubuntu20.04: unexpected status from HEAD request to https://f661a4f0811747128b2bdfc8fb0027bf.mirror.swr.myhuaweicloud.com/v2/nvidia/cuda/manifests/11.8.1-cudnn8-devel-ubuntu20.04?ns=docker.io: 400 Bad Request
exit status 1
ERROR: failed to solve: nvidia/cuda:11.8.1-cudnn8-devel-ubuntu20.04: failed to resolve source metadata for docker.io/nvidia/cuda:11.8.1-cudnn8-devel-ubuntu20.04: unexpected status from HEAD request to https://f661a4f0811747128b2bdfc8fb0027bf.mirror.swr.myhuaweicloud.com/v2/nvidia/cuda/manifests/11.8.1-cudnn8-devel-ubuntu20.04?ns=docker.io: 400 Bad Request
exit status 1
这个错误提示表明 Docker 在尝试从 docker.io
拉取镜像时出现了问题,具体是连接到 Huawei Cloud 的镜像源时返回了 400 错误(Bad Request)。
可能的原因和解决办法如下:
你遇到的问题似乎是由于连接的镜像源(f661a4f0811747128b2bdfc8fb0027bf.mirror.swr.myhuaweicloud.com
)出现了问题。可以尝试以下几种方法:
解决方案:
docker.io
镜像源。你可以通过修改 Docker 配置文件来切换到官方的镜像源,方法如下:
/etc/docker/daemon.json
文件(在 Linux 系统中):
bashsudo nano /etc/docker/daemon.json
json{ "registry-mirrors": ["https://hub.docker.com"] }
bashsudo systemctl restart docker
Dockerfile
中是否指定了正确的 nvidia/cuda:11.8.1-cudnn8-devel-ubuntu20.04
镜像版本,确保没有拼写错误。如果你使用的是中国大陆的网络,某些外部镜像源可能访问较慢或者不稳定。你可以尝试切换到国内的 Docker 镜像加速器,比如:
https://mirrors.aliyun.com
https://hub-mirror.c.163.com
https://mirror.ccs.tencentyun.com
例如,如果你希望使用阿里云镜像源,你可以在 Docker 配置文件中添加以下内容:
json{ "registry-mirrors": ["https://<your-aliyun-mirror-id>.mirror.aliyuncs.com"] }
如果当前使用的 CUDA 镜像版本(nvidia/cuda:11.8.1-cudnn8-devel-ubuntu20.04
)存在问题,可以考虑使用不同版本的 CUDA 镜像。例如,尝试使用 CUDA 11.3 或 11.4 等版本。
你可以尝试以下修改:
dockerfileFROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
Docker 有时会因为本地镜像缓存的问题导致构建失败。你可以清除 Docker 的缓存并尝试重新构建镜像:
bashdocker builder prune
如果以上方法无法解决问题,请检查 Docker 和网络设置,或者尝试切换网络环境。
怎么在docker配置文件中添加阿里云镜像
在国内环境下使用 Docker 拉取镜像时,配置阿里云镜像加速器可以显著加快镜像下载速度。以下是常规的配置步骤(以 Linux 系统为例):
https://<your-accelerator-id>.mirror.aliyuncs.com
。如果不想登录,也可以直接使用公共加速器(速度和稳定性略逊于专属加速器),地址为:
https://mirror.aliyuncs.com
在多数 Linux 发行版上,Docker 的配置文件路径为 /etc/docker/daemon.json
,如果没有该文件,可以手动新建一个。
bashsudo nano /etc/docker/daemon.json
将下面的内容复制/修改到其中(示例使用专属加速器):
json{ "registry-mirrors": [ "https://<your-accelerator-id>.mirror.aliyuncs.com" ] }
注意:
"insecure-registries"
、"debug"
等),只需要将 "registry-mirrors"
键/值对加入到已有的 JSON 配置中,并保持 JSON 语法正确即可。"https://mirror.aliyuncs.com"
。完成配置后,需要重启 Docker 以使设置生效:
bashsudo systemctl daemon-reload sudo systemctl restart docker
或者根据你的发行版,使用下列命令重启 Docker:
bashsudo service docker restart
重启完成后,可以通过查看 Docker 配置信息来验证是否成功应用镜像加速器:
bashdocker info
在输出信息的末尾,你应该能看到类似以下字段:
textRegistry Mirrors: https://<your-accelerator-id>.mirror.aliyuncs.com/
这就表示你已经配置好了阿里云加速器,后续拉取镜像时会经过此加速器,从而提升下载速度。
怎么在docker配置文件中添加阿里云镜像
在 Docker 中配置阿里云镜像加速器,可以有效提高拉取镜像的速度。以下是如何在 Docker 配置文件中添加阿里云镜像加速器的步骤。
如果你有阿里云账号,可以登录 阿里云容器镜像服务,然后在 "镜像加速器" 页面获取专属加速器地址,形如:
https://<your-accelerator-id>.mirror.aliyuncs.com
如果没有阿里云账号,也可以使用阿里云提供的公共加速器地址:
https://mirror.aliyuncs.com
Docker 配置文件通常位于 /etc/docker/daemon.json
。如果该文件不存在,你可以手动创建它。
bashsudo nano /etc/docker/daemon.json
json{ "registry-mirrors": [ "https://mirror.aliyuncs.com" ] }
如果你有专属加速器地址,替换成你的加速器地址:
json{ "registry-mirrors": [ "https://<your-accelerator-id>.mirror.aliyuncs.com" ] }
registry-mirrors
的值应该是一个数组,即使只有一个镜像源,也要用方括号括起来。"registry-mirrors"
键。保存并退出编辑器。如果是 nano
编辑器,可以使用 Ctrl + O
保存,按 Enter
确认文件名,再按 Ctrl + X
退出编辑器。
修改配置文件后,必须重启 Docker 服务才能生效。使用以下命令重启 Docker:
bashsudo systemctl restart docker
如果你使用的是非 systemd 管理的系统,可以使用以下命令:
bashsudo service docker restart
重启 Docker 后,使用以下命令检查是否成功应用镜像加速器:
bashdocker info
在输出信息中,查看 Registry Mirrors
部分,应该看到你配置的镜像加速器地址,如:
textRegistry Mirrors: https://mirror.aliyuncs.com/
如果你看到了对应的加速器地址,说明配置成功。
这样,你就已经成功将阿里云镜像加速器添加到 Docker 配置文件中了,后续使用 docker pull
拉取镜像时,将会通过这个加速器加速下载速度。
如果我要使用torch.distributed,怎么在Dockerfile中添加相关库
下面给出一套最常见、最省事的做法——在 Dockerfile 里把 torch.distributed
常用的三种通信后端都准备好:
后端 | 什么时候用 | 需要额外装什么 |
---|---|---|
NCCL(GPU → GPU,单机/多机都行,效率最高) | 绝大多数多 GPU 训练 | libnccl2 + libnccl-dev (很多 nvidia/cuda 镜像已经自带运行时库,但保险起见还是 apt 安装一次) |
Gloo(CPU 或单机调试) | CPU-only 或临时调试 | PyTorch 自带,无需额外依赖 |
MPI / OpenMPI(某些 HPC 环境或你想用 mpi4py /mpirun 启动) | 多机训练、超算集群 | openmpi-bin libopenmpi-dev |
dockerfile# ===== 1. 基础镜像,带 CUDA + cuDNN(已经内置 NCCL 运行时)===== FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04 # ===== 2. 系统工具 ===== ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential wget git curl ca-certificates \ # —— OpenMPI(可选,但推荐装上)—— openmpi-bin libopenmpi-dev openssh-client openssh-server \ # —— NCCL 开发包:有时基础镜像只有运行时库,保险起见再装一次 —— libnccl2 libnccl-dev \ && rm -rf /var/lib/apt/lists/* # ===== 3. Python & PyTorch ===== RUN apt-get install -y python3 python3-pip && \ python3 -m pip install --upgrade pip # 直接装官方带 CUDA 11.8 的 PyTorch wheel(已开启 distributed/NCCL) RUN pip install --no-cache-dir \ torch==2.1.0+cu118 torchvision==0.16.0+cu118 torchaudio==2.1.0 \ --extra-index-url https://download.pytorch.org/whl/cu118 # ===== 4. 调优 & 调试常用环境变量(可按需删减)===== ENV OMP_NUM_THREADS=1 \ # NCCL 调试开关 NCCL_DEBUG=INFO \ # 如果多机,需要告诉 NCCL 走哪块网卡(示例 eth0) NCCL_SOCKET_IFNAME=eth0 \ # 避免 /dev/shm 太小导致 NCCL 报错 # (启动容器时再加 --shm-size=1g 效果更好) TORCH_CPP_LOG_LEVEL=INFO # ===== 5. 工作目录 + 复制代码 ===== WORKDIR /workspace COPY . /workspace # ===== 6. 默认启动 ===== CMD ["/bin/bash"]
torchrun
/torch.distributed.launch
默认就用 NCCL,当基础镜像是 nvidia/cuda:*‑devel
时,运行时库已经带了,但最好再装一次 libnccl-dev
,防止 torch.distributed.is_nccl_available()
返回 False undefinedapt install openmpi-bin libopenmpi-dev
就能让 PyTorch 的 mpi
后端可用,也能 mpirun -np ... python train.py
,GitHub 上的示例镜像就是这么干的 undefined/dev/shm
;启动时建议加 --shm-size=1g
或更大,并把 ulimit -l unlimited
(Docker CLI 参数 --ulimit memlock=-1
)一起设好 undefinedbashdocker run --gpus all --network host \ --shm-size 1g --ulimit memlock=-1 \ -v $(pwd):/workspace mae_ddp:latest \ torchrun --nproc_per_node=8 train.py --cfg configs/...
--network host
省去容器端口映射麻烦;单机可直接用。torchrun
会自动把 RANK/LOCAL_RANK
等环境变量注入给每个进程。在 节点 0:
bashexport MASTER_ADDR=$(hostname -I | awk '{print $1}') export MASTER_PORT=23456 docker run --gpus all --network host -e MASTER_ADDR -e MASTER_PORT \ -e RANK=0 -e WORLD_SIZE=2 \ mae_ddp:latest \ torchrun --nnodes=2 --node_rank=$RANK \ --nproc_per_node=8 \ --master_addr=$MASTER_ADDR --master_port=$MASTER_PORT \ train.py ...
在 节点 1:
bashexport MASTER_ADDR=<节点0的IP> export MASTER_PORT=23456 docker run --gpus all --network host -e MASTER_ADDR -e MASTER_PORT \ -e RANK=1 -e WORLD_SIZE=2 \ mae_ddp:latest \ torchrun --nnodes=2 --node_rank=$RANK \ --nproc_per_node=8 \ --master_addr=$MASTER_ADDR --master_port=$MASTER_PORT \ train.py ...
症状 | 可能原因 | 快速排查 |
---|---|---|
is_nccl_available()==False | 镜像里缺 NCCL dev 包或版本不匹配 | 先 `ldconfig -p |
NCCL 超时 / HANG | 端口被防火墙拦、网卡选错、/dev/shm 太小 | ① 先单机跑通;② 设置 NCCL_DEBUG=INFO 看日志;③ --shm-size=1g |
用 openmpi 时报 ptrace 权限 | 需要允许容器 ptrace | docker run --cap-add=SYS_PTRACE ... undefined |
libnccl2 libnccl-dev openmpi-bin libopenmpi-dev
再配上 PyTorch CUDA 版 wheel。NCCL_DEBUG
, NCCL_SOCKET_IFNAME
, 共享内存大小。torchrun
; 多机记得 MASTER_ADDR/PORT + RANK/WORLD_SIZE
。把上面片段复制到你的 Dockerfile 里就能直接使用 torch.distributed
进行多 GPU / 多节点训练了。祝你分布式训练一路顺畅!
RUN apt-get install -y python3 python3-pip
这行命令的功能是让 Docker 在构建镜像时安装 Python 3 以及 Python 包管理工具 pip。它的含义可以分解如下:
apt-get install -y
apt-get install
:使用 Debian/Ubuntu 系统中的软件包管理器 apt-get 来安装软件。-y
:自动确认所有安装提示,不需要手动输入 “yes” 进行确认。python3
python3
包。python3-pip
pip
是 Python 的官方包管理工具,用来安装/更新 Python 库(如 torch
、numpy
等)。python3-pip
会为 Python 3 版本提供对应的 pip 命令(例如 pip3
)。综上,这一条 Dockerfile 指令能够让容器内具备 Python 3 运行环境,并确保 pip
可用,方便后面通过 pip install ...
来安装其他 Python 库。
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
urllib3.exceptions.ReadTimeoutError
错误表示在尝试从 files.pythonhosted.org
下载文件时发生了超时。这通常是由于网络连接不稳定或速度较慢,尤其是在某些地区下载 Python 包时可能会遇到此问题。
这里有几种常见的解决方法,可以帮助你解决这个问题:
如果你在中国大陆,由于网络原因,访问 files.pythonhosted.org
可能会较慢或不稳定。你可以将 pip
源切换到国内镜像(例如阿里云、清华大学、豆瓣等)。例如,使用阿里云镜像源:
bashpip install --index-url https://mirrors.aliyun.com/pypi/simple/ <package_name>
或者,你可以通过修改 pip
配置文件来长期使用国内镜像源:
在安装包时,指定 -i
选项来使用国内镜像源:
bashpip install -i https://mirrors.aliyun.com/pypi/simple/ <package_name>
pip
配置文件找到 pip
配置文件,通常位置为:
~/.pip/pip.conf
%APPDATA%\pip\pip.ini
编辑该文件,添加以下内容:
ini[global] index-url = https://mirrors.aliyun.com/pypi/simple/
然后保存并退出。
如果你依然希望使用默认源,可以增加 pip
的超时时间来防止超时错误。可以通过以下命令来设置更长的超时时间:
bashpip install <package_name> --timeout 120
--timeout
选项将超时时间设置为 120 秒,你可以根据需要调整这个值。
如果超时问题仍然无法解决,你可以手动下载 .whl
文件或源代码包,然后使用 pip
进行本地安装。
pip
安装本地文件:bashpip install /path/to/downloaded/package.whl
有时候,网络不稳定或者防火墙等设置可能导致超时。如果使用 VPN,尝试更换不同的网络连接,或者禁用 VPN 试试看是否能解决问题。
总结起来,首先推荐尝试使用国内镜像源(如阿里云、清华等),其次可以增加超时设置,最后,如果问题仍然存在,手动安装包或检查网络连接也可能有助于解决此问题。
push的时候报错denied: requested access to the resource is denied
当你在执行 docker push
时遇到以下错误:
denied: requested access to the resource is denied
通常表示你没有权限将镜像推送到指定的镜像仓库/命名空间。下面列出常见原因及对应的解决方法:
DockerHub 或私有仓库
然后按提示输入 DockerHub 用户名和密码。如果是私有仓库(例如阿里云、腾讯云等),需要改用它们的登录命令或使用bashdocker login
docker login <registry-url>
命令。登录成功后再试
bashdocker push <username>/<repository>:<tag>
镜像命名格式
当推送到 DockerHub,镜像名称一般需要形如:
bash<DockerHub用户名>/<仓库名>:<tag>
例如,如果你的 DockerHub 用户名是 myusername
,你要推送的镜像仓库名是 myrepo
,标签是 v1
,那么在本地给镜像打标签应是:
bashdocker tag local-image:latest myusername/myrepo:v1
然后再推送:
bashdocker push myusername/myrepo:v1
确认本地镜像标签与 push 命令一致
docker images
或者 docker image ls
查看当前本地镜像的完整名称(包括仓库和标签)。<username>/<repository>:<tag>
和本地镜像名不匹配,Docker 会找不到对应镜像或因命名空间问题报错。拥有该命名空间
denied: requested access to the resource is denied
。私有仓库权限
DockerHub
Create Repository
。<repository>
相同的名字,比如 myrepo
。docker push myusername/myrepo:v1
。其他私有云/镜像仓库
以下是一个最常见的推送流程示例(推送到 DockerHub):
登录 DockerHub
bashdocker login
按提示输入用户名和密码。
查看本地镜像
bashdocker images
假设你想推送的镜像名字叫 local-image
,标签是 latest
。
给镜像重新打标签(如果还没打好)
bashdocker tag local-image:latest myusername/myrepo:v1
推送到 DockerHub
bashdocker push myusername/myrepo:v1
如果一切正常,你会看到镜像分层(layers)被上传的日志。
docker login
<username>/<repository>:<tag>
与 docker tag
命令保持一致。只要上面这些条件都满足,通常就可以顺利完成 docker push
。希望这些信息能帮助你顺利解决 denied: requested access to the resource is denied
错误。