I have an Intel onboard GPU and NVIDIA GPU. I am running Ubuntu 18.04.
How do I configure a dual GPU setup so that Intel onboard iGPU will drive the monitor, leaving NVIDIA GPU exclusively for Machine Learning CUDA work?
I first installed NVIDIA drivers and CUDA packages following this guide. Except, after a reboot I ended up with /usr/lib/xorg/Xorg showing up in the output of nvidia-smi. This wasn't good, since I needed to have all of NVIDIA GPU RAM available to my work.
After some research I found a solution that solved my problem:
I created /etc/X11/xorg.conf with the following content:
Section "Device"
Identifier "intel"
Driver "intel"
BusId "PCI:0:2:0"
EndSection
Section "Screen"
Identifier "intel"
Device "intel"
EndSection
(if you try to do the same, make sure to check where your GPU is. Mine was on 00:02.0 which translates to PCI:0:2:0)
% lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation Device 3e92
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 (rev a1)
After rebooting, xorg and other programs no longer appeared in the output of nvidia-smi. And I was able to use pytorch with CUDA-10.0.
Note, that I still have all the NVIDIA drivers installed, but they don't interfere.
update: for Ubuntu 20.04 some extra changes are needed for this to work. You will find the full details here.
Let me share my recipe which helped me on Razer Blade 15 laptop with Arch Linux and Gnome desktop environment.
Initially I started Gnome with Wayland session which at that time was incompatible with NVIDIA driver, so naturally I had integrated graphics adapter for display and NVIDIA GPU for deep learning. But after recent update GDM session started to fallback to Xorg with NVIDIA GPU as primary GPU. The problem was that:
I ran nvidia-smi after startup. I expected to see No running processes found, but I saw a list of Xorg processes that used my NVIDIA GPU. That means Gnome Display Manager used Xorg session with NVIDIA GPU as primary GPU.
I examined /var/log/Xorg.0.log:
(II) xfree86: Adding drm device (/dev/dri/card1)
(II) systemd-logind: got fd for /dev/dri/card1 226:1 fd 11 paused 0
(II) xfree86: Adding drm device (/dev/dri/card0)
(II) systemd-logind: got fd for /dev/dri/card0 226:0 fd 12 paused 0
(**) OutputClass "nvidia" ModulePath extended to "/usr/lib/nvidia/xorg,/usr/lib/xorg/modules,/usr/lib/xorg/modules"
(**) OutputClass "nvidia" setting /dev/dri/card1 as PrimaryGPU
(**) means that the setting had been read from config file! I found out that the config file was
/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf. I changed the config file to set
Intel integrated graphics adapter as primary GPU:
Section "OutputClass"
Identifier "intel"
MatchDriver "i915"
Driver "modesetting"
Option "PrimaryGPU" "yes" # <<<<<< add this string
EndSection
Section "OutputClass"
Identifier "nvidia"
MatchDriver "nvidia-drm"
Driver "nvidia"
Option "AllowEmptyInitialConfiguration"
# Option "PrimaryGPU" "yes" # <<<<<< comment this string
ModulePath "/usr/lib/nvidia/xorg"
ModulePath "/usr/lib/xorg/modules"
EndSection
As I don't have the reputation to comment I share here results related to the answer of
Maksym Ganenko: I tried the solution on my ubuntu 18.04 where I run gdm3 with kde-plasma or ubuntu. The file you mentioned
/usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf is on my system called /usr/share/X11/xorg.conf.d/11-nvidia-prime.conf, probably because I had nvidia-prime installed for some time. The problem with editing this file is the fact that on my installation /usr/bin/gpu-manager is generating this file when starting a new xsession and so all edits are lost. As described here avoid using nvidia card for Xorg with plasma following the advice given here gpu-manager overwrites xorg.conf the solution is to protect the generated file against changes by means of
chattr +i /usr/share/X11/xorg.conf.d/11-nvidia-prime.conf
Could be a chmod 444 would do the same thing, but I simply used the solution proposed in gpu-manager overwrites xorg.conf.
I would like to add another way in which I am currently preventing Nvidia card from handling my display. I am simply booting to gnome by selecting Wayland instead of Xorg. Since Nvidia does not support Wayland, after logging in, nvidia-smi shows no process running.
However, I can still use Nvidia for stuff like Tensorflow.
What worked for me was:
Check that both cards are enabled in the BIOS
Physically connect the monitor to the motherboard's HDMI port, leave empty the Nvidia card's ports.
Install Nvidia drivers:
ubuntu-drivers devices ###List available drivers for the current system
ubuntu-drivers install YourPickHere ###Choose from the list
apt install nvidia-compute-utils-YourSelectedVersion ###Should match the driver version
Additionally, install nvidia-container-toolkit for using CUDA with Docker.
Configure the production repository:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
Install it:
apt update
apt install nvidia-container-toolkit
Enable a hybrid card configuration:
prime-select query ###To see on which configuration are you
prime-select on-demand ####To enable both
Use prime-select on-demand not prime-select intel, the later will blacklist Nvidia for good, and won't be able to use it without reverting or using a convoluted workaround.
Create /etc/X11/xorg.conf.d/30-nvidia.conf with this content:
Section "Device"
Identifier "NvidiaOver9000" ##Name it however you want
Driver "nvidia"
BusID "PCI:1:0:0" ##See that this is the correct Bus device
Option "AllowEmptyInitialConfiguration" ##To allow the driver initialization without attaching a screen
Option "PrimaryGPU" "no"
EndSection
Use lspci | grep VGA to check the actual BusID for your GPUs.
Create /etc/X11/xorg.conf.d/20-intel.conf with this content:
Section "Device"
Identifier "IntelGraphics" ##Name it however you want
Driver "modesetting"
BusID "PCI:0:2:0" ##See that this is the correct Bus device
Option "PrimaryGPU" "yes"
EndSection
Section "Screen"
Identifier "Screen0"
Device "IntelGraphics" ##Should match Identifier above
EndSection
Weirdly, the nvidia driver is not installed on the same path as the other graphic drivers, so verify that /usr/share/X11/xorg.conf.d/10-nvidia.conf exists and that it contains ModulePath "/usr/lib/x86_64-linux-gnu/nvidia/xorg", the actual location of said driver.
Backup and delete the no-longer-needed files that will cause problems if left alone:
/etc/X11/xorg.conf ###Yes, for real.
/usr/share/X11/xorg.conf.d/11-nvidia-offload.conf
There may be extra conflicting files in your setup. If you have problems at the end, the two places to watch for are /usr/share/X11/xorg.conf.d/ and /etc/X11/xorg.conf.d/. Don't just delete everything starting with nvidia just because some random guide say so, is really not necessary.
Disable gpumanager or it will recreate 11-nvidia-offload.conf every boot. Add nogpumanager to this line in /etc/default/grub to be like this:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nogpumanager"
Update grub with update-grub and reboot.
At this point X should be running on your iGPU, nvtop and nvidia-smi should list no running processes and intel_gpu_top must show some usage.
You can still run programs with the Nvidia GPU in this way:
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 __GLX_VENDOR_LIBRARY_NAME=nvidia firefox