安装 Docker GPU 版本的过程及遇到的坑

devtools/2025/1/20 4:33:58/

首先,安装的 Docker 版本并不支持 GPU,因此需要安装支持 GPU 的 Docker 版本。然而,在安装和配置过程中,遇到了一系列问题和挑战。

错误的安装步骤

以下是我在尝试安装 GPU 版本时,执行的错误操作:

# 安装 NVIDIA 驱动
sudo apt-get update
sudo apt-get install -y nvidia-driver-460# 添加 NVIDIA 运行时配置
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=/usr/bin/nvidia
EOF# 重新启动 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

这段脚本是根据 GPT 提供的方案执行的,但我没有注意到它可能会导致一些问题。最终我发现,在执行完该脚本后,Docker 无法启动,并且出现了以下错误:

xtx@dell-PowerEdge-R750:~$ nvidia-docker --version
nvidia-docker: command not found

发现问题:NVIDIA 驱动安装冲突

接下来,我发现 nvidia-smi 无法执行,也无法找到 NVIDIA 相关的命令。通过检查 NVIDIA 驱动,发现系统中安装了多个版本的 NVIDIA 驱动。

dpkg -l | grep nvidia

于是,我尝试卸载了 nvidia-driver-460,但问题依旧存在:

sudo apt-get remove --purge nvidia-driver-460

多次尝试卸载仍然没有解决问题,驱动仍然有冲突。于是决定彻底清理所有 NVIDIA 驱动,并重新安装:

# 清除所有 NVIDIA 驱动
sudo apt-get purge nvidia*# 更新包管理器
sudo apt-get update# 安装正确版本的 NVIDIA 驱动
sudo apt-get install nvidia-driver-470 nvidia-utils-470

重新安装驱动后,虽然成功安装了 NVIDIA 驱动,但执行 nvcc -V 命令时没有任何输出。这时我怀疑问题可能与 CUDA Toolkit 无关,因为在安装驱动时并没有安装 CUDA。

权限问题及解决

接下来,我检查了 ~/.bashrc 文件,确认路径没有问题。然而,考虑到权限问题,我以 root 用户身份进行检查,发现没有问题。这一步解决了驱动的问题。

安装 Docker GPU 版本及其问题

接下来,我按照官方教程安装 Docker 的 GPU 版本,并配置了相应的 NVIDIA 运行时。但在启动 Docker 时,遇到了如下错误:

(tx) xtx@dell-PowerEdge-R750:/data/xtx/nnUNet/nnunetv2/inference$ systemctl status docker.service
Warning: The unit file, source configuration file or drop-ins of docker.service changed on disk. Run 'systemctl daemon-reload' to reload units.
× docker.service - Docker Application Container EngineLoaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)Drop-In: /etc/systemd/system/docker.service.d└─override.confActive: failed (Result: exit-code) since Thu 2025-01-16 13:39:52 CST; 7min ago
TriggeredBy: × docker.socketDocs: https://docs.docker.comProcess: 113728 ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=/usr/bin/nvidia (code=exited, status=1/FAILURE)Main PID: 113728 (code=exited, status=1/FAILURE)CPU: 92ms

解决问题的过程

一开始,我尝试按照网上的建议修改 /etc/docker/daemon.json 文件,切换到国内镜像源。然而,修改后仍然报错。接着,我打开了 override.conf 文件,发现最初配置中使用了 ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=/usr/bin/nvidia 这一行,而这一行实际上导致了启动失败。

最终,我删除了这行配置,并重新加载并重启了 Docker 服务:

# 重新加载 systemd 配置
sudo systemctl daemon-reload# 重启 Docker 服务
sudo systemctl restart docker

此时,Docker 成功启动,问题得到解决。

简单总结一下

平常使用GPT习惯了,感觉简单问题直接按照它的命令行输入就行,没有仔细理解该指令背后的含义,从而导致版本冲突。另外,发生问题太依赖GPT和教程了,缺少自己的反思。

再面对类似的问题时,应该从头逐步排除法,从系统配置到具体服务的每一步都要仔细检查。解决问题的关键往往是细致入微的排查和多角度的分析。即便是看似简单的操作,背后也可能隐藏着复杂的系统交互和配置依赖。


http://www.ppmy.cn/devtools/151997.html

相关文章

栈和队列(数据结构初阶)

文章目录 栈和队列一&#xff1a;栈1.1概念与结构1.2底层逻辑1.3栈的实现结构定义判空入栈出栈取栈顶元素获取栈中有效数据个数 二&#xff1a;队列2.1概念与结构2.2底层逻辑2.3 队列的实现结构定义初始化入队判空出队取数据有效数据个数 三&#xff1a;结语 欢迎大家来到我的博…

计算机网络 (43)万维网WWW

前言 万维网&#xff08;World Wide Web&#xff0c;WWW&#xff09;是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义&#xff1a;万维网是一个分布式、联机式的信息存储空间&#xff0c;通过超文本链接的方式将分散的信息…

JVM相关面试题

一、JVM是什么: Java Virtual Machine,Java的运行环境(java二进制字节码的运行环境)&#xff1b;一次编写、到处运行&#xff1b;自动管理内存&#xff0c;提供垃圾回收机制 JVM的组成部分、运行流程: 二、JVM的组成: 1.程序计数器: 程序计数器是线程私有的&#xff0c;内部…

AudioGPT全新的 音频内容理解与生成系统

AudioGPT全新的 音频内容理解与生成系统 ChatGPT、GPT-4等大型语言模型 (LLM) 在语言理解、生成、交互和推理方面表现出的非凡能力,引起了学界和业界的极大关注,也让人们看到了LLM在构建通用人工智能 (AGI) 系统方面的潜力。 现有的GPT模型具有极高的语言生成能力,是目前最…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

Python 调整 Excel 中的行列顺序

调整Excel 行列顺序指的是改变工作表中行或列的位置&#xff0c;以便更好地展示和分析数据。例如&#xff0c;你可以将重要数据列放在最前面&#xff0c;或者将相关数据列放在一起&#xff0c;以便更方便地进行比较和分析。本文将介绍如何通过Python高效地调整Excel 行列顺序。…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答&#xff0c;这样的好处是&#xff0c;不管是头节点还是中间的节点都可以当成是中间节点来处理&#xff0c;用同一套方法就可以进行处理&#xff0c;而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…