在Ubuntu 22.04上使用Docker构建PyTorch深度学习开发环境
为了解决深度学习项目环境配置复杂、不同项目依赖冲突等问题,Docker容器化技术提供了一种高效且隔离的解决方案。本文将详细介绍如何在Ubuntu 22.04系统上,利用Docker配置一个支持GPU加速的PyTorch深度学习环境,并集成到PyCharm专业版进行开发。
一、Docker安装与基础配置
1.1 Docker引擎安装
本节将引导您在Ubuntu 22.04系统上安装Docker社区版。
1.1.1 移除旧版本Docker(若存在)
首先,清理系统中可能存在的Docker旧版本软件包,以避免潜在冲突:
sudo apt remove -y docker docker-engine docker.io containerd runc
1.1.2 安装依赖工具
安装必要的系统工具,这些工具是Docker安装过程中的前置条件:
sudo apt install -y ca-certificates curl gnupg lsb-release
1.1.3 配置Docker官方GPG密钥与软件源
为了确保下载的Docker软件包的安全性,需要添加Docker官方的GPG密钥,并配置软件源。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
如果访问Docker官方GPG密钥地址遇到问题,可以使用国内镜像源,例如清华源或阿里云源:
# 清华源
# curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 阿里云
# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
接着,创建适合当前系统架构和版本的Docker软件源列表文件:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
同样,为了提高下载速度,可以选择使用镜像源:
# 清华源
# echo \
# "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/ \
# $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 阿里云
# echo \
# "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu/ \
# $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
1.1.4 安装Docker社区版
更新apt软件包列表,并安装Docker社区版及相关组件:
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
1.1.5 将当前用户添加到Docker用户组
为了避免每次执行Docker命令都需要使用sudo,可以将当前用户添加到docker用户组。添加后需重新登录系统或重启会话才能生效。
sudo gpasswd -a ${USER} docker
您可以通过以下命令验证用户组是否添加成功:
cat /etc/group | grep docker
1.1.6 配置Docker镜像加速器
从Docker Hub拉取镜像时,可能会遇到下载缓慢或中断的问题。配置镜像加速器可以显著改善下载体验。
执行以下命令将常用的镜像加速地址写入Docker配置文件/etc/docker/daemon.json。jq工具用于格式化输出,如果未安装可以省略。
echo '{"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn/",
"https://zrb2xl6u.mirror.aliyuncs.com"
]}' | jq | sudo tee /etc/docker/daemon.json
您可以通过以下命令查看配置是否已生效:
cat /etc/docker/daemon.json
配置完成后,重启Docker服务使更改生效:
sudo systemctl restart docker.service
最后,运行docker info命令,在输出中查找Registry Mirrors部分,确认镜像加速器已启用。
docker info
1.2 Docker常用操作指令
- 查看正在运行的容器:
docker ps - 查看所有容器(包括已停止的):
docker ps -a - 根据ID保存容器为新镜像:
docker commit <容器ID> <新镜像名称>:<标签>(注意镜像名称不能含大写字母) - 以后台模式启动容器:
docker run -d <镜像名称> <命令> - 停止指定容器:
docker stop <容器ID> - 启动已停止的容器:
docker start <容器ID> - 为正在运行的容器开启新的终端:
docker exec -it <容器ID> /bin/bash - 在后台运行容器并指定名称:
docker run -itd --name <容器名称> <镜像名称> - 进入已在后台运行的容器主终端:
docker attach <容器ID> - 将容器导出为文件:
docker export <容器ID> > <文件名>.tar - 从文件导入容器快照为镜像:
docker import <文件名>.tar <新镜像名称>:<标签> - 删除容器:
docker rm -f <容器ID> - 列出本地所有镜像:
docker images - 删除指定镜像:
docker rmi <镜像名称或ID>
二、NVIDIA驱动与NVIDIA Docker安装
2.1 显卡驱动安装
为了使Docker容器能够访问GPU,首先需要确保主机系统正确安装了NVIDIA显卡驱动。
2.1.1 检测推荐的NVIDIA驱动版本
在Ubuntu系统上,可以使用ubuntu-drivers工具检测并推荐适合您显卡的驱动版本:
ubuntu-drivers devices
命令输出会显示推荐的驱动版本,例如nvidia-driver-545。

