主页
avatar

Kared

Docker 配置深度学习炼丹炉(初级)

1、拉取并创建容器

首先,我们需要创建基于 ubuntu:22.04 镜像的 Docker 容器用作炼丹炉的搭建。在创建容器的过程中,若本地不存在指定的镜像,Docker 会自动执行拉取操作,省去了手动使用 docker pull ubuntu:22.04 命令来拉取镜像的步骤。以下是创建容器的命令及其参数说明:

docker run -itd \
    --gpus all \
    --shm-size 16g \
    --name container_name \
    -v /home/workspace:/workspace \
    ubuntu:22.04 /bin/bash
  • -itd: -i (--interactive) 保持输入开放,-t 为容器分配一个伪终端,-d (--detach) 表示运行容器并让它在后台运行。
  • --gpus all: 将主机上所有的 GPU 分配给容器。也可以设置为 --gpus "device=0,2" 指定特定 GPU 分配给 Docker 容器。
  • --shm-size 16g: 设置共享内存的大小,此例中设置为 16 GB,这对于需要大量内存的计算任务很有用。
  • --name container_name: 为创建的容器指定一个名称,让我们能够更容易地识别和引用容器。
  • -v /home/workspace:/workspace: 将主机上的 /home/workspace 目录挂载到容器的 /workspace 目录,用于数据持久化和传输。
  • /bin/bash: 容器启动后执行的命令,此处是启动 Bash 以便进一步操作。

如果创建容器后直接进入容器中,我们需要先使用 Ctrl + D 退出容器,并通过 docker container start <container ID> 命令重启容器,因为退出会导致容器停止运行。然后,使用 docker exec -it <container ID> /bin/bash 命令进入容器,在退出容器时,该方案仍会保持容器持续运行。

在上述命令中的 <container ID> 部分代表容器的标识。除了可以直接使用容器的 ID,你还可以使用容器的名称作为标识来执行命令,因为容器的名称在 Docker 中也是唯一的。

2、搭建炼丹炉环境

  1. Miniconda: 是 Anaconda 的精简发行版,提供了核心的包管理功能和虚拟环境管理,具有良好的跨平台支持,为需要广泛的第三方库和稳定环境管理的用户提供了一个强大的基础。
  2. Miniforge: 是基于 conda 的轻量级开源发行版,默认使用 conda-forge 社区的包源,体积更小,资源占用更少,适合在有限资源下进行开发或快速搭建开发环境,以及希望避免 Anaconda 商业许可限制的用户使用。

① 更新镜像源

为了提高软件包管理的效率和速度,我们需要替换默认的镜像源为阿里云镜像源,并执行必要的更新操作以确保系统的软件包保持最新状态。同时,为了提高操作效率,我们还需要安装一些常用的基础开发工具。

sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \
    apt-get clean && \
    apt-get update && \
    apt-get install -y curl wget tree vim git

② 安装配置 Miniconda / Miniforge

接下来,我们通过安装 Miniconda 高效地实现 Python 项目的管理,它允许我们创建隔离的编程环境,从而管理不同项目所需的依赖项和包,这样可以有效地防止版本冲突和满足特定项目的需求。

安装 Miniconda

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
    bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 && \
    rm Miniconda3-latest-Linux-x86_64.sh

配置环境变量

使用以下命令自动初始化 conda 并配置环境变量:

/opt/miniconda3/bin/conda init

然后重新加载 bash 配置:

source ~/.bashrc

或者,您也可以手动编辑 ~/.bashrc 文件:

vim ~/.bashrc

在文件末尾添加以下行:

export PATH="/opt/miniconda3/bin:$PATH"

配置镜像源

现在,我们已经成功安装并配置了 Miniconda,接下来配置镜像源以优化软件包下载速度。我们可以通过下面命令将清华大学提供的镜像源地址添加到 conda 和 pip 配置中来加速包下载安装速度:

source ~/.bashrc

现在,我们已经成功安装并配置了 Miniconda,还需要更新镜像源,以优化软件包下载速度和提升使用体验。我们可以通过下面命令指定将清华大学提供的镜像源地址添加到 conda 和 pip 配置来加速包现在下载安装速度:

