ubuntu24.04系统,容器内算法服务运行一段时间cuda突然不能使用

在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

第三种方法:

参考链接如下

https://stackoverflow.com/questions/72932940/failed-to-initialize-nvml-unknown-error-in-docker-after-few-hours

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!-腾讯云开发者社区-腾讯云

相关推荐
wy02_4 分钟前
Docker容器命令
docker
夏尔Gaesar6 小时前
Failed to start Docker Application Container Engine
docker·容器·eureka
节点小宝6 小时前
如何远程登录路由器
运维·服务器·网络·docker·智能路由器·远程工作
wyy72936 小时前
树莓派4B 搭建openwrt内置超多插件docker,nas等等使用教程
docker·容器·eureka
梦想画家7 小时前
Docker容器五种网络驱动模式详解
网络·docker
勇-子9 小时前
K8s docker-compose的入门
docker·eureka·kubernetes
工业3D_大熊11 小时前
HOOPS Communicator功能剖析:3D Web模型树交互的实用指南!
linux·windows·macos·3d·docker·c#·.net
Jack_Kuo13 小时前
【docker】如何打包前端并运行
前端·docker·容器
Adellle14 小时前
docker容器镜像拉取失败解决方案
java·docker·容器