当主机具有 CUDA 9 时,我可以使用 CUDA 10 运行 Docker 容器吗?

Posted

技术标签:

【中文标题】当主机具有 CUDA 9 时,我可以使用 CUDA 10 运行 Docker 容器吗?【英文标题】:Can I run a Docker container with CUDA 10 when host has CUDA 9? 【发布时间】:2019-11-22 17:11:12 【问题描述】:

我在需要 CUDA 10 的 docker 容器中部署应用程序。这是运行应用程序使用的一些底层 pytorch 功能所必需的。

但是,主机服务器正在运行 docker ce 17、Nvidia-docker v 1.0 和 CUDA 版本 9,我将无法升级主机。

我的印象是我被主机上可用的 v1 nvidia docker runtime 和 CUDA 版本束缚住了。

有没有办法在容器上运行 CUDA 10,以便我可以利用这个工具包的功能?

【问题讨论】:

这在很大程度上取决于具体的配置,尤其是主机上加载了哪个驱动程序,以及主机中的GPU是否是Tesla GPU。在某些情况下,依赖于 CUDA 10 的 docker 容器可以在 CUDA 9 主机上运行,​​但它需要一些特定的步骤。要求都在this document中详细说明。 很好,以前没有遇到过这些要求。那么如果主机没有 Tesla GPU 而有 Quadros 怎么办?我仍然不清楚我需要执行 dockerfile 和/或 compose.. 的安装步骤吗? 了解主机上安装的 GPU 驱动程序版本也很重要。如果主机有一个 Quadro GPU,那么“向后”兼容性库将无法使用它,您成功的唯一可能性是主机安装了比“典型”CUDA 9 驱动程序更新的驱动程序。如果您的主机安装了“典型”CUDA 9 驱动程序,并且它是 Quadro GPU,则不可能运行依赖于 CUDA 10 的容器。 另外,虽然它没有直接解决您的问题,但this thread 提供了一些关于兼容性库使用和容器的可能有用的信息。但同样,兼容性库不能与 Quadro GPU 一起使用,这是有保证的。 所需的GPU驱动程序(例如基础机器上安装了什么)和支持的CUDA版本(例如您可以或希望在容器中使用什么CUDA版本)的关系如表1所示@ 987654323@。由于您的基础机器中有 Quadro GPU,因此无法使用兼容性库机制,并且您运行 CUDA 10.0 容器的唯一希望是如果偶然安装了像 410.48(或更新/更高)这样的“更新”驱动程序在基础机器上。 【参考方案1】:

在一般情况下,任何特定的 CUDA 版本都需要最低 GPU 驱动程序版本。这在here 和here 之类的地方都有介绍(表1)。因此,要使用 CUDA 9.0,您至少需要一个支持 CUDA 9.0 的 GPU 驱动程序版本,例如 R384 驱动程序。要使用 CUDA 10.0,您至少需要一个支持 CUDA 10.0 的 GPU 驱动程序版本,例如 R410 驱动程序。

容器的使用并没有从根本上改变这一点。如果你想使用一个包含 CUDA 10 代码的容器,你的基础机器需要一个支持 CUDA 10 的驱动程序。

NVIDIA 确实开始发布允许修改上述声明的兼容性库。这些兼容性库可用,但默认情况下不随 CUDA 工具包安装一起安装。这些兼容性库仅在某些情况下有效,并且它们具有某些可用要求。兼容性库记录在 here。

使用这些兼容性库的具体要求之一是使用的 GPU 必须是 Tesla 品牌的 GPU。这些兼容性库不支持 GeForce、Quadro、Jetson 和 Titan 系列 GPU。

此外,这些库仅适用于 CUDA 工具包版本和安装在基础机器上的 GPU 驱动程序版本的特定组合。此“兼容性矩阵”记录在 here(表 3)。只有 CUDA 工具包版本与已安装驱动程序版本的特定组合才能用于兼容性。举一个例子,如果您希望使用 CUDA 10.0,并且您的基础机器有一个安装了 R396 驱动程序的 Tesla GPU,则没有兼容性支持。但是,在相同的设置中,如果您希望使用 CUDA 10.1,则可以提供兼容性支持。

如果您已满足兼容性使用要求,那么剩下的步骤就是安装兼容性库 (or build your container from a base container that has the compatibility libraries already installed)。

对于包管理器 CUDA 安装方法,安装兼容性库的方法很简单(以 Ubuntu 为例,安装 CUDA 10.1 兼容性以匹配 CUDA 10.1 工具包安装):

sudo apt-get install cuda-compat-10.1

确保版本与您正在使用的 CUDA 工具包版本相匹配(您使用包管理器方法安装,或者已经安装在您的容器中)。

此兼容性“路径”仅在 CUDA 9.0 时间范围内开始。配备早于 CUDA 9.0 的驱动程序的系统将无法以任何方式用于此兼容性路径。还有各种功能限制和限制,在documentation 中有介绍。

当这个“兼容路径”被正确安装和使用时,整个系统配置可能“看起来”违反了这个答案顶部指示的规则。例如,CUDA 10.1 应用程序可能在仅安装了 R396 驱动程序的机器上运行。

对于此处查看的具体问题,OP 最终表示基础机器具有 Quadro GPU,因此此“兼容性路径”不适用,并且是运行例如如果在基本机器中安装了支持 CUDA 10.0 的驱动程序,则 CUDA 10.0 容器将是,例如R410 或更高版本的驱动程序。

【讨论】:

主机是CUDA 10和R430,但是我想运行一个带有CUDA 9代码的容器?不知怎的,它给了我Failed to initialize NVML: Driver/library version mismatch 那你没有正确安装或使用nvidia container toolkit。您不应该在容器中安装任何驱动程序组件(这是您所做的)。您应该让容器工具包处理它。驱动程序仅安装在主机上。查看 nvidia cuda 容器 (dockerfiles) 以了解它们是如何构建的。 所以Failed to initialize NVML: Driver/library version mismatch 暗示我已经在容器内安装了驱动程序?由于我很久以前创建了这个容器,所以我忘记了我当时做了什么......但是我提到的CUDA 10和R430都是在主机上,而不是在容器内。 是的,就是这个意思。当您使用 nvidia 容器工具包时,您不应该这样做。如果您不使用 nvidia 容器工具包,则必须确保主机上安装的驱动程序与容器中安装的驱动程序完全匹配。建议不要为此烦恼,而是使用 nvidia 容器工具包,它会为您处理这个问题。在这种情况下不要在容器中安装任何 GPU 驱动程序或驱动程序组件 有什么办法可以让这个容器再次工作?比如从容器中移除驱动程序?

以上是关于当主机具有 CUDA 9 时,我可以使用 CUDA 10 运行 Docker 容器吗?的主要内容,如果未能解决你的问题,请参考以下文章

在包含 CUDA 运行时 API 的主机代码中使用 CUDA 驱动程序 API

CUDA 统一内存工作(具体来说,cudaMallocManaged();)

CUDA 固定从设备刷新内存

将主机内存复制到 cuda __device__ 变量

为什么CUDA内核无法在带有CUDA 9.0的VS 2013中启动

CUDA:struct的共享数据成员和该struct的引用成员具有不同的地址,值