光阴冢 赛博空间的自留地

GPU Enabled PVE Setup

本来打算装好驱动之后单纯分配账户给实验室其他同学使用,但是似乎也不是很方便,同时各个同学的环境也没办法隔离,也不能都有 sudo。所以还是想着装个 PVE 吧。

查了一圈,发现还是只有 Proxmox 满足需求。

PCI Passthrough

参照 PVE 的官方文档,主要分为以下几个步骤:

  • 如果用的是 grub,添加 grub 的内核参数,启用 IOMMU。(intel_iommu=on 或者 amd_iommu=on)注意完成后需要执行 update-grub 重新生成 grub 配置。
  • 添加开机启用的内核模块。
    vfio
    vfio_iommu_type1
    vfio_pci
    vfio_virqfd
    
  • 找到显卡对应的 Device ID,据此修改 vfio 的配置文件 /etc/modprobe.d/vfio.conf,并且在宿主机上关闭对应的驱动。
  • 修改 qemu 虚拟机配置为 ovmf ,修改机器类型为 q35。

至此,在虚拟机内部装好驱动之后,可以跑 nvidia-smi 了。然而不幸的是同时这台虚拟机的虚拟网卡也失效了。 查找了原因,有可能是在直通显卡的时候,由于只能按 IOMMU 组进行直通,而网卡在同一个 IOMMU 组内,导致网卡也被迫直通了。 根据 Archlinux Wiki 上的脚本,测试了一下该机器上的 IOMMU 组。

1
2
3
4
5
6
7
8
#!/bin/bash
shopt -s nullglob
for g in `find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V`; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

然而好像显卡和网卡并不在同一个组内。同时,此时意识到其实直通显卡对原本设想的使用场景来说并没有什么好处(直通了显卡之后,别的虚拟机显然不能使用直通后的显卡了。和直接把宿主机账户分配给各个同学无异,反而更麻烦了。),就没有进行下一步研究了,转而去探索容器化的解决方案。

LXC 容器使用宿主机显卡

较为简单,只要在宿主机上将显卡驱动起来,将对应的设备挂载到容器内部,然后在容器内部安装好相同版本的驱动的库文件即可。 总体来说,主要参考的是这篇博客

有几点需要注意:

  • nvidianvidia_uvm 两个内核模块在装好官方驱动之后不会自动启用。虽然直接在宿主机上使用显卡似乎不用很早启用这俩模块,但是在容器内部使用的时候需要将一些相关设备挂载,因此这里要干预一下。
  • LXC 设置的时候,需要同步设置 cgroup 关于挂载设备的读写权限,否则容器是没有权限使用这些设备的。
  • 在容器内使用 nvidia-smi 指令,无法列举出当前运行的所有程序。原因是目前 nvidia-smi 还不支持 PID namespace 。

这样配置好之后,将容器转化为一个模板,等需要新建的时候直接使用这个模板就能得到一个能直接在里面使用显卡的容器了。相当方便。

两个容器