在Incus容器中使用NVIDIA显卡

从某海鲜市场捡回一个P104显卡。

是的,2025年了,还在捡垃圾卡,毕竟在当前的大模型浪潮下,连退役多年的麦克斯韦架构Tesla M40 24G二手推理卡,都能从2年多前500上下的价格炒到现在的1200以上。就这,还不是每个商家都有货呢。

与此同时,曾经的垃圾佬挚爱P106-100,价格也来到了130以上的区间。有没有搞错,一两年前这玩意只需要大约一半的价钱。而P102-100价格已经来到了280附近,好吧,1080Ti的核心屏蔽一下,12G显存还是有一定可玩性的。

相较之下,捡来的这张P104-100,8G显存比P106的6G显然更有可玩性。而大约是1070水平的核心显然不能和P102比,但在我下单时只需要100出头的价格,不仅比P102便宜了一半有余,甚至还没有溢价后的P106昂贵。反正买回来是插在Linux主机上,不指望打游戏,P104似乎是省钱和好玩的平衡点。

显卡上机,暂时没有爆炸,这里记录一下如何把显卡映射到Incus容器环境里,让容器能利用显卡的方法。

不得不说,有时候捡垃圾确实能学到一些东西。或者说,捡垃圾的优点就在于,它能教会大家解决买全新产品不会遇到的问题的能力。

宿主机配置

NVIDIA驱动

显然,开源的驱动nouveau是不能用的。

常见的建议是安装英伟达官方打的.run驱动包,这当然可以,但我个人不是很喜欢这种方法。

事实上,只需要装上系统apt源里的英伟达闭源驱动,如Debian的nvidia-driver包,或者是Ubuntu的nvidia-headless-550之类,就是OK的了。

除了驱动,还要在主机上安装一个NVIDIA Container Toolkit,这个工具能自动将主机上的NVIDIA运行时及工具等挂载到容器中。

一定会有人问:要不要在主机上装CUDA Toolkit?

在Ubuntu官方提供的教程中,的确提到需要在宿主机上安装CUDA Toolkit。但根据我的实验,如果在宿主机上没有使用CUDA工具如nvcc等的需要,其实完全没必要在宿主机上装CUDA Toolkit。

实际上,根据网上的说法,CUDA Toolkit主要包含三部分内容:

  1. NVIDIA驱动程序(跟我们用apt装的,.run文件装的没啥区别)
  2. CUDA SDK(NVCC,编译器,库文件,示例程序等)
  3. 其他工具(Debugger等)

显然,后两个部分实际上,要么是静态文件,要么是运行在用户态的程序,这些程序显然遵循“在哪里使用,就在哪里安装”的方法比较好。

因此,关于CUDA的结论是:

  • 如果完全不涉及到C++ CUDA工具的编译等任务,可以完全不安装CUDA Toolkit;
  • 如果只是想在容器中使用nvidia-smi等工具,也不需要安装CUDA Toolkit,系统会自动将宿主机的nvidia-smi映射到容器中;
  • 如果需要在容器里使用NVCC等SDK工具,则需要在容器中安装CUDA Toolkit;

P104等矿卡与驱动问题

显然,P104这样的矿卡流入用户市场,并不是皮衣男想看到的。

一般来说在Windows上使用矿卡,都建议使用民间的魔改驱动。但在Linux下就比较微妙了。

官方驱动是否会限制显卡频率?

有坊间传闻说,自从535版本开始,N卡就在驱动程序层面限制了矿卡的功耗。

但就我测试的情况来看,使用Debian软件源中提供的535.216版本N卡驱动,P104在nvidia-smi工具中仍然能跑到180W的功率。

因此暂时无法确认该说法是否正确,以及该说法的适用范围。

矿卡能否使用NVENC视频解码器

另一个坊间传闻是,皮衣男还限制了矿卡上的NVENC视频编码器,要使用民间魔改驱动才能解锁NVENC。