2.1.2 安装推荐的NVIDIA驱动
根据上一步检测到的推荐版本,安装对应的驱动。例如,如果推荐的是545版本:
sudo apt-get install -y nvidia-driver-545 nvidia-dkms-545
安装完成后,重启系统以确保驱动完全加载。
2.1.3 解决nvidia-smi报错问题(可选)
在某些情况下,即使安装了驱动,运行nvidia-smi时可能会遇到"NVIDIA-SMI has failed because it couldn’t communicate with the NVIDIA driver."的错误。这通常是由于DKMS模块未正确编译或加载所致。
首先,查看系统中已安装的NVIDIA驱动模块版本:
cd /usr/src
ls | grep nvidia

然后,确保已安装dkms:
sudo apt-get install dkms
根据上一步骤查到的确切版本号(例如545.29.06),重新安装对应的NVIDIA DKMS模块:
sudo dkms install -m nvidia -v 545.29.06
再次运行nvidia-smi,应能正常显示GPU信息:
nvidia-smi

2.2 NVIDIA Container Toolkit安装
NVIDIA Container Toolkit (以前的NVIDIA Docker) 允许Docker容器访问主机系统的NVIDIA GPU。
2.2.1 添加NVIDIA Container Toolkit软件源
执行以下命令添加NVIDIA Container Toolkit的GPG密钥并配置软件源:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
2.2.2 安装NVIDIA Container Toolkit
更新apt软件包列表并安装nvidia-container-toolkit:
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
2.2.3 配置Docker运行时
安装完成后,需要配置Docker以使用NVIDIA运行时:
sudo nvidia-ctk runtime configure --runtime=docker

重启Docker服务以使配置生效:
sudo systemctl restart docker
通过以下命令验证NVIDIA运行时是否已正确集成:
docker info | grep Runtimes
输出中应包含runtimes: nvidia。

