如何使用 snapd 的 lxd/lxc 容器在 centos/rhel/ol8 上启用 gpu 直通?

How to enable gpu passthrough on centos/rhel/ol8 using snapd's lxd/lxc containers?

我在 CentOS 上部署 LXC 的指南是安装 snapd 的 lxd https://www.cyberciti.biz/faq/set-up-use-lxd-on-centos-rhel-8-x/

SnapD 是一种服务,允许安装基于 debian/ubuntu 的包,其逻辑是 lxd 在该平台上是最新的。

嗯。如果启用 gpu 直通更容易,我愿意安装替代版本。

最终我正在尝试构建一个容器环境,在那里我可以 运行 最新版本的 python 和具有 gpu 支持的 jupyter。

我有一些关于如何启用 gpu 直通的指南。

https://theorangeone.net/posts/lxc-nvidia-gpu-passthrough/
https://www.reddit.com/r/Proxmox/comments/glog5j/lxc_gpu_passthrough/

我在我的 ol8 主机上添加了以下内核模块

/etc/modules-load.d/vfio-pci.conf
    # Nvidia modules
    nvidia
    nvidia_uvm

#noticed snapd has a modules file I can't edit  

/var/lib/snapd/snap/core18/1988/etc/modules-load.d/modules.conf
            

然后修改grub

nano /etc/default/grub 
    #https://access.redhat.com/documentation/en-us/red_hat_virtualization/4.1/html/installation_guide/appe-configuring_a_hypervisor_host_for_pci_passthrough
    GRUB_CMDLINE_LINUX
    #iommu=on amd_iommu=on
    iommu=pt amd_iommu=pt
            
grub2-mkconfig -o /boot/grub2/grub.cfg

然后添加了udev规则

    nano /etc/udev/rules.d/70-nvidia.rules
    KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
    KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"

#reboot

然后将gpu添加到lxc.conf

ls -l /dev/nvidia*

# Allow cgroup access
lxc.cgroup.devices.allow: c 195:* rwm
lxc.cgroup.devices.allow: c 243:* rwm

nano /var/snap/lxd/common/lxd/logs/nvidia-test/lxc.conf
        

# Pass through device files
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none ind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file

在我启动的 lxc 容器中 (ol8)

#installed nvidia-driver that comes with nvidia-smi
    nvidia-driver-cuda-3:460.32.03-1.el8.x86_64
    
#installed cuda
    cuda-11-2-11.2.2-1.x86_64

当我去 运行 nvidia-smi

[root@nvidia-test ~]# nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

因为我无法编辑被认为手动复制 nvidia 内核模块文件并对其进行 insmod 的 snapd 模块文件(使用 modprobe --show-depends 确定)

[root@nvidia-test ~]# insmod nvidia.ko.xz NVreg_DynamicPowerManagement=0x02
insmod: ERROR: could not insert module nvidia.ko.xz: Function not implemented

我容器中的一些诊断信息

[root@nvidia-test ~]# find /sys | grep dmar
find: '/sys/kernel/debug': Permission denied
find: '/sys/fs/pstore': Permission denied
find: '/sys/fs/fuse/connections/59': Permission denied
[root@nvidia-test ~]# lspci | grep -i nvidia
05:00.0 VGA compatible controller: NVIDIA Corporation GP107GL [Quadro P1000] (rev a1)
05:00.1 Audio device: NVIDIA Corporation GP107GL High Definition Audio Controller (rev a1)

所以...还有什么我应该做的吗?我应该删除 snapd lxd 并使用 OL8 提供的默认 lxc 吗?

找到答案

#https://ubuntu.com/blog/nvidia-cuda-inside-a-lxd-container

lxc config device add cuda gpu gpu

您可以通过创建 LXD gpu 设备将 GPU 直通用于 LXD 容器。这个 gpu 设备将共同完成所有必要的任务,将 GPU 暴露给容器,包括您在上面明确进行的配置。

这里是所有额外参数的文档(比如GPU不止一个,怎么区分), https://linuxcontainers.org/lxd/docs/master/instances#type-gpu

在最简单的形式中,您可以 运行 向现有容器添加默认 GPU(到容器)。

lxc config device add mycontainer mynvidia gpu

在NVidia 容器中添加GPU 时,还需要将相应的NVidia 运行time 添加到容器中(以便与主机上的内核版本相匹配!)。在容器中,我们不需要(也不能)添加内核驱动程序,但我们需要添加 运行time(库、实用程序和其他软件)。 LXD 会处理这个问题并为您下载适当版本的 NVidia 容器 运行time 并将其附加到容器。这是一个完整的示例,它在启用 NVidia 运行 时间的同时创建一个容器,然后将 NVidia GPU 设备添加到该容器。

$ lxc launch ubuntu: mycontainer -c nvidia.runtime=true -c nvidia.driver.capabilities=all
Creating mycontainer
Starting mycontainer
$ lxc config device add mycontainer mynvidia gpu
Device mynvidia added to mycontainer
$ lxc shell mycontainer
root@mycontainer:~# nvidia-smi 
Mon Mar 15 13:37:24 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.102.04   Driver Version: 450.102.04   CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
...
$ 

如果您经常创建此类 GPU 容器,则可以使用 GPU 配置创建 LXD 配置文件。然后,如果您想要一个 GPU 容器,您可以使用 nvidia 配置文件启动容器,或者您可以 nvidia 配置文件应用于现有容器,从而让它们成为 GPU 容器!

$ cat mynvidiaLXDprofile.txt
config:
  nvidia.driver.capabilities: all
  nvidia.runtime: "true"
description: ""
devices:
  mygpu:
    type: gpu
name: nvidia
used_by: []
$ lxc profile create nvidia
Profile nvidia created
$ lxc profile edit nvidia < mynvidiaLXDprofile.txt
$ lxc launch ubuntu:20.04 mycontainer --profile default --profile nvidia
Creating mycontainer
Starting mycontainer
$ 

以上说明我们一直在使用LXD的snap包