在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主要包含三部分内容:
- NVIDIA驱动程序(跟我们用
apt
装的,.run
文件装的没啥区别) - CUDA SDK(NVCC,编译器,库文件,示例程序等)
- 其他工具(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 | incus config set gpu-test nvidia.runtime=true nvidia.driver.capabilities=all |
到现在,启动容器,在/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 | channels: |
现在似乎就可以用Micromamba创建环境并安装包了。
报错
Critical libmamba: No CA certificates found on system, aborting
1 | sudo apt install ca-certificates |
Error libmamba: ZSTD decompression error: Unknown frame descriptor
尝试换一个镜像源。