当前位置:首页 > 技术 > 正文内容

在Ubuntu 22.04上使用Docker构建PyTorch深度学习开发环境

访客 技术 2026年8月22日 2

为了解决深度学习项目环境配置复杂、不同项目依赖冲突等问题,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.jsonjq工具用于格式化输出,如果未安装可以省略。

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

nvidia-detector output

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

ls /usr/src output

然后,确保已安装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

nvidia-smi output

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

nvidia-ctk runtime configure output

重启Docker服务以使配置生效:

sudo systemctl restart docker

通过以下命令验证NVIDIA运行时是否已正确集成:

docker info | grep Runtimes

输出中应包含runtimes: nvidia

docker info runtimes

三、获取并运行PyTorch Docker镜像

为了快速搭建PyTorch环境,推荐使用NVIDIA官方预构建的PyTorch Docker镜像。在选择镜像时,请注意镜像中的CUDA版本应不高于您主机系统安装的CUDA版本(通常由NVIDIA驱动版本决定)。

以下示例将下载并运行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 在容器内安装sudoopenssh-server

进入容器后,首先更新软件包列表并安装sudoopenssh-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

sshd_config changes

保存并退出Vim(按Esc,然后输入:wq)。

重启SSH服务以应用新的配置:

sudo service ssh restart

4.2 PyCharm配置远程解释器

请确保您使用的是PyCharm专业版,社区版不支持远程解释器功能。

  1. 在PyCharm中打开任意一个项目。

  2. 导航到File -> Settings (或在macOS上是PyCharm -> Preferences)。

  3. 在设置面板中,展开Project -> Python Interpreter

  4. 点击解释器下拉菜单旁边的齿轮图标,选择Add Interpreter -> On SSH

    PyCharm Add Interpreter On SSH

  5. 在弹出的"New SSH Configuration"窗口中:

    • Host:输入127.0.0.1 (因为容器端口映射到本地主机)。
    • Port:输入8022 (之前设置的主机端口)。
    • Username:输入root

    点击Next

    PyCharm SSH config details

  6. 在"Authentication"窗口中,选择Password,然后输入您在容器内为root用户设置的密码。

    PyCharm SSH password

    点击OK

  7. PyCharm将尝试连接到容器。连接成功后,进入"Remote Python Interpreter"配置界面。

    PyCharm Remote Python Interpreter step

    确保选择Existing interpreter,并将Interpreter路径设置为容器内的Python解释器路径,通常是/usr/bin/python

    PyCharm Interpreter Path

    点击Finish

  8. PyCharm将开始加载容器内的环境配置和已安装的库。这个过程可能需要一些时间。

    PyCharm Loading Environment

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

    PyCharm Test Script

完成容器内的所有配置后,强烈建议将当前容器保存为新的镜像,以便将来直接启动一个包含所有配置的容器:

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

SSH restart in container

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

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。