在Ubuntu24.04系统中,CUDA程序运行时遇到`RuntimeError: No CUDA GPUs are available`错误。通过`nvidia-smi`和`nvcc -V`确认驱动和CUDA版本正常且可用。但程序仍报错,可能是驱动问题。解决方案包括检查DKMS以自动维护内核驱动,并参考相关博客解决CUDA设备未检测到的问题。
第一种方法:
python
第一种方法:
RuntimeError: No CUDA GPUs are available
检查驱动和cuda是否可用
nvidia-smi:输出版本号,为可用
nvcc -V:输出版本号,为可用
DKMS可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。
一、查看当前驱动版本
cd /usr/src
ls # 查看驱动版本,我的驱动版本为450.80.02
二、配置驱动
sudo apt-get install dkms
sudo dkms install -m nvidia -v 450.80.02
三、测试是否可用
nvidia-smi
在运行PyTorch模型测试时遇到`RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False`的错误。通过更换测试机器或者修改加载状态字典的方式可以解决此问题。此错误可能与GPU初始化失败有关。
第二种方法( NVIDIA Container Toolkit之前是离线安装,版本有点低):
Ubuntu 24.04 快速安装 NVIDIA Container Toolkit
python
英伟达官方安装教程如下(怀疑是ubuntu24.04太新,需要安装最新的版本的):
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
查看已安装的 NVIDIA Container Toolkit 的版本
python
直接查看 NVIDIA Container Toolkit 的版本信息
dpkg -l | grep nvidia-container-toolkit
# 验证运行时
docker info | grep "Runtimes"
# Runtimes: io.containerd.runc.v2 nvidia runc
执行以下命令以验证 NVIDIA Container Toolkit 是否正确安装:
nvidia-container-cli --version
第三种方法:
参考链接如下
python
sudo nano /etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
},
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
sudo systemctl daemon-reload
sudo service docker restart
知识点1.
配置 Docker 以支持 NVIDIA GPU
默认情况下,Docker 并不能直接访问 GPU 资源,原因是 GPU 的管理需要专门的驱动程序和工具。在安装了 NVIDIA Container Toolkit 之后,我们需要告诉 Docker 使用 nvidia
运行时,这样它才能正确地与 GPU 驱动进行通信,并将 GPU 资源暴露给容器。
步骤 1:打开或创建 /etc/docker/daemon.json
配置文件
daemon.json
是 Docker 的配置文件,用于指定 Docker 守护进程的启动选项。我们需要编辑或创建这个文件来配置默认运行时。
python
使用以下命令打开(或创建)/etc/docker/daemon.json 文件:
sudo nano /etc/docker/daemon.json
步骤 2:将 nvidia
设置为默认运行时
在打开的 daemon.json
文件中,添加或修改如下内容:
python
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
default-runtime
: 这行设置 Docker 的默认运行时为nvidia
,这样所有容器在启动时都会自动使用 NVIDIA 运行时。runtimes
: 这里定义了nvidia
运行时的路径和参数,使 Docker 知道如何调用 NVIDIA Container Runtime。
步骤 3:保存文件并退出
步骤 4:重启 Docker 服务
python
配置文件修改完成后,重启 Docker 服务以使更改生效:
sudo systemctl restart docker
验证配置是否成功
验证 Docker 是否正确配置了 nvidia
运行时,可以运行以下命令启动一个简单的测试容器:
python
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
知识点2.
运行时(Runtime)是指执行程序或任务的环境或平台,在不同的上下文中,"运行时" 可能有不同的含义。对于 Docker 和 NVIDIA Container Toolkit 中的运行时,它主要指的是负责管理和执行容器的底层组件。以下是关于运行时在 Docker 和 NVIDIA 环境中的详细解释:
1. Docker 运行时(Docker Runtime)
什么是 Docker 运行时?
- Docker 运行时是一个组件,它负责实际运行容器,将应用程序和所有必要的依赖封装在一起并执行。
- 运行时管理容器的生命周期,包括容器的启动、停止、资源分配、隔离等。
Docker 运行时的分类
- 默认运行时(
runc
) :Docker 默认使用runc
作为其容器运行时。runc
是一个开源工具,遵循 OCI(Open Container Initiative)标准,负责启动和运行容器。 - NVIDIA 运行时(
nvidia-container-runtime
) :这是 NVIDIA 提供的一个专门用于 GPU 加速的 Docker 运行时,允许 Docker 容器访问主机的 GPU 资源。通过将nvidia
配置为默认运行时,容器在启动时可以自动利用 GPU,而不需要手动指定 GPU 资源。
Docker 运行时的作用
- Docker 运行时是连接 Docker 守护进程(Docker Daemon)与底层容器执行环境的重要组件。
- 它负责在操作系统上实际启动和运行容器,并提供进程隔离、文件系统挂载、网络配置等功能。
2. NVIDIA Container Runtime
什么是 NVIDIA Container Runtime?
- NVIDIA Container Runtime 是 NVIDIA 开发的一个运行时扩展,专门用于让 Docker 容器能够访问主机的 GPU 资源。
- 它使容器可以加载主机上的 NVIDIA 驱动程序,直接访问 GPU 硬件,从而实现 GPU 加速计算。
NVIDIA Container Runtime 的作用
- 提供 GPU 支持:通过
nvidia-container-runtime
,Docker 容器可以直接利用主机上的 NVIDIA GPU 进行高性能计算。 - 无需手动配置:使用
nvidia
运行时后,Docker 会自动处理容器与 GPU 之间的通信和资源管理,无需在每次启动容器时手动指定 GPU 配置。
运行时的作用机制
- 管理容器生命周期:运行时负责启动、停止、重启、删除等操作,确保容器按预期运行。
- 资源隔离和分配:运行时确保容器之间的资源隔离,包括 CPU、内存、网络、文件系统等,并根据配置分配所需的资源。
- 加载硬件驱动和库:NVIDIA Container Runtime 负责将主机的 NVIDIA 驱动程序和 CUDA 库挂载到容器中,使得容器可以直接使用 GPU 进行计算。
总结:为什么要设置运行时?
- 默认 Docker 运行时(
runc
) 不支持直接访问 GPU,而 NVIDIA Container Runtime 可以将 GPU 资源暴露给容器。因此,配置 Docker 使用nvidia
运行时非常重要,特别是当你需要在容器中运行深度学习任务时。 - 配置
nvidia
运行时后,Docker 容器可以自动获得对 GPU 的访问权限,大大简化了 GPU 加速的配置过程,提高了深度学习开发的效率。
通过配置 nvidia
运行时,Docker 容器能够更好地与 GPU 进行交互,充分利用硬件资源,满足高性能计算和深度学习训练的需求。
参考链接:
使用 NVIDIA Container Toolkit 和 Docker 配置 GPU 深度学习环境 - 溺死在幸福里的猪 - 博客园
机器学习筑基篇,容器调用显卡计算资源,Ubuntu 24.04 快速安装 NVIDIA Container Toolkit!-腾讯云开发者社区-腾讯云