![是否可以在 Ubuntu 20.04 上为两个不同的 nvidia GPU 安装不同的驱动程序?](https://linux22.com/image/1206685/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%20Ubuntu%2020.04%20%E4%B8%8A%E4%B8%BA%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%20nvidia%20GPU%20%E5%AE%89%E8%A3%85%E4%B8%8D%E5%90%8C%E7%9A%84%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F%EF%BC%9F.png)
我的 ubuntu 设备中有一台 Geforce GTX 470 已经有一段时间了。我无法让它与 CUDA 一起工作,因为显然nvidia 放弃了对旧款 Fermi 显卡的支持。请注意,我尝试卸载/重新安装各种驱动程序选项,但无法使用nvidia-驱动程序-460适用于 GTX 470。唯一能正常工作的 NVIDIA 驱动程序是nvidia-驱动程序-390,但即使有了这个驱动程序,显然也没有 CUDA。这是 nvidia-smi 的输出前我把GTX 1050放进机器里。
$ nvidia-smi
Mon Apr 12 10:15:04 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.141 Driver Version: 390.141 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 470 Off | 00000000:02:00.0 N/A | N/A |
| 40% 58C P0 N/A / N/A | 506MiB / 1216MiB | N/A Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 Not Supported |
+-----------------------------------------------------------------------------+
所以我购买并安装了 GeForce GTX 1050 Ti。经过安装驱动程序和 nvidia-cuda-toolkit 的努力,我现在将这张 GTX 1050 卡用作显示器,它也可以与 Blender 正常工作,大大加快了渲染操作。不幸的是,仍在计算机中的 GTX 470 似乎无法使用,并且 nvidia-smi 不再识别该卡。该命令甚至不识别 GTX 470,只列出 GTX 1050:
$ nvidia-smi -L
GPU 0: GeForce GTX 1050 Ti (UUID: GPU-89930378-de2a-cf96-b00a-693446ccda2c)
我无法使用“软件和更新”窗口的“附加驱动程序”选项卡更改 GTX 470 使用的驱动程序。单选按钮卡在继续使用手动安装的驱动程序并且无法改变:
但是,GTX 1050 似乎与 nvidia-driver-460 配合得很好:
$ nvidia-smi
Fri Apr 16 15:16:52 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.67 Driver Version: 460.67 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 105... Off | 00000000:01:00.0 On | N/A |
| 30% 34C P5 N/A / 75W | 536MiB / 4032MiB | 5% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1597 G /usr/lib/xorg/Xorg 35MiB |
| 0 N/A N/A 2416 G /usr/lib/xorg/Xorg 259MiB |
| 0 N/A N/A 2543 G /usr/bin/gnome-shell 140MiB |
| 0 N/A N/A 3960 G /usr/lib/firefox/firefox 1MiB |
| 0 N/A N/A 4126 G /usr/lib/firefox/firefox 1MiB |
| 0 N/A N/A 4133 G /usr/lib/firefox/firefox 1MiB |
| 0 N/A N/A 4150 G /usr/lib/firefox/firefox 1MiB |
| 0 N/A N/A 26149 G blender 79MiB |
| 0 N/A N/A 26833 G /usr/lib/firefox/firefox 1MiB |
| 0 N/A N/A 32571 G /usr/lib/firefox/firefox 1MiB |
+-----------------------------------------------------------------------------+
奇怪的是,那里报告的 CUDA 版本(11.2)与报告的 CUDA 版本不匹配nvcc(10.1.243):
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243
尽管 CUDA 版本不匹配,但我对 GTX 1050 的表现还是很满意的。它似乎充分利用了 PCI-E 3 的 8GT/s 速度,大大提高了我的搅拌机渲染速度。
我有几个问题:
是否可以安装不同的相应显卡的驱动程序?GTX 470 无法与nvidia-驱动程序-460它始终与 nvidia-cuda-toolkit 一起安装,并且似乎与 GTX 1050 和 Blender 配合得很好。使用X.org X 服务器对于 GTX 470,我可以管理这样的事情吗?
我应该尝试更新/升级吗nvcc升级到 CUDA 11.2?我担心我可能会破坏某些东西,并且想知道这样做是否有任何好处。我最多担心搅拌机不再识别该卡。
是否还值得在机器中保留 GTX 470?虽然我怀疑我能否让 GTX 470 帮助进行 Blender 渲染,但它可能能够处理 Ubuntu 的显示相关任务,从而让 GTX 1050 将所有精力集中在我的 Blender 渲染上。
如果我安装一个第二GTX 1050 Ti 能否进一步提高 Blender 的速度?
编辑:一些额外的信息。一些输出从sudo dmesg
:
[ 3.032920] nvidia: loading out-of-tree module taints kernel.
[ 3.032926] nvidia: module license 'NVIDIA' taints kernel.
[ 3.032926] Disabling lock debugging due to kernel taint
[ 3.033029] RAPL PMU: API unit is 2^-32 Joules, 2 fixed counters, 163840 ms ovfl timer
[ 3.033030] RAPL PMU: hw unit of domain pp0-core 2^-16 Joules
[ 3.033030] RAPL PMU: hw unit of domain package 2^-16 Joules
[ 3.050459] nvidia-nvlink: Nvlink Core is being initialized, major device number 238
[ 3.050773] NVRM: The NVIDIA GeForce GTX 470 GPU installed in this system is
NVRM: supported through the NVIDIA 390.xx Legacy drivers. Please
NVRM: visit http://www.nvidia.com/object/unix.html for more
NVRM: information. The 460.67 NVIDIA driver will ignore
NVRM: this GPU. Continuing probe...
[ 3.050895] nvidia 0000:01:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=io+mem
[ 3.154354] cryptd: max_cpu_qlen set to 1000
[ 3.166652] NVRM: ignoring the legacy GPU 0000:02:00.0
[ 3.166677] nvidia: probe of 0000:02:00.0 failed with error -1
[ 3.166697] NVRM: loading NVIDIA UNIX x86_64 Kernel Module 460.67 Thu Mar 11 00:11:45 UTC 2021
[ 3.324880] AVX version of gcm_enc/dec engaged.
[ 3.324880] AES CTR mode by8 optimization enabled
[ 3.352802] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms 460.67 Thu Mar 11 00:03:18 UTC 2021
输出sudo lshw -C video
:
$ sudo lshw -C video
[sudo] password for sneakyimp:
*-display
description: VGA compatible controller
product: GP107 [GeForce GTX 1050 Ti]
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:01:00.0
version: a1
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
configuration: driver=nvidia latency=0
resources: irq:59 memory:f9000000-f9ffffff memory:b0000000-bfffffff memory:c0000000-c1ffffff ioport:e000(size=128) memory:c0000-dffff
*-display UNCLAIMED
description: VGA compatible controller
product: GF100 [GeForce GTX 470]
vendor: NVIDIA Corporation
physical id: 0
bus info: pci@0000:02:00.0
version: a3
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress vga_controller cap_list
configuration: latency=0
resources: memory:f6000000-f7ffffff memory:c8000000-cfffffff memory:d0000000-d3ffffff ioport:d000(size=128) memory:f8000000-f807ffff
并ubuntu-drivers devices
表明旧的 470 正在尝试使用 nvidia-driver-340,该驱动程序非常旧:
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0 ==
modalias : pci:v000010DEd000006CDsv00001043sd00008342bc03sc00i00
vendor : NVIDIA Corporation
model : GF100 [GeForce GTX 470]
manual_install: True
driver : nvidia-340 - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin
== /sys/devices/pci0000:00/0000:00:02.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001C82sv00001043sd0000862Abc03sc00i00
vendor : NVIDIA Corporation
model : GP107 [GeForce GTX 1050 Ti]
driver : nvidia-driver-390 - distro non-free
driver : nvidia-driver-418-server - distro non-free
driver : nvidia-driver-460-server - distro non-free
driver : nvidia-driver-450 - distro non-free
driver : nvidia-driver-460 - third-party non-free recommended
driver : nvidia-driver-450-server - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin
答案1
我使用略有不同的硬件进行了一些实验:TESLA M40 24GB 和 Quadro FX380。“新”驱动程序支持带有 CUDA、nvidia-smi 等的 TESLA,但不支持 quadro(例如您的 GTX 470,旧驱动程序支持它)。您不能混合使用不同版本的 nvidia 专有产品。这就是我们使用开源驱动程序的原因。nouveau 驱动程序支持您/我的旧版 GPU。我使用较新的 GPU 来加速带有 CUDA 的 ML 内容。我使用旧 GPU 来支持显示、观看视频等,因此 Tesla 的视频内存未受影响。
要加载“新”驱动程序(您的 GTX 1050),必须将 nouveau 列入黑名单。在我的 Ubuntu 20.04 上,它是在文件中完成的: /lib/modprobe.d/nvidia-graphics-drivers.conf 最初它包含:
blacklist nouveau
blacklist lbm-nouveau
alias nouveau off
alias lbm-nouveau off
我只留下了未注释的内容:
blacklist nouveau
行。我们不应该更改别名,因为我们需要针对旧版 GPU 的 nouveau。
然后,您可以通过为旧版 GPU 加载 nouveau 来获得正确的模式设置。我设置了 cron 守护进程来帮我执行此操作。在 /etc/crontab 文件中,我添加了以下行:
@reboot root /sbin/modprobe nouveau
这将加载“黑名单”的 nouveau 驱动程序后nvidia 驱动程序已加载。这将启用旧卡上的加速功能,并且新卡已设置好。就我而言,这是有道理的,因为 TESLA 没有视频输出。就您而言,这可能没那么重要。
但是,您的旧版 GPU 上将无法使用 CUDA - nouveau 是善意人士的开源努力,而专有驱动程序则带来专有技术 (CUDA)。而且供应商可能随时放弃对您的硬件的支持。这就是为什么专有和封闭的东西通常是不受欢迎的。