How to install CUDA 9.2 on Ubuntu 18.04

If you are wanting to use Ubuntu 18.04 and also want a CUDA install this post should help you get that working.

I was surprised when NVIDIA did not include an installer for Ubuntu 18.04 when they launched CUDA 9.2. The new Ubuntu had been out for a while and it seemed like “everybody” already had support it. It was working with Docker, NVIDIA-Docker, TensorFlow, Virtualbox, Anaconda Python, etc.. I hadn’t found anything that was not working fine. It’s not that much different, at a system level, from Ubuntu 17.10 or Fedora-23 which are both supported for CUDA 9.2. I’m still not sure exactly why they don’t have an installer link for it but after doing my own install I have some suspicions of where the they may have run into trouble with Ubuntu 18.04. However, …

… I didn’t have any serious problems installing CUDA 9.2 on Ubuntu 18.04! I did it using the “.run” file for Ubuntu 17.10 together with the GeForce runtime driver rather than the Tesla driver that comes with the CUDA 9.2 install.

In my recent post The Best Way To Install Ubuntu 18.04 with NVIDIA Drivers and any Desktop Flavor I went through how I’ve been doing installs for the latest Ubuntu. If you are thinking about installing 18.04 you might want to look at that post especially if you have had any trouble with the install. I usually include a CUDA install when I do a post like that but in that one I decided to look at it separately since NVIDIA had not released an official installer for it. Well, this is the post where I do the (unofficial) CUDA install.

Disclaimer: What follows is my own personal hack to get CUDA installed and running on Ubuntu 18.04. It is not supported by anyone, not even me!

Steps to install CUDA 9.2 on Ubuntu 18.04

Step 1) Get Ubuntu 18.04 installed!

Fortunately, this “shouldn’t” be too hard. See my recent post on doing that.

Step 2) Get the “right” NVIDIA driver installed

If you followed my instructions for installing Ubuntu 18.04 you would have installed the driver nvidia-390 from the graphics-drivers ppa. That is the current “long term” driver and it supports cards up-to and including Titan V. However if you jumped ahead and did the CUDA toolkit install like I describe in later steps you would compile the deviceQuery code and run it and see a message like,

kinghorn@u18:~/projects/samples/1_Utilities/deviceQuery$ ./deviceQuery
./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL

That is a run-time version miss-match! The NVIDIA display drivers come with a CUDA runtime library. That’s so you can run CUDA accelerated programs without having CUDA installed on your system. That’s usually just what you want. But, If you are doing CUDA dev work you need to have your run-time and development libraries in sync! The nvidia-390 driver is not recent enough for CUDA 9.2.

The CUDA installers contain a display driver. For CUDA 9.2 that driver is currently version 396.26. That is the Tesla driver! [ If you go to the NVIDIA driver download page and select “Product Type:” Tesla you will get to the 396.26 driver. ] The equivalent driver for GeForce or Titan is 396.24. That’s the one that you want. 396.24 is the current “short term” driver and it is available on the graphics-drivers ppa. However, …

Ubuntu 18.04 quirk: You can’t install nvidia-396 from the graphics drivers ppa using apt-get!

I don’t understand why but, if you have the graphics-drivers ppa configured for apt and try to install nvidia-396 you will get a “package not found” error even though you can go to the ppa page and see the deb file sitting there for 18.04. apt-get will only “see” up-to version nvidia-390 from the ppa. This is an unsolved puzzle for me.

Work-around: use the “Software & Updates” “Additional Drivers” GUI

Software Update GUI

The Software & Updates utility does list the nvidia-396 driver. Go ahead and select that and “Apply” it. Reboot and you will be running the needed 396.24 driver.

Step 3) Install CUDA “dependencies”

There are a few dependencies that get installed when you run the CUDA deb file but, since we are not going to use the deb file, you will want to install them separately. It’s simple since we can get what’s needed with just four package installs,

sudo apt-get install freeglut3 freeglut3-dev libxi-dev libxmu-dev

Those packages will get the needed GL, GLU, Xi, Xmu libs and several other libraries that will be installed as dependencies from those.

step 4) Get the CUDA “run” file installer

