Как да инсталирате Tensorflow + CUDA 9.1 в Ubuntu 18.04

Ако сте като мен, винаги ви сърбят, за да изпробвате най-новите версии на какъвто и да е софтуер, който използвате. За съжаление, това често означава да измислим как да изгладим няколко кинта, за да накараме нещата да се смесват и съвпадат. Ето ръководство, което ще ви помогне да подготвите своя лъскав нов Ubuntu за задълбочено обучение.

Публиката

Това ръководство е за тези, които трябва да се възползват максимално от своя хардуер, базиран на Nvidia. Предполагам, че имате нова инсталация на Ubuntu 18.04. Ако просто играете наоколо и няма да е необходимо да използвате вашия графичен процесор, вероятно е по-добре да инсталирате pip пакета вместо това. Ако сте човек на AMD, вместо CUDA трябва да използвате SYCL (OpenCL), но не мога да помогна много с това.

Инсталиране на CUDA: добри новини, лоши новини

И така, първото нещо, което трябва да опитате, е да инсталирате tiporflow-gpu pip пакета, както е описано в официалното ръководство за инсталиране. Това обаче никога не е работило за мен, така че ще покажа само как да инсталирам от източника. Това има допълнителното предимство, че компилираните двоични файлове ще се възползват от всички оптимизации, които вашата машина поддържа.

Ако следвате официалното ръководство за инсталиране на Tensorflow от източник, ще забележите, че препоръчват да използвате CUDA 9.0. Сега, ако вашият Ubuntu беше 17.04 - последната официално поддържана версия - тогава наистина трябва да се придържате към версията 9.0 от архивите. В такъв случай вероятно сглобеният пакет за пип ще работи. Но тъй като вашата операционна система така или иначе не се поддържа, няма смисъл да не използвате най-новата CUDA, която в момента е 9.1.

Добрата новина е, че Ubuntu 18.04 е добавил CUDA към своето многостранно хранилище. Това означава, че няма нужда да се забърквате с добавяне на хранилища на трети страни и всички неизбежни сблъсъци на версията, които идват с него. Можете просто да инсталирате всичко, като използвате apt:

sudo apt инсталирате nvidia-390 nvidia-cuda-инструментариум libcupti-dev gcc-6 python3-numpy python3-dev python3-pip python3-колело

Това ще инсталира (в момента) най-новия графичен драйвер, самата CUDA, CUPTI, която по някаква причина не се доставя с пакета CUDA, както трябва, GCC версия 6, която е най-новата съвместима за компилиране на CUDA код и куп Основи за разработка на Python 3. Ако по някаква странна причина трябва да използвате Python 2, просто пропуснете 3-те в python3.

Лошата новина е, че тъй като се превърна в родния пакет, CUDA се инсталира по доста нестандартен начин.

Не мога да обвинявам нито Nvidia, нито Canonical. Начинът на Nvidia беше най-добрият, най-самостоятелният начин за поддържане на последователност в различните дистрибуции. Улеснява зависимостите на трети страни да търсят CUDA и хората с нестандартни дистрибутори, за да запазят съвместимост. Всичко беше поставено под пътя /usr/local/cuda-*.*, така че беше лесно да се поддържат версии, без да се разчита на мениджър на пакети.

Но не така работят родните пакети; тъй като те могат да разчитат на контрола на мениджъра на пакети, те се инсталират в пътищата на кореновата система: / usr / bin, / usr / include, / usr / lib. Представете си, ако всеки нов пакет би се прибавил към променливите на средата PATH и LD_LIBRARY_PATH. Търсенето на двоични файлове, заглавките и библиотеките скоро ще станат бавни и податливи на неясни проблеми с пространството на имената. Този стандарт улеснява всички инструменти да знаят къде да търсят зависимостите си, но е жизнеспособен, тъй като мениджърът на пакети проследява кои пакети инсталира кои файлове. Това е компромис с дружелюбност / мащабируемост.

Tensorflow вероятно в крайна сметка ще актуализира своя инструмент за конфигуриране, за да работи с този нов инсталационен формат, но междувременно трябва да подражаваме на стария начин, за да работи. Следните команди трябва да направят трика:

sudo mkdir -p / usr / local / cuda / usr / local / cuda / екстри / CUPTI / usr / local / cuda / nvvm
sudo ln -s / usr / bin / usr / local / cuda / bin
sudo ln -s / usr / включва / usr / local / cuda / включва
sudo ln -s / usr / lib / x86_64-linux-gnu / usr / local / cuda / lib64
sudo ln -s / usr / local / cuda / lib64 / usr / local / cuda / lib
sudo ln -s / usr / включва / usr / local / cuda / extras / CUPTI / включва
sudo ln -s / usr / lib / x86_64-linux-gnu / usr / local / cuda / extras / CUPTI / lib64
sudo ln -s / usr / lib / nvidia-cuda-toolkit / libdevice / usr / local / cuda / nvvm / libdevice

