Linux как установить CUDA
Установить CUDA (Compute Unified Device Architecture) библиотеки в Linux очень легко и в тоже время сложно. Казалось бы, что тут сложного, сделай какой-нибудь apt-get install cuda или yum install cuda и система на автомате все сама установит. Действительно, во многих случаях этого достаточно, но, как говорится, есть нюансы.
Но перед этим давайте вкратце разберемся, что такое CUDA и зачем это вообще все надо.
Технологию CUDA придумали в Nvidia — это их разработка. В AMD Radeon’ах CUD’ы нет. Если грубо то видеокартах Nvidia есть вычислительные ядра (cores). Можно сказать маленькие процессоры. Эти ядра умеют считать, как и обычные процессоры CPU, но делают это немножко по другому. Если кратко, то они могут складывать несколько чисел одновременно. Поэтому получается быстро. Этих ядер в видеокарте много. Очень много. Количество nvidia cores можно подсмотреть командой: nvidia-settings -q CUDACores -t . Например в GeForce 840m (древняя дешевая ноутбучная видюха) 384 ядра. Так почему бы эти ядра задействовать не только для игр, но и для других полезных дел. Например, майнить биткоины или подбирать забытый пароль для архива (шутка).
На следующей картинке схематично изображен чип видеокарты NVidia. С блоками nvenc и nvdec мы уже разобрались в статье по ускорению конвертации видео из одного формата в другой с помощью ffmpeg. И научились использовать мощь видеокарты в ffmpeg. Теперь настала очередь CUDA ядер. Чего зря простаивают. Будем использовать их на всю катушку.
Так вот, чтобы использовать всю мощь вашей графической карты необходимо выполнение следующих условий:
- Наличие карты Nvidia (будем считать, что она уже есть);
- Установленные в системе драйвера от Nvidia (будем исходить из того, что тоже установлены);
- CUDA Toolkit, те самые библиотеки и программы, которые чаще всего для простоты называют CUDA (без Toolkit)
Вот пунктом номер 3 мы и будем заниматься в этой статье.
Все последующие шаги будут приведены для Ubuntu 18.04 (самая популярная система), но они так же подойдут и для других дистрибутивов Linux.
Предисловие
Устанавливать CUDA будем от обычного пользователя, в домашнюю папку. Я не сторонник установки в /usr/local таких вещей, которые часто приходится обновлять. Лучше поставить куда-нибудь в безопасное место, чтобы не запороть работающую систему. Например, /home/username/cuda подойдет отлично. Надоест эксперементировать с CUDA, просто удалите эту папку и все. И не надо заботиться, что какие-то зависимости нарушились в системе.
Шаг 1 — проверяем nvidia драйвер
Исходим из того, что Nvidia карточка у ва есть и nvidia драйвер установлен в систему и запущен.
lspci | grep -i nvidia 04:00.0 3D controller: NVIDIA Corporation GM108M [GeForce 840M] (rev a2)
Проверяем:
lsmod | grep -i nvidia
вывод должен быть похожим на следующий:
lsmod | grep -i nvidia nvidia_uvm 880640 0 nvidia_drm 45056 4 nvidia_modeset 1118208 2 nvidia_drm nvidia 19472384 88 nvidia_uvm,nvidia_modeset ipmi_msghandler 53248 2 ipmi_devintf,nvidia drm_kms_helper 172032 2 nvidia_drm,i915 drm 401408 7 drm_kms_helper,nvidia_drm,i915
Далее определяем версию nvidia драйвера с помощью команды modinfo:
modinfo nvidia| grep -i "^version" version: 435.21
Есть еще один способ определить версию драйвера. Для этого воспользуемся утилитой nvidia-smi:
nvidia-smi | grep -i "driver version" | NVIDIA-SMI 435.21 Driver Version: 435.21 CUDA Version: 10.1 |
Nvidia-smi так же выдала версию 435.21.
Если nvidia-smi не будет в вашей системе, то пользуйтесь способом с modinfo.
Шаг 2 — качаем CUDA Toolkit
Между весрией Nvidia драйвера и версией CUDA Toolkit существует связь. Для определенной версии Nvidia драйвера нужно скачивать и устанавливать строго соответствующий пакет CUDA Toolkit, иначе ничего не получится. Опять же есть два способа определить версию CUDA Toolkit.
Первый способ:
идем на страницу cuda toolkit release notes и в таблице «Table 1. CUDA Toolkit and Compatible Driver Versions» ищем нужное соотвествие между версией драйвера и версией CUDA Toolkit:
Например, на моем ноуте установлен nvidia драйвер версии 435.21, значит мне подойдут все версии CUDA Toolkit кроме 10.2. Иными словами 10.1 включительно и ниже.
Если у вас драйвер версии 390, то CUDA Toolkit надо скачивать версии 9.1 и ниже.
Второй способ:
можно снова воспользоваться утилитой nvidia-smi:
nvidia-smi | grep -i "driver version" | NVIDIA-SMI 435.21 Driver Version: 435.21 CUDA Version: 10.1 |
здесь четко написано, для вашего драйвера нужна CUDA 10.1.
После того, как определились с версией CUDA Toolkit идем и скачиваем его со страницы:
https://developer.nvidia.com/cuda-toolkit-archive
Здесь выбираем:
Linux -> x86_64 -> Ubuntu -> 18.04 -> runfile (local)
После скачивания в директории для загрузок появится файл:
cuda_10.1.105_418.39_linux.run
Шаг 3 — устанавливаем CUDA Toolkit
Инсталлер скачан. Сделаем его исполняемым:
chmod +x cuda_10.1.105_418.39_linux.run
./cuda_10.1.105_418.39_linux.run
Запускается долго (наверняка происходит самораспаковка).
После соглашения с EULA появляется экран:
Как видите здесь размечен драйвер, мы его устанавливать не будем, он уже в системе и запущен.
Далее наводи курсор на «CUDA Toolkit 10.1» и жмем букву «A», тем самым переходя к расширенным настройкам:
Здесь делаем неактивными все позиции, как на скриншоте и переходим в «Change Toolkit Installation Path» и вводим имя директории для установки:
в прцессе установки нужно будет еще ввести «Root install path» вводим туже саму директорию:
Когда установка завершится нужно будет дать системе знать куда установлена CUDA, для этого в файл ~/.bashrc прописываем следующие строки:
export PATH=/home/username/cuda/bin:$PATH export LD_LIBRARY_PATH=/home/username/cuda/lib64:$LD_LIBRARY_PATH
На этом установка закончена.
Шаг 4 — Тест
Тестируем связку CUDA и драйвера Nvidia. Для этого воспользуемся примеры из устанвки CUDA.
Возьмем тест с частицами.
Sample: particles Minimum spec: SM 3.0 This sample uses CUDA to simulate and visualize a large set of particles and their physical interaction. Adding "-particles EnlighterJSRAW" data-enlighter-language="null"> cd /home/username/cuda/samples/5_Simulations/particles make
Как видно из рисунка, тест запустился и судя по выводу nvidia-smi на 24% нагружает видеокарту. Буковки C+G перед ./particles говорят о том, что задействованы и вычислительные (С) и графические (G) ресурсы видеокарты.
Шаг 5 — устанавливаем cuDNN
Если вы планируете использовать CUDA в машинном обучении, то просто необходимо устанвить библиотеку cuDNN. Этабиблиотека позволяет максимально эффективно использовать мощности графического ускорителя при работе с нейронными сетями. Ставится cuDNN элементрано:
1) регистрируетесь;
2) скачиваете нужную версию (для каждой CUDA своя cuDNN);
3) распаковываете архив в папку куда установлена CUDA.
Выводы
В данной статье приведено описание способа установки CUDA библиотек в Linux в случае, когда графический драйвер уже установлен, а у пользователя нет прав администратора.
Настройка Ubuntu 8.10 для кодинга под NVIDIA CUDA
Решил я всерьез заняться программированием распределенных вычислений с использованием этой технологии. Не буду подробно рассказывать, что она из себя представляет, скажу только, что CUDA предназначена для проведения распределенных вычислений не на процессоре, а на чипе видеокарты, что позволяет производить неграфические вычисления с феноменальной скоростью (производительность чипа GeForce 8800 GTX при математических расчетах примерно равна производительности 180(!)-ядерного Pentium 4 1,5 ГГц). В основном это используется для решения научных задач, вроде моделирования различных сложных систем. Кстати, данную технологию использует последняя версия Adobe Photoshop (CS4) — рендеринг картинок и многие эффекты обрабатываются именно с помощью CUDA. Технология поддерживается видеокартами на чипах NVIDIA начиная с 8 серии и новее, включая, само собой, Quadro и Tesla.
Сказано — сделано. Буду настраивать свою убунту под это дело, а заодно и о своем опыте расскажу 😉
Примечание:
1. Примеры для CUDA можно благополучно писать и компилировать даже на компьютере без поддерживаемой видеокарты, однако работать они будут раз в сто медленнее, чем при ее наличии.
2. Есть известная проблема — CUDA состоит в плохих отношениях с компилятором gcc-4.3, который по умолчанию установлен в Ubuntu 8.10, поэтому приходится откатываться на gcc-4.1. Подробности ниже 🙂
Начнем!
Для начала установим необходимые библиотеки.
$ sudo apt-get install linux-headers-`uname -r` binutils pkg-config build-essential xserver-xorg-dev libc-dev
Самое важное здесь — libc-dev, без ее наличия ничего работать не будет.
Отлично, продолжаем! Теперь настроим компилятор. Для начала скачаем gcc и g++ нужной нам версии (это важно — их версия должна быть одинаковой). Проще всего это сделать через Synaptic, отыскав там gcc-4.1 и g++-4.1, а можно и прописать в консоли:
$ sudo apt-get install gcc-4.1 g++-4.1
Нужно настроить систему на использование нужного нам компилятора (см АПД в конце!). Делается это до смешного просто:
$ sudo rm -d /usr/bin/gcc
$ sudo ln -s /usr/bin/gcc-4.1 /usr/bin/gcc
$ sudo rm -d /usr/bin/g++
$ sudo ln -s /usr/bin/g++-4.1 /usr/bin/g++
Кстати, вернуть на место «старый» компилятор легко — достаточно заменить в приведенных командах 4.1 на 4.3.
Ну и, само собой, нам нужны сами компоненты CUDA — видеодрайвер, тулкит и SDK. Берем их с родного сайта. Систему указываем 8.04, все будет прекрасно работать и так.
Поскольку мы собираемся использовать последнюю версию — выбираем пакеты для 2.1:
1. CUDA Driver — NVIDIA-Linux-x86-180.06-pkg1.run
(Спасибо товарищу Frosty — недавно вышел драйвер версии 180.22, скачать его можно, естественно, с официального сайта. Процедура установки не отличается)
2. CUDA Toolkit — cuda-linux-rel-nightly-2.1.1635-3065709.run
3. CUDA SDK code samples — cuda-sdk-linux-2.10.1126.1520-3141441.run
Сохраняем их куда-нибудь на диск (желательно, чтобы путь к ним не содержал пробелов и символов кириллицы) и устанавливаем для всех трех пакетов chmod +x. Предварительный этап завершен!
Собственно установка.
Для начала надо поставить видеодрайвер. Ставится он стандартно:
$ sudo -s -H
# /etc/init.d/gdm stop
Жмем Ctrl+Alt+F1 и логинимся. Затем:
# sh NVIDIA-Linux-x86-180.06-pkg1.run
Нам предлагают скачать precompiled headers с сервера NVIDIA. Отказываемся.
Тогда нам предлагают скомпилировать их под наше ядро. Соглашаемся.
Ждем несколько секунд — и вуаля! Драйвер установлен.
Теперь можно снова запустить X-Server:
# /etc/init.d/gdm start
Теперь нужно немного подправить один файл:
$ sudo gedit /etc/default/linux-restricted-modules-common
там нужно исправить строчку на вот такую
Сохраняемся и ребутимся. Если же X-сервер не запустился, то можно просто восстановить конфигурационный файл:
$ sudo cp /etc/X11/xorg.conf.backup /etc/X11/xorg.conf
и пересмотреть свои действия на предмет ошибки.
Отлично! Теперь установим оставшиеся два компонента:
$ sudo ./cuda-linux-rel-nightly-2.1.1635-3065709.run
$ sudo ./cuda-sdk-linux-2.10.1126.1520-3141441.run
Пути (в первом случае /usr/local/cuda и $HOME/NVIDIA_CUDA_SDK во втором) лучше оставить по умолчанию, во избежание.
Теперь немного поковыряем переменные окружения. Они в Ubuntu хранятся в /etc/environment. Нужно добавить в PATH:»/usr/local/cuda:/usr/local/cuda/bin». А потом осталось отредактировать один файл:
$ sudo gedit /etc/ld.so.conf
и набираем ldconfig:
$ sudo ldconfig
Все, можно начинать радоваться! Теперь идем в каталог SDK и пробуем собрать примеры.
$ cd ~/NVIDIA_CUDA_SDK
$ make
Кстати, не стоит забывать про параметры команды make. При компилировании кода под CUDA они могут быть такие:
— release configuration — make
— debug configuration — make dbg=1
— emurelease configuration — make emu=1
— emudebug configuration — make emu=1 dbg=1
Не забывайте, что если на вашем компьютере нету совместимой видеокарты — обязательно ставим параметр emu=1.
Вот, собственно, и все! Теперь, если все правильно собралось(если нет — перепроверьте, нужной ли версии gcc и g++), можно идти в каталог ~/NVIDIA_CUDA_SDK/bin/linux/release/ и наслаждаться примерами. Лично мне больше всего понравился fluidsGL.
Если есть какие-то недочеты — постараюсь исправить. Удачи!
АПД: Меня попросили сразу два товарища (3dm и timyr_lan) поправить способ смены дефолтного компилятора. Спасибо за поправку.
Корректнее делать вот так:
Прописать в ~/.bashrc или просто выставлять эти переменные перед компиляцией CUDA кода.
АПД2: Вариант нумбер 2, даже проще:
$ gedit ~/NVIDIA_CUDA_SDK/common/common.mk
# Compilers
NVCC := $(CUDA_INSTALL_PATH)/bin/nvcc.
CXX := g++-4.1
CC := gcc-4.1
LINK := g++-4.1 -fPIC