我测试的结果是,使用ffmpeg命令无法显示出当前系统支持NVENC编码器。而在jellyfin-ffmpeg中设置使用NVENC硬件加速会报错。

因此暂时没有找到使用矿卡NVENC编码器的有效方法。

容器配置

时至今日,虚拟化GPU并将物理GPU与虚拟机共享,已经不是一件新鲜事了,从WSL到Docker,都有非常成熟且广泛的应用。

在Incus/LXD容器框架下,这一功能同样也是被支持的。然而,Incus的文档实在是语焉不详,缺少明确可复用的示例。说人话就是,官方文档看了一头雾水,没东西可以抄,最后绝知此事还是得躬行。

首先初始化一个容器:

1
incus create images:debian/12 gpu-test

指定使用显卡:

1
2
incus config set gpu-test nvidia.runtime=true nvidia.driver.capabilities=all
incus config device add gpu-test nvidia-0 gpu

到现在,启动容器,在/dev/下就可以找到N卡的设备文件了,同时也可以使用nvidia-smi等工具查看显卡信息。

值得一提的是,上面指定的NVIDIA Driver Capability,可选的值及意义如下表

Driver Capability Description
compute required for CUDA and OpenCL applications.
compat32 required for running 32-bit applications.
graphics required for running OpenGL and Vulkan applications.
utility required for using nvidia-smi and NVML.
video required for using the Video Codec SDK.
display required for leveraging X11 display.

一般来说,如果只需要运行CUDA计算等,指定为utility,compute就足够了。

附赠:Micromamba配置教程

悲报

就在这篇笔记写成之后没几天,PyTorch宣布自v2.6开始不再发布官方Conda包。如有需要,请直接安装 pip 包或者安装 conda-forge 渠道包。

好吧,除非有同时使用多个版本Python的需求,不然conda/mamba在Python生态中的应用场景就比较狭窄了。

mamba is a CLI tool to manage conda s environments.

If you already know conda, great, you already know mamba!

Mamba是一个C++编写的Conda实现,而Micromamba是Mamba的精简版,不附带base环境,只需要一个独立的可执行文件就能承担起以往Conda的职能,而且速度更快。

安装很简单,只需要前往Micromamba的Github Release下载最新的包,解压后提取其中的bin/micromamba可执行文件,放到自己的可执行文件目录下,例如~/.local/bin,然后确保将这一目录加入到PATH环境变量中,就算安装好了一半。

接着执行:

1
micromamba shell init -s bash -r ~/micromamba

这会修改~/.bashrc,配置与Micromamba相关的环境变量。如果使用的是zsh,则需要将上面的shell部分改成-s zsh

接下来我们还要配置使用的软件源。事实上,Micromamba与以往的Conda的配置文件.condarc完全兼容,如果曾经安装过Conda,其实不需要重复配置。

如果是全新安装,则可以编辑~/.mambarc,填写以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
channels:
- defaults
show_channel_urls: true
default_channels:
- https://mirrors.sustech.edu.cn/anaconda/pkgs/main
- https://mirrors.sustech.edu.cn/anaconda/pkgs/free
- https://mirrors.sustech.edu.cn/anaconda/pkgs/r
- https://mirrors.sustech.edu.cn/anaconda/pkgs/pro
- https://mirrors.sustech.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.sustech.edu.cn/anaconda/cloud
msys2: https://mirrors.sustech.edu.cn/anaconda/cloud
bioconda: https://mirrors.sustech.edu.cn/anaconda/cloud
menpo: https://mirrors.sustech.edu.cn/anaconda/cloud
pytorch: https://mirrors.sustech.edu.cn/anaconda/cloud
simpleitk: https://mirrors.sustech.edu.cn/anaconda/cloud

现在似乎就可以用Micromamba创建环境并安装包了。

报错

Critical libmamba: No CA certificates found on system, aborting

1
sudo apt install ca-certificates

Error libmamba: ZSTD decompression error: Unknown frame descriptor

尝试换一个镜像源。