Go to the CUDA Zone and click the Download Now button. Then click the link buttons until you get the following,

CUDA download

Download both of both of those.

Step 4) Run the “runfile” to install the CUDA toolkit and samples

This is where we get the CUDA developer toolkit and samples onto the system. Just use sh to run the shell script (runfile),

sudo sh

You will be asked several questions. Here are my answers, (after accepting the EULA),

You are attempting to install on an unsupported configuration. Do you wish to continue?
(y)es/(n)o [ default is no ]: y

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 396.26?
(y)es/(n)o/(q)uit: n

Install the CUDA 9.2 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
 [ default is /usr/local/cuda-9.2 ]:

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: y

Install the CUDA 9.2 Samples?
(y)es/(n)o/(q)uit: y

Enter CUDA Samples Location
 [ default is /home/kinghorn ]: /usr/local/cuda-9.2

The most important part of those answers was saying “No” to installing the Driver. The default is “yes”.

Step 5) Install the cuBLAS patch

The runfile for the cuBLAS patch just copies the fixed version into the CUDA install directory.

sudo sh

Step 6) Setup your environment variables

There are two good ways to setup your environment variables so you can use CUDA.

  • Setup system environment
  • Setup user environment

In the past I have usually been doing installs for any number of users on a system so I would do system-wide environment configuration. You can do this even for a single user workstation but you might prefer to just create a couple of small scripts that set things up just for the terminal you are working in when you need it.

System-wide alternative

  • To configure the CUDA environment for all users (and applications) on your system create the file (use sudo and a text editor of your choice)

    with the following content,

    export PATH=$PATH:/usr/local/cuda/bin
    export CUDADIR=/usr/local/cuda

    Also create the file,


    and add the line,


    Then run

    sudo ldconfig

The next time you login your shells will start with CUDA on your path and be ready to use. If you want to load that environment in a shell right now without logging out then just do, source /etc/profile.d/

User per terminal alternative

If you want to be able to activate your CUDA environment only when and where you need it then this is the way to do it. You might prefer this method over a system-wide environment.

  • For a localized user CUDA environment create the following simple script. You don’t need to use sudo for this and you can keep the script anywhere in your home directory. You will just need to “source” it when you want a CUDA dev environment.

I’ll create the file with the name cuda9.2-env. Add the following lines to this file,

export PATH=$PATH:/usr/local/cuda-9.2/bin
export CUDADIR=/usr/local/cuda-9.2
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-9.2/lib64

Note: I explicitly used the full named path to version 9.2 i.e /usr/local/cuda-9.2 rather than to the symbolic link /usr/local/cuda. You can use the symbolic link path if you want. I just did this in case I want to install another version of CUDA and make another environment script pointing to the different version.

Now when you want your CUDA dev environment just do source cuda9.2-env. That will set those environment variables in your current shell. (you could copy that file to your working directory or else give the full path to it when you use the source command.)

Step 7) Test CUDA by building the “samples”

Let’s make sure everything is working correctly. Copy the CUDA samples source directory to someplace in your home directory

mkdir cuda-testing

source cuda-9.2-env

cp -a /usr/local/cuda/samples  cuda-testing/

cd cuda-testing/samples

make -j4

Running that make command will compile and link all of the source examples as specified in the Makefile. ( the -j4 just means run 4 “jobs” make can build objects in parallel so you can speed up the build time by using more processes. The systems I was testing this on had 4 CPU cores.)

After everything finishes building you can cd to bin/x86_64/linux/release/ and see all of the sample executables. I had 165 programs built without error. I believe that is the entire sample set. I ran several of the programs and they were working as expected including the one that were using OpenGL graphics.

Just because the samples built OK doesn’t mean that there are not any problems with the install but it is a really good indication that you can proceed with confidence for your development work!

I hope this post helps you with your CUDA projects!

I want to finish by saying that I personally am starting to use Docker containers when I need something like a CUDA dev environment. I did that for building TensorFlow from source a few weeks ago. I have written a series of posts on using Docker on your workstation (along with lots of other stuff!) which you can find on the Puget Systems HPC blog.

Happy computing! –dbk