Date

Installing CUDA and related frameworks on unsupported systems can be quite the hassle. In this post I will detail my findings that eventually led to succesfully installing CUDA 9.1 and cuDNN 7.0.5 on Debian Buster using GCC 7.3.0. I also built Tensorflow 1.5 for CUDA 9.1, which required some small adjustments that I will also list.

System information

$ uname -a
Linux baas 4.14.0-3-amd64 #1 SMP Debian 4.14.17-1 (2018-02-14) x86_64 GNU/Linux

$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 760] (rev a1)

$ gcc --version
gcc (Debian 7.3.0-5) 7.3.0

Install NVIDIA driver, CUDA 9.1 and cuDNN 7.0.5

First off, download the latest NVIDIA driver for your graphics card (I downloaded 390.25). Also download CUDA 9.1 as run-file, and the cuDNN 7.0.5 tarball. I assume that you start out without any NVIDIA packages on your machine; if you do have any, you need to remove them first (sudo apt purge *nvidia*).

Boot into text mode

To avoid conflicts with X, we will first boot into text mode to install these packages. Open /etc/default/grub in your favourite editor and substitute "quiet" with "text" in the following line:

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

Also uncomment the following line:

#GRUB_TERMINAL=console

Save these changes, and run the following command to update:

$ sudo update-grub

Write down the output of the following command somewhere (we will need it later):

$ systemctl get-default

Now run:

$ sudo systemctl enable multi-user.target --force
$ sudo systemctl set-default multi-user.target
$ sudo reboot

This will boot you up into text mode.

Install the NVIDIA driver

Head to the directory where you downloaded the NVIDIA driver, and run the following (replacing the filename with the correct one):

$ chmod +x NVIDIA-installer.run
$ sudo ./NVIDIA-installer.run

This should complete succesfully after you work through the prompts.

Install CUDA

First we need to install some libraries:

$ sudo apt install libxmu-dev libxmu-headers libxmuu-dev libglu1-mesa-dev

Head to the directory where you downloaded the CUDA run-file and run the following:

$ export PERL5LIB=.
$ chmod +x cuda-installer.run
$ sudo ./cuda-installer.run --override

Answer no when asked if you want to install the NVIDIA driver; answer yes for everything else (samples are optional). The --override flag is added to circumvent any GCC version mismatching which is bound to happen.

Install cuDNN

I'm assuming you created the default /usr/local/cuda symlink in the last step. Head to the directory where you downloaded the cuDNN tarball and run the following:

$ tar xzf cudnn-tarball.tgz
$ sudo cp cuda/include/* /usr/local/cuda/include/
$ sudo cp cuda/lib64/* /usr/local/cuda/lib64/

You should now have succesfully installed CUDA and cuDNN.

Append to PATH and LD_LIBRARY_PATH

Add the following to your .bashrc:

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

Reboot into GUI

Revert the changes you made in /etc/default/grub: change "text" back to "quiet" and comment the line:

GRUB_TERMINAL=console

Now run:

$ sudo systemctl set-default <DEFAULT>

where you substitute <DEFAULT> with the output of systemctl get-default that you wrote down.

Build Tensorflow 1.5 for CUDA 9.1

Since Tensorflow 1.5 precompiled binaries are only compatible with CUDA 9.0, we will need to compile Tensorflow ourselves.

Prepare build requirements

We need to install bazel, some Python libraries and one NVIDIA package.

Bazel using binary installer

Requirements:

$ sudo apt install pkg-config zip g++ zlib1g-dev unzip python

Download the binary installer bazel-<version>-installer-linux-x86_64.sh and run it:

$ chmod +x bazel-<version>-installer-linux-x86_64.sh
$ ./bazel-<version>-installer-linux-x86_64.sh --user

This will install Bazel to $HOME/bin. Make sure that is added to your PATH variable.

Python dependencies

I used a virtual environment for this.

$ pip install numpy dev pip wheel

Alternatively, you can use Debian's packages:

$ sudo apt install python3-numpy python3-dev python3-pip python3-wheel

Install libcupti

Run the following:

$ sudo apt install libcupti-dev

Configure build

Get the Tensorflow source:

$ git clone git@github.com/tensorflow/tensorflow
$ cd tensorflow && ./configure

Answer yes when asked if you want to build Tensorflow with CUDA support. For CUDA version, enter 9.1. For cuDNN version, enter 7. For compute capability, enter whatever your graphics card is capable of.

Edit CUDA header to allow GCC > 6

Open /usr/local/cuda/include/crt/host_config.h and comment out the following line:

#error -- unsupported GNU version! gcc versions later than 6 are not supported!

This will keep the compilation from throwing an error because of GCC 7.

Compile!

Almost there! To compile Tensorflow, run from the top level of the Tensorflow source directory:

$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

Grab a cup of coffee; this takes a while. Once it's done, run:

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /path/to/package

to create a Python .whl file. You can install this file with pip in any virtual environment as follows:

$ pip install /path/to/package/tensorflow-1.5.0-cp36-cp36m-linux_x86_64.whl

The filename of the wheel file may differ for you.