三、获取并运行PyTorch Docker镜像
为了快速搭建PyTorch环境,推荐使用NVIDIA官方预构建的PyTorch Docker镜像。在选择镜像时,请注意镜像中的CUDA版本应不高于您主机系统安装的CUDA版本(通常由NVIDIA驱动版本决定)。
- NVIDIA PyTorch镜像库:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch
- Docker Hub:https://hub.docker.com/
以下示例将下载并运行nvcr.io/nvidia/pytorch:23.02-py3镜像。这个镜像包含了PyTorch和一个Python 3环境。
首先,尝试运行一个简单的GPU测试命令:
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.02-py3 nvidia-smi
运行此命令后,您可能会在日志中看到关于共享内存(SHMEM)分配限制的警告,提示这可能不足以满足PyTorch的需求:
NOTE: The SHMEM allocation limit is set to the default of 64MB. This may be
insufficient for PyTorch. NVIDIA recommends the use of the following flags:
docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 ...
根据建议,我们将添加--ipc=host --ulimit memlock=-1 --ulimit stack=67108864参数以优化PyTorch的性能。此外,为了方便主机与容器之间的数据交换,我们将添加一个卷挂载(volume mount),并将容器命名以便管理。请将/path/to/host/data替换为您主机上的实际路径。
docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \
-it -v /path/to/host/data:/workspace/data:rw --name pytorch_dev_env \
nvcr.io/nvidia/pytorch:23.02-py3 /bin/bash
--gpus all:允许容器访问所有可用的GPU。--ipc=host:将容器的IPC模式设置为与主机相同,提高共享内存性能。--ulimit memlock=-1 --ulimit stack=67108864:调整内存锁定和栈大小限制,满足深度学习框架需求。-it:以交互式终端模式运行容器。-v /path/to/host/data:/workspace/data:rw:将主机目录/path/to/host/data挂载到容器内的/workspace/data,实现双向读写。--name pytorch_dev_env:为容器指定一个易于识别的名称。nvcr.io/nvidia/pytorch:23.02-py3:指定要使用的Docker镜像。/bin/bash:进入容器后执行bash shell。
要退出容器,只需在容器内输入:
exit
四、配置PyCharm调用本机Docker环境
PyCharm专业版支持将远程SSH解释器配置为项目环境,这使得我们可以方便地在主机上编辑代码,并在Docker容器中运行和调试。
4.1 Docker容器内SSH服务配置
4.1.1 启动容器并进行端口映射
为了让PyCharm能够通过SSH连接到Docker容器,我们需要在启动容器时进行端口映射。以下命令在前述启动命令的基础上,添加了端口映射-p 8022:22,将容器的22号SSH端口映射到主机的8022端口。
docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \
-it -v /path/to/host/data:/workspace/data:rw --name pytorch_dev_env \
-p 8022:22 nvcr.io/nvidia/pytorch:23.02-py3 /bin/bash
-p 8022:22:将主机的8022端口映射到容器的22端口。
4.1.2 在容器内安装sudo和openssh-server
进入容器后,首先更新软件包列表并安装sudo和openssh-server:
apt-get update
apt-get install -y sudo openssh-server
4.1.3 启动SSH服务
启动SSH服务并检查其状态:
sudo service ssh start
sudo service ssh status
4.1.4 配置SSH,允许root用户密码登录
为了方便PyCharm通过root用户进行连接,需要设置root用户的密码,并修改SSH配置文件sshd_config。
设置root密码:
passwd root
# 按照提示输入并确认新密码
编辑SSH配置文件:
vim /etc/ssh/sshd_config
在文件末尾添加或修改以下行,确保允许root用户通过密码登录(如果PasswordAuthentication行被注释,请取消注释并设置为yes):
PermitRootLogin yes
PasswordAuthentication yes

保存并退出Vim(按Esc,然后输入:wq)。
重启SSH服务以应用新的配置:
sudo service ssh restart
4.2 PyCharm配置远程解释器
请确保您使用的是PyCharm专业版,社区版不支持远程解释器功能。
-
在PyCharm中打开任意一个项目。
-
导航到
File->Settings(或在macOS上是PyCharm->Preferences)。 -
在设置面板中,展开
Project->Python Interpreter。 -
点击解释器下拉菜单旁边的齿轮图标,选择
Add Interpreter->On SSH。
-
在弹出的"New SSH Configuration"窗口中:
Host:输入127.0.0.1(因为容器端口映射到本地主机)。Port:输入8022(之前设置的主机端口)。Username:输入root。
点击
Next。
-
在"Authentication"窗口中,选择
Password,然后输入您在容器内为root用户设置的密码。
点击
OK。 -
PyCharm将尝试连接到容器。连接成功后,进入"Remote Python Interpreter"配置界面。

确保选择
Existing interpreter,并将Interpreter路径设置为容器内的Python解释器路径,通常是/usr/bin/python。
点击
Finish。 -
PyCharm将开始加载容器内的环境配置和已安装的库。这个过程可能需要一些时间。

-
配置完成后,您就可以在PyCharm中使用这个远程Docker环境进行开发和调试了。可以编写一个简单的Python脚本来测试PyTorch和GPU是否正常工作。

完成容器内的所有配置后,强烈建议将当前容器保存为新的镜像,以便将来直接启动一个包含所有配置的容器:
docker commit pytorch_dev_env my_pytorch_env:v1.0
五、解决重新打开容器后的连接问题
在某些情况下,重新启动容器后,PyCharm可能无法连接。这通常是因为容器内的SSH服务未自动启动。您可以通过以下命令在容器内手动重启SSH服务:
docker exec -it pytorch_dev_env /bin/bash
# 进入容器后
sudo service ssh restart
sudo service ssh status
# 退出容器
exit

之后,PyCharm应该能够重新建立连接。