/opt/miniconda3/bin/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ && \
    /opt/miniconda3/bin/conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \
    /opt/miniconda3/bin/conda config --set show_channel_urls yes && \
    /opt/miniconda3/bin/pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

安装 Miniforge(可选)

如果您想在系统中安装 Miniforge(针对 conda-forge 社区优化的轻量级开源发行版),可以执行下面安装命令:

wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh && \
    bash Miniforge3-Linux-x86_64.sh -b -p /opt/miniforge3 && \
    rm Miniforge3-Linux-x86_64.sh

安装完成 Miniforge 后,需要将 Miniforge 的安装路径添加到系统的 PATH 环境变量中,步骤与上述 Miniconda 配置类似,只需将路径替换为 /opt/miniforge3

迁移 conda 虚拟环境

如果您之前已经在本地创建了 conda 虚拟环境,并希望将其迁移到新的 Docker 容器中,其实只需两行命令,就能把当前环境完整打包,随时迁移到任何新机器:

# 在原机器导出环境快照
conda env export --no-builds | grep -v "^prefix:" > environment.yml

# 在新机器一键还原
conda env create -f environment.yml -n mylab

这里的 --no-builds 参数可以去掉构建号,保证跨平台迁移更稳妥;而 grep -v "^prefix:" 则是去除绝对路径,避免还原时路径冲突。

③ 虚拟环境安装 PyTorch

使用 conda 创建一个新的虚拟环境,并选择合适的环境名称。在创建环境时,您可以指定安装的 Python 的版本,这样做的好处是它将隔离环境配置,确保项目的可移植性和复现性。下面是创建新环境的命令示例,其中 myenv 是虚拟环境的名称,而 python=3.10 是指定安装的 Python 版本:

conda create -n myenv python=3.10

创建环境后,您需要使用下面的命令来激活该环境:

conda activate myenv

进入该环境后,我们可以使用 conda 或 pip 安装所需的 Python 包,但在安装 PyTorch 之前,还需要确定 GPU 支持的 CUDA 版本,这可以通过 nvidia-smi 命令查询得知。

然后,访问 PyTorch 官网 选择与您的 CUDA 版本相对应的 PyTorch 版本。以 conda 为例,安装 PyTorch 的命令如下:

conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia

安装完成后,我们可以通过直接运行下面 Python 命令来检查 PyTorch 是否已经安装成功。如果安装成功,您将能够看到打印出 PyTorch 的版本号,而不会出现任何导入错误。

python -c "import torch; print(torch.__version__)"

同时,可以执行下面命令检查 PyTorch 是否成功识别到了 GPU 设备,如果输出为 True,则表示 PyTorch 成功识别到了 GPU 设备。如果输出为 False 或者出现错误,则表示没有检测到 GPU 支持,或者 PyTorch 尚未正确安装。

python -c "import torch; print(torch.cuda.is_available())"

请确保在运行这些命令前,python 指的是您希望使用的 Python 版本,特别是如果您的环境中安装了多个版本的 Python 时,有可能需要使用 python3 而不是 python,这取决于您的系统配置。

3、炼丹炉环境迁移

在您完成代码的调试并希望将项目环境迁移至其他(训练)服务器时,操作流程相当简单明了,您只需将容器封装为镜像文件,并将该文件迁移到新服务器,之后基于该镜像重新创建容器即可。

首先,使用 docker commit <container-id> <image-name>:<tag> 命令来将正在运行的容器转换为新镜像:

docker commit container_name image_demo:latest

然后,利用 docker save -o <image-name>.tar <image-name>:<tag> 将这个新建的镜像存储为 .tar 压缩文件,这将便于后续的镜像传输工作:

docker save -o image_demo.tar image_demo:latest

最终,将这个 .tar 镜像文件传输至您的新服务器上,并在新服务器上使用 docker load -i <image-name>.tar 命令来加载并读取镜像文件:

docker load -i image_demo.tar

完成这些步骤后,便可以在新服务器无缝运行原容器中配置的环境,环境迁移过程简单高效。

Docker Deep Learning PyTorch Conda Miniconda Miniforge 深度学习