Забележка: Това ръководство предполага, че имате 64-битова система (много вероятно).

Защо да не го направите по традиционния начин?

Може би се чудите защо да се придържате към мултиверс пакета, когато предоставеният Nvidia е толкова по-лесен за справяне? Е, основната причина е, че пакетът Nvidia просто не работи с новия Ubuntu, поради сблъсъци на версията с някои пакети, по-специално с графичния драйвер. Когато се опитах да го направя по този начин, аз се озовах със счупен Ubuntu и трябваше да го преинсталирам от нулата. Въпреки допълнителната работа, която изисква, обаче, мултивертният пакет всъщност е доста актуален и би трябвало да причини по-малко главоболия в дългосрочен план, тъй като не разчита толкова много на грижите на Nvidia.

Инсталиране на допълнителни библиотеки на Nvidia

Tensorflow също зависи от cuDNN и NCCL, и двете от които можете да изтеглите от уебсайта на Nvidia. Имах успех, използвайки (в момента) най-новите версии, 7.1 и 2.1.15.

За да инсталирате cuDNN, просто копирайте файловете в директорията / usr / local / cuda, която сте създали. Ако приемем, че сте извлекли .tgz в папката си за изтегляне:

cd ~ / Downloads / cudnn-9.1-linux-x64-v7.1 / cuda
sudo cp включва / * / usr / местно / cuda / включва /
sudo cp lib64 / libcudnn.so.7.1.4 lib64 / libcudnn_static.a / usr / local / cuda / lib64 /
cd / usr / lib / x86_64-linux-gnu
sudo ln -s libcudnn.so.7.1.4 libcudnn.so.7
sudo ln -s libcudnn.so.7 libcudnn.so

EDIT: Съгласно коментара на Ian Jason Min, актуализирах този сегмент, което всъщност не беше правилно, тъй като символните връзки не се смесват с реалните директории. Съжалявам за това. От плюс, използвах тази възможност да направя някои файлове в символни връзки, което спестява около 600MB място (това също избягва предупреждение с apt).

Това всъщност ще ги копира в пътеките на коренната система, което не е идеално, тъй като те няма да бъдат проследявани от никой мениджър на пакети, но те са само няколко самостоятелни файла, така че можем да живеем с това. Ако имате предвид по-стабилна процедура, не се колебайте.

За да инсталирате NCCL, трябва малко повече работа:

sudo mkdir -p / usr / local / cuda / nccl / lib / usr / local / cuda / nccl / включва
cd ~ / Downloads / nccl_2.1.15-1 + cuda9.1_x86_64 /
sudo cp * .txt / usr / local / cuda / nccl
sudo cp включва / *. h / usr / включва /
sudo cp lib / libnccl.so.2.1.15 lib / libnccl_static.a / usr / lib / x86_64-linux-gnu /
sudo ln -s /usr/include/nccl.h /usr/local/cuda/nccl/include/nccl.h
cd / usr / lib / x86_64-linux-gnu
sudo ln -s libnccl.so.2.1.15 libnccl.so.2
sudo ln -s libnccl.so.2 libnccl.so
за i in libnccl *; направете sudo ln -s / usr / lib / x86_64-linux-gnu / $ i / usr / local / cuda / nccl / lib / $ i; Свършен

EDIT: За пореден път Ian Jason Min спаси деня и посочи няколко липсващи детайли в горния сегмент.

Това също ще се инсталира в кореновите пътища, но, отново, не бива да е голяма работа. Ще покажа няколко команди, за да отмените всичко това по-късно.

Едно последно нещо, което трябва да коментирам, е, че Tensorflow също може да използва TensorRT, за да ускори извода, но не можах да го накарам да работи с тази настройка. Инструментът за конфигуриране се оплаква от несъвместимост на някои версии, които не можах да разреша. Ако някой го измисли, ще актуализирам този раздел.

Инсталиране на Bazel

Официалното ръководство препоръчва да инсталирате Bazel с двоичния инсталатор, но всъщност мисля, че персонализираното хранилище е по-лесно и по-добро - ще поддържа нещата актуализирани. Тези инструкции са достатъчно лесни за изпълнение, но просто ще ги копирам тук за ваше удобство:

sudo apt инсталирате openjdk-8-jdk
ехо "deb [arch = amd64] http://storage.googleapis.com/bazel-apt стабилен jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
къдря https://bazel.build/bazel-release.pub.gpg | sudo apt-ключ добавяне -
sudo apt актуализация && sudo apt инсталирайте базел

