在Ubuntu 16.04上,使用NVIDIA显卡来进行CUDA计算,而使用AMD显卡来进行显示。

我正在使用Ubuntu 16.04,因为我发现它对于使用卷积神经网络(CNN)更方便。安装Ubuntu的过程很顺利,直到我想在同一系统上设置两张显卡:
- NVIDIA 970 GTX - AMD R9 380
我希望只使用我的NVIDIA显卡来进行CUDA计算,以便能够充分利用其图形内存,并将AMD显卡用于图形用户界面。为此,所有显示器都将连接到这张显卡。
问题如下:
- 当我安装了nvidia和cuda 8.0驱动程序后,一切似乎都正常,但是当我安装AMD驱动程序后,无法登录到lightdm。 - 如果我将显示器插入AMD显卡上,它会显示lightdm以低图形模式运行,并且无法正常工作。 - 修改xorg.conf文件没有任何效果,因为它被gpu-manager覆盖。
我找不到任何解释如何做到这一点的教程。

请将帖子中的回答部分剪切并粘贴到下面的单独回答中。 - edwinksl
好的,我已经完成了。 - Marcus
1个回答

在开始之前,我建议安装ssh,以便在出现问题时能够远程关闭系统。要这样做,请使用以下命令:
sudo apt-get install ssh

要关闭您的系统,您需要使用另一台计算机或移动设备通过ssh连接,并使用以下命令:
sudo shutdown -r now

步骤1

首先,您必须在物理上移除AMD显卡,保留您的NVIDIA显卡并安装CUDA和NVIDIA驱动程序。您可以从这里下载CUDA:https://developer.nvidia.com/cuda-downloads

使用以下命令确保一切正常运行:

nvidia-smi

第二步
在这一点上,我们需要修改grub以便以控制台模式启动,因为我们正在处理图形卡。
使用您喜欢的编辑器(在我这里是joe)编辑默认的grub配置文件:
sudo joe /etc/default/grub

并且更改这些行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
#GRUB_TERMINAL=console

对这些人来说:
GRUB_CMDLINE_LINUX_DEFAULT="text"
GRUB_CMDLINE_LINUX="text"
GRUB_TERMINAL=console

最后,使用以下命令更新grub:
sudo update-grub

第三步

关闭您的系统并拆下NVIDIA显卡,然后插入AMD显卡。打开电脑并安装最新的AMD图形驱动程序。在我的情况下,我使用以下命令来安装驱动程序:

wget https://www2.ati.com/drivers/linux/ubuntu/amdgpu-pro-16.40-348864.tar.xz
tar -Jxvf amdgpu-pro-16.40-348864.tar.xz
cd amdgpu-pro-16.40-348864/
./amdgpu-pro-install
sudo usermod -a -G video $USER

重新启动您的计算机。现在,您可以使用以下命令启动lightdm(用户界面):
sudo service lightdm start

一切都应该按预期工作,现在您可以使用系统设置来设置您的显示器。

第四步

关闭您的系统,然后添加您的NVIDIA显卡,但不要移除AMD显卡(此时您的系统中将有两张显卡)。打开计算机并使用您的用户名登录,但不要启动LIGHTDM!

此时,gpu-manager已自动为控制台模式设置了两张显卡,并且只为lightdm设置了AMD显卡(因为我们在上一步中启动了lightdm)。如果我们此时运行lightdm,gpu-manager会搞乱一切。因此,我们现在必须完全禁用gpu-manager。为此,我们必须再次修改grub:

sudo joe /etc/default/grub

替换这些行:
GRUB_CMDLINE_LINUX_DEFAULT="text"
GRUB_CMDLINE_LINUX="text"
GRUB_TERMINAL=console

通过这些人:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nogpumanager"
GRUB_CMDLINE_LINUX=""
#GRUB_TERMINAL=console

最后使用以下命令更新 Grub:
sudo update-grub

第五步

重新启动您的系统,如果lightdm没有正确启动(出现黑屏),那么您需要按下Ctrl+F1,在控制台模式下登录,并将以下命令添加到rc.local文件中:

