33 SUSE Linux Micro 上的 NVIDIA GPU #
33.1 简介 #
本指南将演示如何通过预构建的开源驱动程序在 SUSE Linux Micro 6.1 上实现主机级别的 NVIDIA GPU 支持。这些驱动程序是内置在操作系统中的,而非由 NVIDIA 的 GPU Operator 动态加载。对于希望将部署所需的所有制品预先嵌入映像,且不需要动态选择驱动程序版本(即用户无需通过 Kubernetes 选择驱动程序版本)的客户而言,这种配置极具吸引力。本指南首先介绍如何将其他组件部署到已预先部署的系统,然后在一个章节中介绍如何通过 Edge Image Builder 将此配置嵌入到初始部署中。如果您不想了解基础知识并想要手动完成设置,请直接跳到该章节。
需要特别说明的是,这些驱动程序的支持服务由 SUSE 和 NVIDIA 紧密合作提供,SUSE 负责驱动程序的构建,并将其作为软件包储存库的一部分分发。不过,如果您在驱动程序的使用组合方面有任何疑问或顾虑,请咨询您的 SUSE 或 NVIDIA 客户经理以获得进一步的帮助。如果您打算使用 NVIDIA AI Enterprise (NVAIE),请确保使用的是经过 NVAIE 认证的 GPU,这可能需要搭配使用 NVIDIA 的专有驱动程序。如果对此不确定,请咨询您的 NVIDIA 代表。
本指南不会介绍有关 NVIDIA GPU Operator 集成的更多信息。虽然其中不会介绍如何为
Kubernetes 集成 NVIDIA GPU Operator,但您仍然可以按照本指南中的大部分步骤来设置底层操作系统,并通过 NVIDIA GPU
Operator Helm chart 中的 driver.enabled=false
标志来让 GPU
Operator 使用预安装的驱动程序,在这种情况下,GPU Operator
会直接选择主机上安装的驱动程序。NVIDIA 在此处提供了更详细的说明。
33.2 先决条件 #
如果您要学习本指南,事先需要做好以下准备:
至少一台装有 SUSE Linux Micro 6.1 的主机,可以是物理主机,也可以是虚拟机。
您的主机已附加到某个订阅,只有这样,才能访问软件包 — 可在此处进行评估。
已安装兼容的 NVIDIA GPU(或已完全直通到运行 SUSE Linux Micro 的虚拟机)。
root 用户访问权限 — 本章中的说明假设您是 root 用户,而未通过
sudo
提升特权。
33.3 手动安装 #
本节介绍如何直接将 NVIDIA 驱动程序安装到 SUSE Linux Micro 操作系统上,因为 NVIDIA 开放驱动程序现在包含在核心 SUSE Linux Micro 软件包储存库中,因此,只需安装所需的 RPM 软件包就能安装这些驱动程序。无需编译或下载可执行软件包。下面介绍如何部署支持最新 GPU 的第六代 (G06) 驱动程序(有关更多信息,请参见此处),请选择适合您系统中的 NVIDIA GPU 的驱动程序代系。对于新式 GPU,“G06”驱动程序是最常见的选择。
在开始之前,需要明确一点,除了 SUSE 在 SUSE Linux Micro 中随附的 NVIDIA 开放驱动程序之外,您的配置可能还需要其他
NVIDIA 组件。这些组件可能包括 OpenGL 库、CUDA 工具包、命令行实用程序(例如
nvidia-smi
)和容器集成组件(例如
nvidia-container-toolkit
)。其中许多组件并非由 SUSE 提供,因为它们属于 NVIDIA
的专有软件,或者由我们而非 NVIDIA
来提供这些组件并不合理。因此,在本指南的操作步骤中,我们将配置额外的储存库以便获取上述组件,并通过一些示例说明如何使用这些工具,最终搭建出一个功能完整的系统。需要注意区分
SUSE 储存库和 NVIDIA 储存库,因为两者提供的软件包版本偶尔会出现不匹配的情况。这种情况通常发生在 SUSE
发布了新版本的开放驱动程序后,NVIDIA 储存库可能需要几天时间才能提供与之匹配的对应版本软件包。
我们建议您采取以下措施来确保所选驱动程序版本与您的 GPU 兼容并符合现有的任何 CUDA 要求:
查看 CUDA 发行说明
检查您要部署的驱动程序版本是否在 NVIDIA 储存库中有匹配的版本,并确保支持组件有可用的对应软件包版本
要查找 NVIDIA 开放驱动程序版本,请在目标计算机上运行 zypper se -s
nvidia-open-driver
,或者在 SUSE Customer Center
上适用于
AMD64/Intel64 的 SUSE Linux Micro 6.1 中搜索“nvidia-open-driver”。
在确认 NVIDIA 储存库中提供了对应版本后,便可以在主机操作系统上安装软件包了。为此,需要打开
transactional-update
会话,它会创建底层操作系统的新读/写快照,以便我们可以对不可变平台进行更改(有关
transactional-update
的更多说明,请参见此处):
transactional-update shell
在进入 transactional-update
外壳后,添加来自 NVIDIA
的其他软件包储存库。这样就可以提取其他实用程序,例如 nvidia-smi
:
zypper ar https://download.nvidia.com/suse/sle15sp6/ nvidia-suse-main
zypper --gpg-auto-import-keys refresh
然后,可以安装驱动程序,并安装 nvidia-compute-utils
来获取其他实用程序。如果您不需要这些实用程序,可以省略其安装步骤,但为了稍后进行测试,最好现在就安装它们:
zypper install -y --auto-agree-with-licenses nvidia-open-driver-G06-signed-kmp nvidia-compute-utils-G06
如果安装失败,可能表明所选驱动程序版本与 NVIDIA
在其储存库中提供的版本之间存在依赖项不匹配情况。请参见上一节来校验您的版本是否匹配。尝试安装不同的驱动程序版本。例如,如果 NVIDIA
储存库中的版本较低,您可以尝试在 install 命令中指定
nvidia-open-driver-G06-signed-kmp=550.54.14
,以指定一致的版本。
接下来,如果您使用的 GPU 不在支持列表中(支持列表可参考此处),可以尝试通过在模块层面启用支持来测试驱动程序是否能正常工作,但结果可能因设备而异 — 如果您使用的是支持的 GPU,请跳过此步骤:
sed -i '/NVreg_OpenRmEnableUnsupportedGpus/s/^#//g' /etc/modprobe.d/50-nvidia-default.conf
安装这些软件包后,请退出 transactional-update
会话:
exit
在继续之前,请确保已退出 transactional-update
会话。
安装驱动程序后,接下来请重引导系统。由于 SUSE Linux Micro 是不可变的操作系统,因此它需要重引导至您在上一步骤中创建的新快照。驱动程序只会安装到此新快照中,因此如果系统不重引导至此新快照(会自动重引导),就无法加载驱动程序。准备就绪后,发出 reboot 命令:
reboot
系统成功重引导后,请重新登录并使用 nvidia-smi
工具校验驱动程序是否已成功加载,以及它是否可以访问和枚举您的 GPU:
nvidia-smi
此命令应显示如下所示的输出,请注意,以下示例中显示了两个 GPU:
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.06 Driver Version: 545.29.06 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA A100-PCIE-40GB Off | 00000000:17:00.0 Off | 0 |
| N/A 29C P0 35W / 250W | 4MiB / 40960MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
| 1 NVIDIA A100-PCIE-40GB Off | 00000000:CA:00.0 Off | 0 |
| N/A 30C P0 33W / 250W | 4MiB / 40960MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+
在 SUSE Linux Micro 系统上安装和校验 NVIDIA 驱动程序的过程到此结束。
33.4 进一步验证手动安装 #
在此阶段,我们只能确认的是,在主机级别,可以访问 NVIDIA
设备,并且驱动程序可以成功加载。但是,如果我们想要确保设备正常运行,可以通过一项简单测试来验证 GPU
是否可以从用户空间应用程序接收指令,最好是通过容器和 CUDA 库接收,因为实际工作负载通常使用这种方法。为此,我们可以通过安装
nvidia-container-toolkit
(NVIDIA
Container Toolkit) 来进一步修改主机操作系统。首先,打开另一个
transactional-update
外壳,请注意,在上一步骤中我们可能是通过单个事务执行此操作,后面的章节将介绍如何完全自动地执行此操作:
transactional-update shell
接下来,安装来自 NVIDIA Container Toolkit 储存库的
nvidia-container-toolkit
软件包:
下面的
nvidia-container-toolkit.repo
包含稳定储存库 (nvidia-container-toolkit
) 和实验性储存库 (nvidia-container-toolkit-experimental
)。对于生产用途,建议使用稳定储存库。默认会禁用实验性储存库。
zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
zypper --gpg-auto-import-keys install -y nvidia-container-toolkit
准备就绪后,可以退出 transactional-update
外壳:
exit
... 然后将计算机重引导至新快照:
reboot
如前文所述,需确保已退出 transactional-update
外壳并重引导计算机,使更改生效。
重引导计算机后,可以校验系统是否可以使用 NVIDIA Container Toolkit 成功枚举设备。输出应该非常详细,包含 INFO 和 WARN 消息,但不包含 ERROR 消息:
nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
这可确保计算机上启动的任何容器都可以采用已发现的 NVIDIA GPU 设备。准备就绪后,可以运行基于 podman 的容器。通过
podman
执行此操作可以方便地从容器内部验证对 NVIDIA 设备的访问,稍后还可以放心地对
Kubernetes 执行同样的操作。根据 SLE
BCI,为 podman
授予对上一条命令处理过的带标签 NVIDIA 设备的访问权限,然后直接运行
Bash 命令:
podman run --rm --device nvidia.com/gpu=all --security-opt=label=disable -it registry.suse.com/bci/bci-base:latest bash
现在,您将从临时 podman
容器内部执行命令。该容器无权访问您的底层系统,并且是临时性的,因此我们在此处执行的所有操作都不会保存,并且您无法破坏底层主机上的任何设置。由于我们现在处于容器中,因此可以安装所需的
CUDA 库。请再次对照此页面检查驱动程序的
CUDA 版本是否正确,不过,先前 nvidia-smi
命令的输出应该也会显示所需的 CUDA
版本。以下示例将安装 CUDA 12.3 并提取许多示例、演示和开发包,以便您可以全面验证 GPU:
zypper ar https://developer.download.nvidia.com/compute/cuda/repos/sles15/x86_64/ cuda-suse
zypper in -y cuda-libraries-devel-12-3 cuda-minimal-build-12-3 cuda-demo-suite-12-3
成功安装后,请不要退出容器。我们将运行 deviceQuery
CUDA 示例,它会全面验证通过 CUDA
以及从容器本身内部进行 GPU 访问的情况:
/usr/local/cuda-12/extras/demo_suite/deviceQuery
如果成功,您应会看到如下所示的输出,请注意命令结束后返回的 Result = PASS
消息,并注意在以下输出中,系统正确识别了两个 GPU,而您的环境中可能只有一个 GPU:
/usr/local/cuda-12/extras/demo_suite/deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
Detected 2 CUDA Capable device(s)
Device 0: "NVIDIA A100-PCIE-40GB"
CUDA Driver Version / Runtime Version 12.2 / 12.1
CUDA Capability Major/Minor version number: 8.0
Total amount of global memory: 40339 MBytes (42298834944 bytes)
(108) Multiprocessors, ( 64) CUDA Cores/MP: 6912 CUDA Cores
GPU Max Clock rate: 1410 MHz (1.41 GHz)
Memory Clock rate: 1215 Mhz
Memory Bus Width: 5120-bit
L2 Cache Size: 41943040 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
Maximum Layered 1D Texture Size, (num) layers 1D=(32768), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(32768, 32768), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 3 copy engine(s)
Run time limit on kernels: No
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Enabled
Device supports Unified Addressing (UVA): Yes
Device supports Compute Preemption: Yes
Supports Cooperative Kernel Launch: Yes
Supports MultiDevice Co-op Kernel Launch: Yes
Device PCI Domain ID / Bus ID / location ID: 0 / 23 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
Device 1: <snip to reduce output for multiple devices>
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
> Peer access from NVIDIA A100-PCIE-40GB (GPU0) -> NVIDIA A100-PCIE-40GB (GPU1) : Yes
> Peer access from NVIDIA A100-PCIE-40GB (GPU1) -> NVIDIA A100-PCIE-40GB (GPU0) : Yes
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.3, CUDA Runtime Version = 12.3, NumDevs = 2, Device0 = NVIDIA A100-PCIE-40GB, Device1 = NVIDIA A100-PCIE-40GB
Result = PASS
在此处,您可以继续运行任何其他 CUDA 工作负载 — 使用编译器以及 CUDA 生态系统的任何其他组件来运行进一步的测试。完成后,可以退出容器,请注意您在容器中安装的任何内容都是临时性的(因此会丢失!),并且底层操作系统不会受到影响:
exit
33.5 使用 Kubernetes 实现 #
确认已在 SUSE Linux Micro 上安装并使用 NVIDIA 开放驱动程序后,我们来了解如何在同一台计算机上配置
Kubernetes。本指南不会指导您部署 Kubernetes,但假设您已安装 K3s 或 RKE2,并且已相应地配置
kubeconfig,以便能够以超级用户的身份执行标准 kubectl
命令。假设您的节点构成了单节点群集,不过,对多节点群集可以使用类似的核心步骤。首先,请确保可以正常进行
kubectl
访问:
kubectl get nodes
此命令应会显示如下所示的输出:
NAME STATUS ROLES AGE VERSION
node0001 Ready control-plane,etcd,master 13d v1.32.4+rke2r1
您会发现,k3s/rke2 安装已检测到主机上的 NVIDIA Container Toolkit,并已将 NVIDIA 运行时集成自动配置到
containerd
(k3s/rke2 使用的容器运行时接口)中。这一点可以通过检查 containerd
config.toml
文件来确认:
tail -n8 /var/lib/rancher/rke2/agent/etc/containerd/config.toml
此命令必须显示如下所示的内容。对应的 K3s 位置是
/var/lib/rancher/k3s/agent/etc/containerd/config.toml
:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes."nvidia"]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes."nvidia".options]
BinaryName = "/usr/bin/nvidia-container-runtime"
如果未显示这些项,则可能表示检测失败。原因可能是计算机或 Kubernetes 服务未重启。如果需要,请如前文所述手动添加这些项。
接下来,我们需要将作为附加 Kubernetes 运行时的 NVIDIA RuntimeClass
配置为默认设置,以确保需要访问 GPU 的任何用户 Pod 请求都可以按照 containerd
配置中指定的方式,使用 NVIDIA Container Toolkit 通过
nvidia-container-runtime
进行这种访问:
kubectl apply -f - <<EOF
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidia
EOF
下一步是配置 NVIDIA Device Plugin,该插件会将 Kubernetes 配置为利用 NVIDIA GPU 作为群集中可用的资源,并与 NVIDIA Container Toolkit 配合工作。此工具最初会检测底层主机上的所有功能,包括 GPU、驱动程序和其他功能(例如 GL),然后允许您请求 GPU 资源并将其用作应用程序的一部分。
首先,需要添加并更新 NVIDIA Device Plugin 的 Helm 储存库:
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
现在可以安装 NVIDIA Device Plugin:
helm upgrade -i nvdp nvdp/nvidia-device-plugin --namespace nvidia-device-plugin --create-namespace --version 0.14.5 --set runtimeClassName=nvidia
几分钟后,您会看到一个新的 Pod 正在运行,它将在可用节点上完成检测,并根据检测到的 GPU 数量来标记节点:
kubectl get pods -n nvidia-device-plugin
NAME READY STATUS RESTARTS AGE
nvdp-nvidia-device-plugin-jp697 1/1 Running 2 (12h ago) 6d3h
kubectl get node node0001 -o json | jq .status.capacity
{
"cpu": "128",
"ephemeral-storage": "466889732Ki",
"hugepages-1Gi": "0",
"hugepages-2Mi": "0",
"memory": "32545636Ki",
"nvidia.com/gpu": "1", <----
"pods": "110"
}
现在,可以创建一个 NVIDIA Pod 来尝试使用此 GPU。我们来尝试在 CUDA 基准容器上执行此操作:
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nbody-gpu-benchmark
namespace: default
spec:
restartPolicy: OnFailure
runtimeClassName: nvidia
containers:
- name: cuda-container
image: nvcr.io/nvidia/k8s/cuda-sample:nbody
args: ["nbody", "-gpu", "-benchmark"]
resources:
limits:
nvidia.com/gpu: 1
env:
- name: NVIDIA_VISIBLE_DEVICES
value: all
- name: NVIDIA_DRIVER_CAPABILITIES
value: all
EOF
如果一切顺利,您可以在日志中看到基准测试信息:
kubectl logs nbody-gpu-benchmark
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
-fullscreen (run n-body simulation in fullscreen mode)
-fp64 (use double precision floating point values for simulation)
-hostmem (stores simulation data in host memory)
-benchmark (run benchmark to measure performance)
-numbodies=<N> (number of bodies (>= 1) to run in simulation)
-device=<d> (where d=0,1,2.... for the CUDA device to use)
-numdevices=<i> (where i=(number of CUDA devices > 0) to use for simulation)
-compare (compares simulation results running once on the default GPU and once on the CPU)
-cpu (run n-body simulation on the CPU)
-tipsy=<file.bin> (load a tipsy model file for simulation)
NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.
> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
GPU Device 0: "Turing" with compute capability 7.5
> Compute 7.5 CUDA device: [Tesla T4]
40960 bodies, total time for 10 iterations: 101.677 ms
= 165.005 billion interactions per second
= 3300.103 single-precision GFLOP/s at 20 flops per interaction
最后,如果您的应用程序需要 OpenGL,您可以在主机级别安装所需的 NVIDIA OpenGL 库,NVIDIA Device Plugin 和 NVIDIA Container Toolkit 可将这些库提供给容器。为此,请如下所示安装软件包:
transactional-update pkg install nvidia-gl-G06
需要重引导系统才能将此软件包提供给应用程序。NVIDIA Device Plugin 会通过 NVIDIA Container Toolkit 自动重新检测此软件包。
33.6 通过 Edge Image Builder 整合配置 #
现在您已经在 SUSE Linux Micro 上验证了应用程序和 GPU 的完整功能,现在可能希望通过第 11 章 “Edge Image Builder”将所有配置整合到一个可部署/可使用的 ISO 或 RAW 磁盘映像。本指南不会介绍如何使用 Edge Image Builder,但提供了构建此类映像所需的配置。以下是一个映像定义示例以及必要的 Kubernetes 配置文件,确保所有必需组件都能在部署时默认安装到位。下面是该示例对应的 Edge Image Builder 目录结构:
.
├── base-images
│ └── SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
├── eib-config-iso.yaml
├── kubernetes
│ ├── config
│ │ └── server.yaml
│ ├── helm
│ │ └── values
│ │ └── nvidia-device-plugin.yaml
│ └── manifests
│ └── nvidia-runtime-class.yaml
└── rpms
└── gpg-keys
└── nvidia-container-toolkit.key
我们来浏览这些文件。首先,这是一个运行 K3s 的单节点群集的示例映像定义,它还会部署实用程序和 OpenGL 软件包
(eib-config-iso.yaml
):
apiVersion: 1.2
image:
arch: x86_64
imageType: iso
baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
outputImageName: deployimage.iso
operatingSystem:
time:
timezone: Europe/London
ntp:
pools:
- 2.suse.pool.ntp.org
isoConfiguration:
installDevice: /dev/sda
users:
- username: root
encryptedPassword: $6$XcQN1xkuQKjWEtQG$WbhV80rbveDLJDz1c93K5Ga9JDjt3mF.ZUnhYtsS7uE52FR8mmT8Cnii/JPeFk9jzQO6eapESYZesZHO9EslD1
packages:
packageList:
- nvidia-open-driver-G06-signed-kmp-default
- nvidia-compute-utils-G06
- nvidia-gl-G06
- nvidia-container-toolkit
additionalRepos:
- url: https://download.nvidia.com/suse/sle15sp6/
- url: https://nvidia.github.io/libnvidia-container/stable/rpm/x86_64
sccRegistrationCode: [snip]
kubernetes:
version: v1.32.4+k3s1
helm:
charts:
- name: nvidia-device-plugin
version: v0.14.5
installationNamespace: kube-system
targetNamespace: nvidia-device-plugin
createNamespace: true
valuesFile: nvidia-device-plugin.yaml
repositoryName: nvidia
repositories:
- name: nvidia
url: https://nvidia.github.io/k8s-device-plugin
这只是一个示例。您可能需要根据自己的要求和期望对其进行自定义。此外,如果使用 SUSE Linux Micro,您需要提供自己的
sccRegistrationCode
来解析软件包依赖项并提取 NVIDIA 驱动程序。
除此之外,还需要添加其他组件,供 Kubernetes 在引导时加载。首先,EIB 目录需要一个
kubernetes
目录,其中包含用于保存配置、Helm chart 值和任何其他所需清单的子目录:
mkdir -p kubernetes/config kubernetes/helm/values kubernetes/manifests
现在我们来通过选择 CNI(如果未选择,则默认为 Cilium)并启用 SELinux 来设置(可选的)Kubernetes 配置:
cat << EOF > kubernetes/config/server.yaml
cni: cilium
selinux: true
EOF
现在确保在 Kubernetes 群集上创建 NVIDIA RuntimeClass:
cat << EOF > kubernetes/manifests/nvidia-runtime-class.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: nvidia
handler: nvidia
EOF
我们将使用内置的 Helm 控制器通过 Kubernetes 本身来部署 NVIDIA Device Plugin。我们需要在 chart 的值文件中提供运行时类:
cat << EOF > kubernetes/helm/values/nvidia-device-plugin.yaml
runtimeClassName: nvidia
EOF
在继续之前,我们需要抓取 NVIDIA Container Toolkit RPM 公共密钥:
mkdir -p rpms/gpg-keys
curl -o rpms/gpg-keys/nvidia-container-toolkit.key https://nvidia.github.io/libnvidia-container/gpgkey
所有必需的制品(包括 Kubernetes 二进制文件、容器映像、Helm
chart(以及所有引用的映像))都会自动实现隔离处理,这意味着在部署时,系统默认不需要互联网连接。现在您只需从 SUSE 下载页面抓取 SUSE
Linux Micro ISO(并将其放入 base-images
目录),然后调用 Edge Image
Builder 工具即可生成 ISO。作为示例补充,以下是用于构建映像的命令:
podman run --rm --privileged -it -v /path/to/eib-files/:/eib \
registry.suse.com/edge/3.3/edge-image-builder:1.2.1 \
build --definition-file eib-config-iso.yaml
有关更多说明,请参见 Edge Image Builder 的文档。
33.7 解决问题 #
33.7.1 nvidia-smi 找不到 GPU #
使用 dmesg
检查内核消息。如果消息指出无法分配
NvKMSKapDevice
,请采用“GPU 不受支持”临时解决方法:
sed -i '/NVreg_OpenRmEnableUnsupportedGpus/s/^#//g' /etc/modprobe.d/50-nvidia-default.conf
注意:如果您在上述步骤中更改了内核模块配置,则需要重新加载或重引导内核模块才能使更改生效。