Още нещо

Сценарият за конфигурация предполага, че в средата ви има битов питон. По подразбиране Ubuntu 18.04 вече не идва с Python 2, но двоичният Python 3 се нарича python3. За да разреша този проблем, искам да използвам алтернативи за актуализация:

sudo update-alternative --install / usr / bin / python python / usr / bin / python3 100 --slave / usr / bin / pip pip / usr / bin / pip3

По този начин всеки път, когато се обадите на python, получавате Python 3.

Обърнете внимание, че ако някога инсталирате Python 2, python ще продължи да сочи към Python 3. Python 2 ще бъде достъпен чрез python2.

Инсталиране на Tensorflow

Сега най-накрая можем да преминем към добрите неща.

Първо, клонирайте хранилището на Tensorflow:

git clone https://github.com/tensorflow/tensorflow
CD tensorflow

Въпреки това, за разлика от препоръчаното в официалното ръководство, трябва да се придържате към основния клон. Последната версия (в момента) е 1.8 и има грешка, която не позволява на някой код да се компилира с GCC 6. Очевидно официалната компилация е компилирана с GCC 4.8, поради което те направиха очевидно счупено издание.

Както и да е, поправката е обединена в главен, така че трябва да се компилира добре. В случай че се сблъскате с проблеми, аз го изградих в команда # d0f5bc1 (вече има много по-нови ангажименти, някои от които може да счупят нещо).

Следващата стъпка е да стартирате инструмента за конфигуриране с ./configure. Ето моите данни:

Имате инсталирана база 0.13.0.
Моля, посочете местоположението на python. [По подразбиране е / usr / bin / python]: / usr / bin / python3
Намерени възможни пътеки към библиотеката на Python:
  /usr/local/lib/python3.6/dist-packages
  / ЮЕсАр / ИЪ / python3 / дист опаковки
Моля, въведете желания път на библиотеката Python, който да използвате. По подразбиране е [/usr/local/lib/python3.6/dist-packages]
Искате ли да изградите TensorFlow с jemalloc като поддръжка на malloc? [Y / n]: y
jemalloc, тъй като поддръжката на malloc ще бъде активирана за TensorFlow.
Искате ли да изградите TensorFlow с поддръжка на Google Cloud Platform? [Y / n]: n
За TensorFlow няма да бъде активирана поддръжка на Google Cloud Platform.
Искате ли да изградите TensorFlow с поддръжка на файлова система Hadoop? [Y / n]: n
За TensorFlow няма да бъде активирана поддръжка на файлова система Hadoop.
Искате ли да изградите TensorFlow с поддръжка на файловата система на Amazon S3? [Y / n]: n
Няма поддръжка на файловата система на Amazon S3 за TensorFlow.
Искате ли да изградите TensorFlow с поддръжка на Apache Kafka Platform? [Y / n]: n
За TensorFlow няма да бъде активирана поддръжка на Apache Kafka Platform.
Искате ли да изградите TensorFlow с поддръжка на XLA JIT? [y / N]: y
Поддръжката на XLA JIT ще бъде активирана за TensorFlow.
Искате ли да изградите TensorFlow с поддръжка на GDR? [y / N]: n
Няма поддръжка на GDR за TensorFlow.
Искате ли да изградите TensorFlow с поддръжка на VERBS? [y / N]: n
Няма поддръжка за VERBS за TensorFlow.
Искате ли да изградите TensorFlow с поддръжка на OpenCL SYCL? [y / N]: n
Няма поддръжка на OpenCL SYCL за TensorFlow.
Искате ли да изградите TensorFlow с поддръжка на CUDA? [y / N]: y
Поддръжката на CUDA ще бъде активирана за TensorFlow.
Моля, посочете версията на CUDA SDK, която искате да използвате, напр. 7.0. [Оставете празно по подразбиране до CUDA 9.0]: 9.1
Моля, посочете мястото, където е инсталиран инструментариумът CUDA 9.1. Вижте README.md за повече подробности. [По подразбиране е / usr / local / cuda]:
Моля, посочете cuDNN версията, която искате да използвате. [Оставете празно по подразбиране до cuDNN 7.0]: 7.1
Моля, посочете мястото, където е инсталирана библиотеката cuDNN 7. Вижте README.md за повече подробности. [По подразбиране е / usr / local / cuda]:
Искате ли да изградите TensorFlow с поддръжка на TensorRT? [y / N]: n
За TensorFlow няма да бъде активирана поддръжка на TensorRT.
Моля, посочете версията NCCL, която искате да използвате. [Оставете празно по подразбиране до NCCL 1.3]: 2.1.15
Моля, посочете мястото, където е инсталирана библиотеката NCCL 2. Вижте README.md за повече подробности. [По подразбиране е / usr / local / cuda]: / usr / local / cuda / nccl
Моля, посочете списък с функции за изчисляване на Cuda, разделени със запетая, с които искате да изградите.
Можете да намерите способността за изчисляване на вашето устройство на адрес: https://developer.nvidia.com/cuda-gpus.
Моля, обърнете внимание, че всяка допълнителна възможност за изчисляване значително увеличава времето ви за изграждане и двоичния размер. [По подразбиране е: 3,5,5.2] 5.2
Искате ли да използвате clang като CUDA компилатор? [y / N]: n
nvcc ще се използва като компилатор на CUDA.
Моля, посочете кой gcc трябва да се използва от nvcc като хост компилатор. [По подразбиране е / usr / bin / x86_64-linux-gnu-gcc-7]: / usr / bin / gcc-6
Искате ли да изградите TensorFlow с MPI поддръжка? [y / N]: n
Няма поддръжка на MPI за TensorFlow.
Моля, посочете оптимизационни флагове, които да се използват по време на компилация, когато е зададена опция "--config = opt" [По подразбиране е -march = native]:
Искате ли да конфигурирате интерактивно ./WORKSPACE за надстройки за Android? [y / N]: n
Не се конфигурира WORKSPACE за надстройки за Android.
Предварително конфигурирани конфигурации за изграждане на Bazel. Можете да използвате всяко от по-долу, като добавите "--config = <>" към вашата команда за изграждане. Вижте инструменти / bazel.rc за повече подробности.
 --config = mkl # Build с поддръжка на MKL.
 --config = монолитна # Конфигурирайте предимно за статично монолитно изграждане.