sudo joe /etc/rc.local

在“exit 0”之前添加这行代码:
service lightdm start

重新启动您的系统,现在应该一切正常...
在控制台中,您可以使用以下命令检查两个图形卡是否正在使用:
lspci -nnk | grep -i vga -A3 | grep 'in use'

Kernel driver in use: amdgpu
Kernel driver in use: nvidia

而且nvidia-smi应该正常工作,显示您正在使用0兆字节的内存:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26                 Driver Version: 375.26                    |
|-------------------------------+----------------------+----------------------+
| 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 970     Off  | 0000:02:00.0     Off |                  N/A |
| 30%   42C    P0    36W / 163W |      0MiB /  4036MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

我已经试了几天了,想让这个工作起来。你在Ubuntu 16.04上用的是哪个内核? - Aaron Skomra
你成功了吗? - Szymon Roziewski
首先确保两张显卡都能在Ubuntu 16.04上正常工作。尝试使用各自的驱动程序单独设置每张显卡。然后可能需要卸载ATI驱动程序,以便开始这里描述的过程。当我说单独时,意思是从计算机中移除两张显卡,然后只添加一张。 - Marcus
我不再拥有这台电脑了,所以无法告诉你内核版本。 - Marcus
哇,这就像圣杯一样! - Bent Cardan
抱歉,我在Ubuntu上是新手,第4步遇到了麻烦。请问如何打开电脑,使用我的用户名登录而不启动lightdm?除了这一步,我已经完成了所有的操作。在第3步之后,我没有登录,但我的电脑重新启动到了用户界面。我按下Ctrl+F1进行第4步,但现在陷入了一个登录循环中。我登录后,加载一段时间后又回到了登录界面。有人可以帮助我吗? - Ale
步骤2到4只能在控制台模式(运行级别3)下完成。如果步骤2中提出的方法不起作用,您可以尝试这个这个 - Marcus
对于其中一些步骤的目的我不太理解,它们似乎是多余的。我能够跳过其中几个步骤,但仍然使其正常工作。我想要提一个建议,就是在grub中不要忘记设置页面大小标志,否则你的AMD性能会受到影响。amdgpu.vm_fragment_size=9 - Joseph Persico
@Marcus 嗨,我打算在Ubuntu 18.04上尝试这个配置,使用RTX 2070(用于CUDA)和Sapphire RX 570 Nitro+ 8GB(用于显示)。如果我将我的4K显示器直接连接到RX 570而不是主板上,你之前提到的任何内容会有所改变吗?或者这是你在回答中假设的设置? - d84_n1nj4
1@d84_n1nj4 我没有在Ubuntu 18.04上尝试过,也许它可以直接运行而无需执行所有这些步骤... 如果你能分享一下你的经验就太好了。 - Marcus
1@Marcus 我会做的。应该在周一之前开始/完成。嗯,只要亚马逊发货我的缺货4K显示器就好了 >< - d84_n1nj4
2@马库斯,连接后它实际上直接起作用了 - 我不需要经过任何步骤 ^^ - d84_n1nj4
@d84_n1nj4,好消息!Ubuntu正在快速发展! - Marcus
@d84_n1nj4:我处于同样的情况。我现在有两张RTX显卡,但是我打算安装一张Radeon 4550来驱动显示器(我有三个x16插槽)。如果我没有误解你的意思,AMD的驱动程序会自动安装,并且不会影响NVIDIA的驱动程序。我说得对吗?谢谢! - MadHatter
@MadHatter没错。我直接将HDMI线连接到了AMD显卡上。第一次启动系统后,安装了所需的NVIDIA驱动程序。然后RTX 2070就能正常工作,而不会占用显示资源。 - d84_n1nj4
谢谢。我几分钟前安装了4550显卡。现在,它能够运行mesa驱动,但最高分辨率只能固定在1080p,而我的显示器是21:9比例,具备2560x1080的原生分辨率。有没有什么办法可以解决这个问题?你在18.04版本上安装了amd显卡的mesa驱动吗?再次感谢!(两张nvidia显卡在计算方面表现得非常好)。 - MadHatter