© 2018 WebHive

Ставим TensorFlow на Arch c Optimus

В последнее время активно занялся изучением нейронных сетей. Ну и как тут обойтись без TensorFlow — пожалуй наиболее распиаренного фреймворка для этих целей. Однако даже установить его оказалось довольно нетривиальной проблемой. В итоге всё получилось. Об этом и рассказ.

Исходные данные

Итак имеем в наличии ноутбук c Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz и NVIDIA GPU GeForce GT 640M (GK107).

При таком железе возникло естественное желание использовать GPU для вычислений, особенно учитывая, что дискретной видеокартой я не пользуюсь.

Операционная система — Arch Linux. Ниже опишу свои мытарства во избежание прогулки по граблям. Кому нужен только конечный результат мотайте вниз в Итого

Пробую ставить из пакетов.

Собственно способ самый очевидный. Не мудрствуя лукаво проверил, что у нас есть в репозитариях и онаружил 2 пакета python-tensorflow и python-tensorflow-git. Почему-то решил начать со второго.

python-tensorflow-git

Отказался собираться с python3, пришлось переключить дефолтный python на 2-ю версию. Однако и там несмотря на то, что сборка таки запустилась я обнаружил сообщение, что CUDA не найдена и типа будем собирать без неё. Фтопку!

python-tensorflow

Этот пакет как оказалось тоже собирает TensorFlow из исходников. Двое суток грел комнату ноутбуком пытаясь собрать С++ код этого чуда. Тонны warning-ов в консоли и периодические вылеты из-за неразрешённых зависимостей. К чорту — я таки сдался и начал искать альтернативы …

Старый добрый docker

Подумал, что раз такой геморрой со сборкой должен был найтись добрый человек, который уже прошёл через этот ад и завернул всё в контейнер. Ну и поиски свои я начал конечно же с сайта TensorFlow — кому как не им озаботиться такими вещами раз уж арчевские пакеты оказались бесполезными.

Ура — имеем в наличии полный набор докерских образов на все случаи жизни. Но мне интересен был вариант с GPU, поэтому далее именно о нём.

Оказалось, что нужен какой-то специальный nvidia-docker, что слегка озадачило. Arch опять сел в лужу — такой пакет был, но устаревший и нерабочий. Пришлось ставить вручную. Процесс достаточно подробно описан на сайте nvidia-docker

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0_amd64.tar.xz
$ sudo tar --strip-components=1 -C /usr/bin -xvf /tmp/nvidia-docker*.tar.xz && rm /tmp/nvidia-docker*.tar.xz

Всё встало как часы — время запустить тест.

$ nvidia-docker run --rm nvidia/cuda nvidia-smi

Тщетно — не работает оно. Ругается на невозможность запустить драйвер. Далее эксперименты с optirun и опять никак.

Наконец сработал способ включения дискретной видеокарты вручную

$ sudo tee /proc/acpi/bbswitch <<< ON

Ну и не забыть загрузить плагины иначе тоже нихрена не работает.

$ sudo -b nohup nvidia-docker-plugin > /tmp/nvidia-docker.log

Теперь тест работает

$ nvidia-docker run --rm nvidia/cuda nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 378.13                 Driver Version: 378.13                    |
|-------------------------------+----------------------+----------------------+
| 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 GT 640M     Off  | 0000:01:00.0     N/A |                  N/A |
| N/A   59C    P8    N/A /  N/A |     37MiB /  1999MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|    0                  Not Supported                                         |
+-----------------------------------------------------------------------------+

Ну и образ тоже запускается

$ nvidia-docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu
[I 13:21:46.313 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 13:21:46.646 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 13:21:46.696 NotebookApp] Serving notebooks from local directory: /notebooks
[I 13:21:46.697 NotebookApp] 0 active kernels
[I 13:21:46.697 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/?token=<....>

Получили работающий на GPU docker контейнер. По адресу http://localhot: 8888/ доступен jupiter с тестовыми примерами.

Итого

Подведу итоги. Чтобы запустить TensorFlow требуются следующие шаги:

Ставим nvidia-docker

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0_amd64.tar.xz
$ sudo tar --strip-components=1 -C /usr/bin -xvf /tmp/nvidia-docker*.tar.xz && rm /tmp/nvidia-docker*.tar.xz

Включаем дискретную видеокарту

$ sudo tee /proc/acpi/bbswitch <<< ON

Загружаем плагины

$ sudo -b nohup nvidia-docker-plugin > /tmp/nvidia-docker.log

Запускаем контейнер

$ nvidia-docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu

Комментарии