Статьи о конфигурации окружающей среды можно расценивать как менструальные посты, и таких статей в Интернете очень много. Но я думаю, что все же необходимо записать мою последнюю конфигурацию среды глубокого обучения, Основная причина в том, что различное программное обеспечение быстро обновляется, и соответствующие методы установки и настройки также будут иметь некоторые изменения.
Эта конфигурация среды глубокого обучения имеет два ключевых слова: одно — виртуальная машина Docker, а другое — ускорение графического процессора.
до начала
Докер виртуальная машина
Давайте сначала поговорим о виртуальной машине Docker. Зачем вам виртуальная машина? Не знаю, был ли у вас когда-нибудь такой опыт, вы увидели интересный open source проект на github, скачали код, скомпилировали и запустили его по инструкции к проекту и обнаружили, что он не может быть успешным.
Или наоборот, вы разработали хороший проект, выложили его на гитхаб и максимально подробно расписали этапы компиляции, но осталась еще куча разработчиков, которые выдали вопросы о том, что есть проблема с компиляцией кода и Бег. Вы также очень невинны.Со мной вам явно хорошо, так почему же у вас проблемы, когда вы попадаете к кому-то другому?
Почему это происходит? Основная причина заключается в том, что индустрия программного обеспечения уделяет внимание быстрой итерации, быстрому продвижению вперед, и программное обеспечение будет постоянно обновляться. Возьмите TensorFlow в качестве примера, с момента его выпуска до настоящего времени я не знаю, сколько версий было обновлено. Хотя, как разработчик программного обеспечения, мы постараемся сделать все возможное, чтобы обеспечить прямую совместимость, но на самом деле добиться идеальной совместимости сложно. Чтобы решить эту проблему совместимости, необходимо использовать виртуальную машину.Теперь многие проекты с открытым исходным кодом будут предоставлять файл виртуальной машины, который содержит программные пакеты и среды, необходимые для всех проектов.
Ускорение графического процессора
Далее поговорим об ускорении GPU. Использование виртуальной машины Docker решает проблему среды разработки, но в то же время создает другую проблему: виртуальная машина часто не поддерживает GPU. Мы знаем, что глубокое обучение — это приложение, интенсивно использующее вычислительные ресурсы, особенно на этапе обучения модели. Обучение модели часто занимает несколько часов или даже десятков дней, а между включением и выключением часто возникает разрыв в производительности в десятки раз. включение графического процессора. Как серьезному разработчику глубокого обучения, очень важно использовать высокопроизводительный компьютер с графическим процессором и включить поддержку графического процессора.
Итак, вопрос в том, как не только насладиться удобством изоляции среды, обеспечиваемой виртуальной машиной Docker, но и ощутить повышение производительности, обеспечиваемое ускорением графического процессора?
Если есть проблема, кто-то, естественно, выйдет вперед и предложит решение. Nvidia предлагает решение для собственной карты Nvidia: nvidia-docker. Поговорим о схеме конфигурации Nvidia.
утверждение
Перед запуском сделайте следующее заявление:
-
В этой статье приведены инструкции по настройке видеокарты Nvidia. Если вы используете видеокарту ATI или другую видеокарту, выйдите и поверните направо, чтобы найти Google.
-
Эта статья предназначена для инструкций по настройке системы Ubuntu. Это не означает, что другие операционные системы не могут быть настроены. Если вы используете другие операционные системы, пожалуйста, Baidu.
-
Практическая среда этой статьи — 64-разрядная операционная система Ubuntu 16.04 и графическая карта GTX 960. Другие версии Ubuntu или другие типы графических карт Nvidia теоретически применимы, но не могут быть гарантированы на 100 %, и некоторые шаги могут потребоваться немного модифицированный.
Установите CUDA на хост хосте
CUDA (Compute Unified Device Architecture) — архитектура параллельных вычислений общего назначения, представленная NVIDIA, которая позволяет графическим процессорам решать сложные вычислительные задачи.
Ваша видеокарта поддерживает CUDA?
Сначала подтвердите модель видеокарты, вы можете использовать команду lspci в системах Linux:
lspci | grep VGA
01:00.0 VGA compatible controller: NVIDIA Corporation GM206 [GeForce GTX 960] (rev a1)
скопировать код
Видно, что модель моей видеокарты — GeForce GTX 960. Перейдите на страницу графических процессоров Nvidia CUDA, вы увидите, что в основном все карты серии N поддерживают CUDA, и, естественно, моя GeForce GTX 960 также ее поддерживает.
Установите последнюю версию CUDA
Версия CUDA постоянно обновляется, и на момент написания этой статьи последняя версия — 9.2. Конечно, можно установить и старую версию, но я всегда придерживался принципа одевать новую, а не старую, и обычно выбираю последнюю версию.
Следуйте инструкциям по установке Nvidia и сделайте следующее:
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.2.88-1_amd64.deb
sudo dpkg --install cuda-repo-ubuntu1604_9.2.88-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
скопировать код
Однако во время установки выдается следующая ошибка:
gpgkeys: protocol `https' not supported
скопировать код
Решение тоже очень простое, ставим нужный пакет:
sudo apt install gnupg-curl
скопировать код
Затем вы можете установить cuda как обычный пакет Ubuntu:
sudo apt-get update
sudo apt install cuda
скопировать код
Вы можете налить чашку кофе и медленно попробовать его, этот шаг может занять некоторое время, в конце концов, для загрузки требуется почти 3 ГБ пакетов программного обеспечения.
Обновите переменные среды
Чтобы каждый раз не задавать переменные среды, рекомендуется добавить в файл ~/.bashrc (или ~/.profile) следующие настройки переменных среды:
# for nvidia CUDA
export PATH="/usr/local/cuda-9.2/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-9.2/lib64:$LD_LIBRARY_PATH"
скопировать код
Чтобы переменная среды вступила в силу немедленно, выйдите из системы и войдите снова. Или выполните следующую команду:
source ~/.bashrc
скопировать код
Постоянный демон NVIDIA
Я не совсем понимаю, что делает этот шаг, но в основном это означает, что демон постоянства поддерживает инициализацию графического процессора и сохраняет состояние задачи CUDA, даже если ни один клиент не подключен к графическому процессору. Документация требовала этого, и мы все равно это сделали.
Сначала создайте новый каталог /usr/lib/systemd/system:
sudo mkdir /usr/lib/systemd/system
скопировать код
Затем добавьте файл /usr/lib/systemd/system/nvidia-persistenced.service со следующим содержимым:
[Unit]
Description=NVIDIA Persistence Daemon
Wants=syslog.target
[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced
[Install]
WantedBy=multi-user.target
скопировать код
Наконец, включите службу:
sudo systemctl enable nvidia-persistenced
скопировать код
Отключить определенные правила UDEV
Определенное правило udev (интерфейс между физическим устройством и системой) препятствует правильной работе драйвера NVIDIA. Для этого отредактируйте /lib/udev/rules.d/40-vm-hotadd.rules и закомментируйте правила подсистемы памяти:
# SUBSYSTEM=="memory", ACTION=="add", DEVPATH=="/devices/system/memory/memory[0-9]*", TEST=="state", ATTR{state}="online"
скопировать код
Убедитесь, что CUDA работает
Перезагрузите компьютер и попробуйте скомпилировать пример CUDA, чтобы убедиться, что CUDA установлена правильно. Пример кода CUDA можно установить с помощью следующей команды:
cuda-install-samples-9.1.sh ~
скопировать код
Где ~ означает установку кода в домашнюю директорию, конечно, вы также можете установить в другие места.
Следующим шагом является компиляция примера кода:
cd ~/NVIDIA_CUDA-9.2_Samples/
make
скопировать код
Вы можете снова выпить чашку кофе, в зависимости от процессора вашего компьютера этот шаг может занять десятки минут.
После компиляции запустите одну из программ-примеров:
./bin/x86_64/linux/release/deviceQuery | tail -n 1
скопировать код
Если вывод Result = PASS, это означает, что CUDA работает правильно.
Установите NVIDIA Docker
Сначала добавьте в список пакетов nvidia-docker:
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
скопировать код
Затем убедитесь, что на вашем компьютере установлена последняя версия docker-ce, а это означает, что если вы ранее устанавливали docker-engine, docker.io, вам необходимо сначала удалить его. Не волнуйтесь, это все члены семейства докеров, но с разными именами в разное время, последняя версия docker-ce представляет собой обновленную версию этих версий:
# remove all previous Docker versions
sudo apt-get remove docker docker-engine docker.io
# add Docker official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Add Docker repository (for Ubuntu Xenial)
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
sudo apt-get update
sudo apt install docker-ce
скопировать код
С последним докером, наконец, установите nvidia-docker:
# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
скопировать код
Проверить nvidia-докер
На данный момент nvidia-docker установлен, как проверить правильность установки nvidia-docker?
Мы можем запустить образ докера, предоставленный nvidia, в котором есть утилита nvidia-smi, которая отслеживает (и управляет) графическим процессором:
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
скопировать код
Если вы получаете вывод, подобный следующему, это означает, что графический процессор контейнера докеров включен.
Вы также можете выполнить тест, чтобы точно определить, насколько велик разрыв между процессором и графическим процессором. Вот эталонный скрипт с сайта learningtensorflow.com:
import sys
import numpy as np
import tensorflow as tf
from datetime import datetime
device_name = sys.argv[1] # Choose device from cmd line. Options: gpu or cpu
shape = (int(sys.argv[2]), int(sys.argv[2]))
if device_name == "gpu":
device_name = "/gpu:0"
else:
device_name = "/cpu:0"
with tf.device(device_name):
random_matrix = tf.random_uniform(shape=shape, minval=0, maxval=1)
dot_operation = tf.matmul(random_matrix, tf.transpose(random_matrix))
sum_operation = tf.reduce_sum(dot_operation)
startTime = datetime.now()
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as session:
result = session.run(sum_operation)
print(result)
# It can be hard to see the results on the terminal with lots of output -- add some newlines to improve readability.
print("\n" * 5)
print("Shape:", shape, "Device:", device_name)
print("Time taken:", str(datetime.now() - startTime))
скопировать код
Создайте файл python с вышеуказанным содержимым: Benchmark.py в текущем каталоге, затем запустите образ докера tensorflow, поддерживающий GPU, и запустите программу tensorflow:
docker run \
--runtime=nvidia \
--rm \
-ti \
-v "${PWD}:/app" \
tensorflow/tensorflow:latest-gpu \
python /app/benchmark.py cpu 10000
скопировать код
Приведенная выше команда является версией процессора.После запуска измените параметр cpu в команде на gpu и запустите ее снова.
На моей машине результаты такие:
CPU: ('Time taken:', '0:00:15.342611')
GPU: ('Time taken:', '0:00:02.957479')
скопировать код
Может быть, вы подумаете, что разница в десять секунд — это ничто? Вы знаете, это разница почти в 7 раз. Добавление графического процессора в ваш проект глубокого обучения занимает 24 часа, а без графического процессора — неделя, что является огромным разрывом.
Ссылаться на
-
Using NVIDIA GPU within Docker Containers
-
CUDA Quick Start Guide
-
NVIDIA Container Runtime for Docker
-
Docker for Ubuntu