Конфигурацията приключи

Забележителни точки:

  • Път пътека: / usr / bin / python3
  • Път на GCC: / usr / bin / gcc-6
  • NCCL път: / usr / local / cuda / nccl
  • Проверете най-новите възможности за изчисляване на CUDA.

ЗАБЕЛЕЖКА: Съобщава се, че по-новите ангажименти изискват Keras да компилира. Въпреки че това изглежда като завинтване от някои разработчици, за сега е най-добре да избегнете проблема и първо да инсталирате Keras:

пип инсталиране на кераси

Сега, за да компилирате, просто стартирайте

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

Забележка: ако получите грешка от типа „C ++ компилация на правило„ @double_conversion //: двойно преобразуване “не е успешно“, тогава може да е полезно да предадете допълнителния аргумент на --cxxopt = „- D_GLIBCXX_USE_CXX11_ABI = 0“.

Тази стъпка вероятно ще отнеме много време. След като приключи, ако всичко върви добре, можете да изградите пакета tensorflow

кошче / tensorflow / инструменти / pip_package / build_pip_package / tmp / tensorflow_pkg

и да инсталирате

pip install /tmp/tensorflow_pkg/tensorflow*.whl

Проверете дали вашата компилация работи, като промените в друга директория (cd) и стартирате python:

внос tensorflow като tf
hello = tf.constant ('Здравей, Tensorflow!')
sess = tf.Session ()
печат (sess.run (здравей))

Трябва да получите Здравейте, Tensorflow! като изход.

Как да отмените това

Колкото и да сте се почувствали уплашени от някои команди, няма да се нанесе много вреда на системата ви, ако следвате това ръководство. Ако се сблъскате с проблеми и искате да отмените всичко, свързано със CUDA, за да можете да рестартирате от нулата или да опитате нещо друго, просто изпълнете следните редове:

sudo rm /usr/include/nccl.h /usr/include/cudnn.h / usr / lib / x86_64-linux-gnu / libnccl * / usr / lib / x86_64-linux-gnu / libcudnn *
sudo rm -r / usr / local / cuda
sudo apt премахнете nvidia-cuda-toolkit libcupti-dev gcc-6

Можете да пропуснете бита на nvidia-390, тъй като обикновено е добра идея да притежавате драйвер, независимо дали използвате CUDA или не.

За да деинсталирате пакета Tensorflow, използвайте pip:

пип премахване tensorflow

Заключителни бележки

Ако всичко вървеше добре, сега имате изключително оптимизирана авангардна версия на Tensorflow, инсталирана във вашия Ubuntu 18.04. Единственото нещо, което може да го ускори е добавянето на TensorRT, но не можах да разбера как да го накарам да работи с тази настройка. Чувствайте се свободни да правите някакви предложения или да поискате помощ в коментарите. Надявам се моят водач да спести време за няколко души (ми отне по-добрата част от деня, за да разбера всичко това).