Z racji zakupu nowego laptopa, byłem zmuszony od nowa zainstalować TensorFlow, moje ostatnie doświadczenie były raczej trudne, lecz obecna wersja biblioteki jest już dojrzalsza, to samo można powiedzieć o sterownikach od NVidia. Ostatecznie wszystko przebiegło bardzo sprawnie.
W instrukcji dowiesz się jak zainstalować TensorFlow r0.12 z CUDA Toolkit 8.0 na ubuntu 16.04, można to traktować jako zaktualizowaną wersję poprzedniego wpisu, no może bez takiego dramatyzmu jak ostatnio (https://ksopyla.com/2016/07/instalacja-tensorflow-0-9-cuda-7-5-na-ubuntu-16-04/). Całość instaluję na laptopie Dell Vostro 5486 z dwoma kartami graficznymi wbudowaną Intel HD 620 oraz dedykowaną NVidia Geforce 940MX.
Krok pierwszy – Instalacja sterowników do NVDIA 375.20
$ sudo add-apt-repository ppa:graphics-drivers/ppa $ sudo apt-get update #Install the recommended driver (currently nvidia-375.20) $ sudo ubuntu-drivers autoinstall $ sudo reboot
Z racji tego, że instalacja przebiegała na laptopie z dwoma kartami, instalując sterowniki do karty musiałem pozwolić na „Insecure boot”. Po pierwszym restarcie nie uruchomiło mi się Unity w Ubuntu, lecz po kolejnych wszystko było już ok. Po instalacji sterowników należy sprawdzić jaką kartę mamy w danym momencie wybraną, czy wbudowaną czy GeForce, do szczegółów odsyłam do dwóch wpisów:
- https://www.linuxbabe.com/desktop-linux/switch-intel-nvidia-graphics-card-ubuntu
- http://ubuntuhandbook.org/index.php/2016/04/switch-intel-nvidia-graphics-ubuntu-16-04/
Po instalacji powinniśmy móc przełączać się pomiędzy kartami z wykorzystaniem poleceń:
prime-select query sudo prime-select intel # lub sudo prime-select nvidia
Po instalacji powinniśmy mieć zainstalowane narzędzie nvidia-smi
ksopyla@mars:~/Downloads$ nvidia-smi Mon Dec 5 21:58:56 2016 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 375.20 Driver Version: 375.20 | |-------------------------------+----------------------+----------------------+ | 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 940MX Off | 0000:01:00.0 Off | N/A | | N/A 53C P5 N/A / N/A | 364MiB / 4075MiB | 6% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 1015 G /usr/lib/xorg/Xorg 213MiB | | 0 1918 G compiz 48MiB | | 0 2527 G ...d/OmniboxBundledExperimentV1/StandardR7/P 102MiB | +-----------------------------------------------------------------------------+
Krok drugi – Instalacja CUDA Toolkit
Ściągamy CUDA Toolkit 8, na stronie NVidia wybieramy kolejno:
- system – Linux
- architekture – x86_64
- dystrybucję – Ubuntu
- wersję – 16.04
- typ instalatora – runfile(local) – Uwaga plik zajmuje ~1.5GB.
Nadajemy uprawnienia do wykonywania i uruchamiamy z konsoli
./cuda_8.0.44_linux.run
W trakcie instalacji na ekranie zostaniemy zapytani o następujące informacje:
- Do you accept the previously read EULA?
accept - Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 367.48?
n (sterowniki mamy zainstalowane już wcześniej) - Install the CUDA 8.0 Toolkit?
y - Enter Toolkit Location:
/usr/local/cuda-8.0 (enter) - Do you wish to run the installation with 'sudo’?
y - Do you want to install a symbolic link at /usr/local/cuda?
y (ułatwi to nam późniejszą konfigurację) - Install the CUDA 8.0 Samples?
y (ja dałem yes, lecz to czy chcesz mieć przykłady zależy od ciebie i wielkości twojego dysku) - Enter CUDA Samples Location:
enter (domyślnie w katalogu domowym użytkownika)
Po kilku minutach w konsoli otrzymamy takie podsumowanie, nie przejmujcie się warningiem:
=========== = Summary = =========== Driver: Not Selected Toolkit: Installed in /usr/local/cuda-8.0 Samples: Installed in /home/ksopyla, but missing recommended libraries Please make sure that - PATH includes /usr/local/cuda-8.0/bin - LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA. ***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work. To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file: sudo <CudaInstaller>.run -silent -driver Logfile is /tmp/cuda_install_13647.log
Krok trzeci – cuDNN
Tensorflow wymaga biblioteki cuDNN v5 (https://developer.nvidia.com/cudnn), aby ją ściągnąć należy się zarejestrować i zalogować do NVidia developer. Ja ściągnąłem
#rozpakowujemy ksopyla@mars:~/Downloads$ tar -zxvf cudnn-8.0-linux-x64-v5.1.tgz cuda/include/cudnn.h cuda/lib64/libcudnn.so cuda/lib64/libcudnn.so.5 cuda/lib64/libcudnn.so.5.1.5 cuda/lib64/libcudnn_static.a
Następnie kopiujemy pliki do /usr/local/cuda
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
Krok czwarty – instalacja TensorFlow w virtualenv
$ sudo apt install python3-pip $ sudo apt install python3-venv $ python3 -m venv tfenv # Ubuntu/Linux 64-bit, GPU enabled, Python 3.5 # Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below. $ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc0-cp35-cp35m-linux_x86_64.whl (tfenv)$ pip3 install --upgrade $TF_BINARY_URL
Na koniec aby wszystko przetestować, uruchomiłem prosty skrypt
#vim test_tf.py import tensorflow as tf tf_session = tf.Session() x = tf.constant(1) y = tf.constant(1) print(tf_session.run(x + y))
W wyniku powinniśmy zobaczyć:
(tfenv) ksopyla@mars:~/dev$ python test_tf.py I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:936] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero I tensorflow/core/common_runtime/gpu/gpu_device.cc:885] Found device 0 with properties: name: GeForce 940MX major: 5 minor: 0 memoryClockRate (GHz) 1.189 pciBusID 0000:01:00.0 Total memory: 3.98GiB Free memory: 3.59GiB I tensorflow/core/common_runtime/gpu/gpu_device.cc:906] DMA: 0 I tensorflow/core/common_runtime/gpu/gpu_device.cc:916] 0: Y I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce 940MX, pci bus id: 0000:01:00.0) 2
Dwójka na samym końcu jest wynikiem naszego skryptu. Ważne aby udało się załadować wszystkie biblioteki CUDA.
Dzięki za tutorial, przydał się i działa 🙂
Warto tylko jeszcze napisać na końcu o eksporcie dwóch zmiennych (bez tego u mnie python nie wiedział gdzie szukać cuda):
export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64″
export CUDA_HOME=/usr/local/cuda
Tak @KUBA, masz rację. Czasami zmienne nie są ustawione i tensorflow nie odnajduje bibliotek do CUDA.