多GPU训练怎么终止 多gpu已禁用怎么开启_3D


关于Bumblebee,见这里:Bumblebee - ArchWiki

(中文版:Bumblebee (简体中文) ,但是中文版比较旧了,特别是关于HDMI输出那一段,还是建议参考上面英文版的为主)

对于Intel核显&NVIDIA独显的笔记本(甚至台式机),配置好bumblebee后,可以使用optirun来在独立显卡上运行程序,然后在核心显卡上输出,这样对于笔记本这种功耗敏感的设备,可以在不需要的时候关闭独显,达到节约能源的目的。不像NVIDIA官方驱动的prime-select,即完全切换显卡,要么用核显要么用独显,还需要重启xserver(且切换到核显的时候CUDA还不可用,独显似乎处于完全禁用状态)。而且bumblebee还有一个好处就是,就是在用核显渲染桌面的时候可以使用独显跑CUDA,互不影响(以前用官方的prime切独显跑CUDA的时候整个桌面卡得一逼,别说看视频刷网页,拖窗口都卡死)。

bumblebee的原理大致是在独显开启一个独立的xserver,然后在这个xserver上用一个看不见的VirtualGL或primus渲染程序,再传输到位于核显的xserver的xclient程序上显示。

(以上原理是我基于现象瞎猜的,因为我简单翻了下bumblebee和archlinux的wiki并没有找到相关原理的解释,如有错误欢迎纠正)

在bumblebee的xserver接管NVIDIA显卡后,原xserver并不能在独显上显示了,对于VGA/HDMI/DP接口连接到独显的双显卡笔记本来说,此时接口就没有任何信号输出了。因此开启独显的HDMI输出的思路就是把核显的画面输出到独显的xserver上。

bumblebee有个工具提供了这个功能:intel-virtual-output

当然如果直接运行,应该会报错 No VIRTUAL outputs on ":0"

需要新建配置文件 /etc/X11/xorg.conf.d/20-intel.conf


Section "Device"
    Identifier    "Intel Graphics"
    Driver        "intel"
    Option "VirtualHeads" "2"
EndSection


(最重要的是这条Option "VirtualHeads" "2",即在Intel核显上开启虚拟显示器)

如果还是No VIRTUAL outputs on ":0",可尝试将此配置文件写到/usr/share/X11/xorg.conf.d/20-intel.conf,反之亦然。

好了接下来要开启独显的HDMI输出了(此时用optirun运行程序,虽然独显的xserver启动了但HDMI是没有输出的)

/etc/bumblebee/xorg.conf.nvidia

在Section "Device"段


Option "NoLogo" "true"
    Option "UseEDID" "true"
    #Option "UseDisplayDevice" "none"
    Option "AllowEmptyInitialConfiguration"
    #Option "ConnectedMonitor" "DFP"


在Section "ServerLayout"段


Option      "AutoAddDevices" "true"
    Option      "AutoAddGPU" "false"


(如果还是不行,可以尝试把Option "ConnectedMonitor" "DFP"这条打开,可以强制让系统认为你连接了一个显示器,如果工作正常建立注释掉,否则拔出HDMI后这个显示器还存在,显示设置不会自动恢复)

以下是我整个xorg.conf.nvidia内容,不建议完全复制,还是按自己的情况来修改,免得翻车:


Section "ServerLayout"
    Identifier  "Layout0"
    Option      "AutoAddDevices" "true"
    Option      "AutoAddGPU" "false"
EndSection

Section "Device"
    Identifier  "DiscreteNvidia"
    Driver      "nvidia"
    BusID       "PCI:01:00:0"
    VendorName  "NVIDIA Corporation"

#   If the X server does not automatically detect your VGA device,
#   you can manually set it here.
#   To get the BusID prop, run `lspci | egrep 'VGA|3D'` and input the data
#   as you see in the commented example.
#   This Setting may be needed in some platforms with more than one
#   nvidia card, which may confuse the proprietary driver (e.g.,
#   trying to take ownership of the wrong device). Also needed on Ubuntu 13.04.
#   BusID "PCI:01:00:0"

#   Setting ProbeAllGpus to false prevents the new proprietary driver
#   instance spawned to try to control the integrated graphics card,
#   which is already being managed outside bumblebee.
#   This option doesn't hurt and it is required on platforms running
#   more than one nvidia graphics card with the proprietary driver.
#   (E.g. Macbook Pro pre-2010 with nVidia 9400M + 9600M GT).
#   If this option is not set, the new Xorg may blacken the screen and
#   render it unusable (unless you have some way to run killall Xorg).
    Option "ProbeAllGpus" "false"

    Option "NoLogo" "true"
    Option "UseEDID" "true"
    #Option "UseDisplayDevice" "none"
    Option "AllowEmptyInitialConfiguration"
    #Option "ConnectedMonitor" "DFP"
EndSection

Section "Screen"
    Identifier "Default Screen"
    Device "DiscreteNvidia"
EndSection


Bumblebee配置 /etc/bumblebee/bumblebee.conf


KeepUnusedXServer=true


(这个是在bumblebee中没有程序运行时还保持着独显的xserver开启)


PMMethod=none


(官方建议把电源管理关掉,但是我PMMethod=bbswitch开着好像也没事?)

(反正我不关(逃

好了此时把显示器连接到独显上的HDMI/VGA/DP接口,

此时可以先试试optirun一个程序,看看HDMI接口有没有反应(正常输出黑屏)。

如果报错 error: [XORG] (EE) Failed to load module "mouse"


sudo apt install xserver-xorg-input-mouse


(对了,此时export DISPLAY=:8可以直接在这个黑屏的xserver上运行程序,嘿嘿(抖个机灵

(Emmm不过此时这个外屏上的xserver的输入非常诡异,和主xserver共享键盘鼠标,同时反应Emmmmmm自己脑补/体会

运行intel-virtual-output(其实没必要optirun也没必要sudo),如果正常外部显示器会有输出,并且在当前xserver能识别到第二个显示器(比如用GNOME,可以在设置里面配置显示设置啦,比如是镜像还是扩展)


多GPU训练怎么终止 多gpu已禁用怎么开启_配置文件_02

扩展模式笔记本内屏


多GPU训练怎么终止 多gpu已禁用怎么开启_CUDA_03

扩展模式外屏(Emmm这是个很老很经典的CRT显示器,三星788DF,手上没有其它显示器来测试了,只好HDMI转VGA干他)

——————我是分割线——————

下面介绍个骚操作,可以通过export DISPLAY=:8(独显上的xserver是:8)来使程序直接运行在独显上:

开!始!表!演!

首先现在两块显示屏是镜像模式,然后在:8上跑glxgears,可以看到笔记本内屏没有反应,外屏上直接覆盖了一个窗口


多GPU训练怎么终止 多gpu已禁用怎么开启_多GPU训练怎么终止_04

连接核显的内屏没有东西

多GPU训练怎么终止 多gpu已禁用怎么开启_3D_05

说明用intel-virtual-output下输出,外部屏幕仍是个独立的xserver,且还能在上面覆盖窗口

可以用这个方法直接在独显运行性能敏感的3D程序,直接在独显输出,从玄学的角度来说可以提高性能,否则还是optirun的话...


多GPU训练怎么终止 多gpu已禁用怎么开启_配置文件_06

独显渲染-->核显输出-->独显输出......

(当然如果只需要独显我觉得最好的方法还是直接把lightdm跑在:8上了

(另外,上文提到了这个:8 xserver的输入方式很诡异.......如果真在上面玩游戏的话......不知有什么好的优化方法,各位大佬提提建议