如何使用 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包
我在 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包