В последнее время активно занялся изучением нейронных сетей. Ну и как тут обойтись без 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
Комментарии