目录
DNF 模块化
使用预编译驱动程序
使用包管理器安装
选择模块化流
切换流
使用模块化配置文件
RHEL 的支持矩阵
概括
相关资源
NVIDIA GPU 已成为加速机器学习、高性能计算 (HPC)、内容创建工作流程和数据中心应用程序等各种工作负载的主流。对于这些企业用例,NVIDIA 提供了由 CUDA 平台支持的软件堆栈:驱动程序、CUDA-X 加速库、CUDA 优化的应用程序和框架。
部署 NVIDIA 驱动程序是设置 GPU 加速集群以使用 CUDA 的基本方面之一。过去,安装或升级 NVIDIA 驱动程序需要在每个 GPU 节点上安装完整的软件开发环境,例如编译器工具链和内核头文件。企业用户还需要经过测试的 NVIDIA 驱动程序和 Linux 内核组合,以确保稳定性,并能够停留在可能具有不同生命周期的特定驱动程序分支上。
在本文中,我将介绍在 Red Hat Enterprise Linux (RHEL) 8 上对 NVIDIA 驱动程序进行打包的工作,以改善安装和升级驱动程序的体验。这项工作提供了许多好处,包括提高了可靠性、安全性和选择性。对于这项工作,请使用 RHEL 8 中提供的模块化流和预编译的内核模块 ( kmod
) 包。
DNF 模块化
使用模块化,CUDA 存储库为驱动程序包提供多个更新流。仅考虑所选流上的更新。您可以选择跟上最新和最好的版本,也可以锁定到特定的驱动程序分支,例如主版本等于“450”的驱动程序。
这种新机制允许您根据用例切换到不同的流。您可以从单个 RPM 存储库中选择多个 NVIDIA GPU 驱动程序分支之一进行跟踪。一些NVIDIA 驱动程序适合在 NVIDIA 数据中心 GPU 上使用,并且与其他驱动程序分支相比,它们的使用寿命可能更长。企业用户可能出于稳定性原因选择留在特定的驱动程序分支上,而其他用户可能希望跟踪其他分支以访问新功能。
图 1.可用的 nvidia-driver 模块流列表。
您可以选择一个特定的驱动程序分支(例如 R418)来跟踪更新,并且仅从该分支获取更新。这些软件包还提供了一个名为的虚拟分支latest
,latest-dkms
可跟踪每个时间点的最新 NVIDIA 驱动程序。该分支latest-dkms
是默认分支。其他分支是可选的,并且可以切换分支而无需重新安装 CUDA 工具包。
使用预编译驱动程序
对于受支持的 Red Hat Enterprise Linux 8.x 内核版本(请参阅下面的支持列表),提供了实现DKMS替代方案的驱动程序包。无需启用EPEL 存储库。这些驱动程序 kmod 包的源文件是预先编译的,然后在安装时链接,因此这些被称为“预编译驱动程序”。
新方法不需要gcc
安装编译器,从而减少了攻击面并加快了内核和/或驱动程序更新的启动时间。使用这些预编译的kmod
软件包可以提供更高的稳定性,因为确切的 NVIDIA 驱动程序版本和内核版本字符串组合已经过预先测试。告别黑屏(运行级别 3),迎接可预测的用户体验,驱动程序安装不再依赖于kernel-devel
软件包kernel-headers
。
当发布新的驱动程序更新时,仅针对驱动程序更新时最新发布的内核提供预编译驱动程序包。同样,如果发布了新的内核更新,则针对此内核提供预编译驱动程序包。另一种表述方式是,现在,在任何时间点,都会为最新的 RHEL 内核和最新的 NVIDIA 驱动程序版本(每个受支持的分支)启用预编译驱动程序。
图 2. ‘450’ 模块流中的 RPM 包列表,其中突出显示了预编译的 kmod 包。
使用预编译驱动程序时,会启用包管理器插件dnf
来清理过时的 .ko 文件。为了防止系统崩溃,NVIDIA dnf 插件还会阻止升级到尚不存在预编译驱动程序的内核。这可能会延迟安全修复的应用,但可确保始终使用经过测试的内核和驱动程序组合。
使用包管理器安装
以下是在 RHEL 8 上开始使用新驱动程序包的方法。首先,确保已启用 Red Hat 存储库,包括 RHEL8 AppStream、RHEL8 BaseOS 和 RHEL8 CRB:
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ 订阅管理器 repos --enable=rhel-8-for-x86_64-appstream-rpms
$ 订阅管理器 repos--enable=rhel-8-for-x86_64-baseos-rpms
$ 订阅管理器 repos --enable=codeready-builder-for-rhel-8-x86_64-rpms</span></span></span></span>
添加 CUDA 网络存储库:
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ sudo dnf config-manager --add-repo=https://developer.download.nvidia.com/compute/cuda/repos/rhel8/x86_64/cuda-rhel8.repo</span></span></span></span>
安装最新的流以选择加入预编译包:
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ sudo dnf 模块安装 nvidia-driver:latest</span></span></span></span>
选择模块化流
为了提高灵活性,预编译和 DKMS 类型均提供了多种流(表 1)。
NVIDIA 驱动程序 | 预编译流 | 旧版 DKMS 流 |
最高版本 | 最新的 | 最新-dkms |
锁定@455.x | 455 | 455-dkms |
锁定@450.x | 450 | 450-dkms |
锁定@440.x | 440 | 440-dkms |
锁定@418.x | 418 | 418-dkms |
表 1.可用的 nvidia-driver 模块流列表。
最新选项始终更新到最高版本的驱动程序(预编译):
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ sudo dnf 模块安装 nvidia-driver:latest</span></span></span></span>
该<id>
选项将驱动程序更新锁定到指定的驱动程序分支(预编译)。请<id>
用适当的驱动程序分支流替换,例如 455、450、440 或 418。
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ sudo dnf 模块安装 nvidia-driver:<id></span></span></span></span>
该latest-dkms
选项始终更新到最高版本的驱动程序(非预编译)。这是默认流。
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ sudo dnf 模块安装 nvidia-driver:latest-dkms</span></span></span></span>
该<id>-dkms
选项将驱动程序更新锁定到指定的驱动程序分支(非预编译),例如 455-dkms、450-dkms、440-dkms 或 418-dkms。
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">$ sudo dnf 模块安装 nvidia-driver:<id>-dkms</span></span></span></span>
切换流
要切换到另一个流,首先删除驱动程序包:
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5"> $ sudo dnf 删除 nvidia 驱动程序</span></span></span></span>
然后,重置模块流:
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5"> $ sudo dnf 模块重置 nvidia 驱动程序</span></span></span></span>
现在可以从适当的流安装驱动程序。
使用模块化配置文件
模块化配置文件可与任何受支持的模块化流配合使用,并允许其他用例(表 2)。
溪流 | 轮廓 | 用例 |
默认 | /默认 | 安装流中的所有驱动程序包。 |
快速启动 | /ks | 使用配置文件执行无人值守的 Linux 操作系统安装。 |
NVSwitch 结构 | /调频 | 安装引导 NVSwitch 系统所需的所有驱动程序包和组件 (包括 Fabric Manager 和 NSCQ 遥测)。 |
表 2. 可用的 nvidia-driver 模块配置文件列表。
现在,您可以使用该dnf
命令来指定流和配置文件:
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5"> $ sudo dnf 模块安装 nvidia-driver:<流>/<配置文件></span></span></span></span>
该/default
选项在流中安装所有驱动程序包(传递闭包):
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5"> $ sudo dnf 模块安装 nvidia-driver:latest/default</span></span></span></span>
该/ks
选项旨在使用不安装元包的Kickstartcuda-drivers
配置文件进行无人值守的 Linux 操作系统安装。该元包会尝试删除旧的驱动程序运行文件安装。
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5"> %软件包
@^最小安装
@nvidia-驱动程序:最新-dkms/ks
%结尾</span></span></span></span>
该/fm
选项安装用于引导 NVSwitch 的附加软件包,包括 Fabric Manager 和 NSCQ(用于交换机遥测):
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5"> $ sudo dnf 模块安装 nvidia-driver:450/fm</span></span></span></span>
RHEL 的支持矩阵
目前,这些软件包改进仅支持 x86_64 架构上的 RHEL 8.2(及更高版本)。NVIDIA 仅为最新的官方 RHEL 内核提供预编译驱动程序包,例如 4.18.0-193.19.1 及更高版本。如果您使用较早的内核,请更新以开始接收预编译驱动程序包。不为RHEL EUS内核提供预编译驱动程序。
表 3 显示了根据NVIDIA 驱动程序生命周期策略支持的分支。
驱动分支 | 分支机构名称 | 生命终结 |
418 | 长期服务 | 2022 年 3 月 |
440 | 新功能 | 2020 年 11 月 |
450 | 长期服务 | 2023 年 7 月 |
455 | 开发人员 | 460 可用性 |
表 3. NVIDIA 驱动程序分支的支持矩阵。
新的 kmod 包通常在新的 RHEL 内核更新后的 24 小时内可用。
为了防止系统崩溃,该插件会在内核上线和 kmod 软件包可用之间阻止内核更新。在升级过程中dnf
会显示警告:dnf
<span style="color:#1a1a1a"><span style="background-color:#ffffff"><span style="color:#333333"><span style="background-color:#f5f5f5">注:由于找不到 NVIDIA 驱动程序内核模块包 kmod-nvidia-${driver}-${kernel} ...,因此跳过内核安装</span></span></span></span>
概括
使用预编译的内核模块包和模块化流,在 RHEL 8 上部署 NVIDIA 驱动程序的体验更好。新的驱动程序包可在CUDA 存储库中找到,因此您可以立即开始使用。
GitHub 上提供了打包模板和说明,允许您为自定义内核和衍生 Linux 发行版维护自己的预编译内核模块包:
- NVIDIA/yum-包装-预编译-kmod
- NVIDIA/yum-包装-nvidia-插件
有关详细信息,请参阅以下资源:
- 预编译内核模块:使用模块化流在 RHEL8 上进行打包和部署(GTC 2020 年秋季会议)
- 简化 Red Hat Enterprise Linux 上的 NVIDIA GPU 驱动程序部署(Red Hat 峰会 2020)
- RHEL8 预编译 kmod 状态
如需提供反馈、发送评论或报告错误。如果您还不是会员,请加入 NVIDIA 开发者计划。
相关资源
- GTC 会议:Legate:用于可组合、可扩展、加速库的高效编程框架
- GTC 会议:NVIDIA AI 的数据模式:NVIDIA DGX SuperPOD、NVIDIA DGX BasePOD、分析和部署(由 IBM 提供)
- NGC 容器:NVIDIA DOCA 驱动程序
- NGC 容器:NVIDIA GPU 操作员的验证器
- NGC 容器:适用于 Kubernetes 的 NVIDIA 驱动程序管理器
- SDK:DRIVE OS