TensorFlowGPU, JupyterLab, CUDA, cuDNN, перенаправление портов, конфигурация DNS, SSHFS, bash
Преимущества использования графических процессоров для вашего рабочего процесса машинного обучения обсуждались ранее. Цель этой статьи - обобщить шаги по настройке машины для личных проектов машинного обучения. Я последовал аналогичному руководству из 2017 года и обнаружил, что с тех пор многие шаги изменились - к лучшему - в 2020 году. Кроме того, я предложу несколько процедур, которые сделают ваш удаленный рабочий процесс более простым и безопасным, на основе мой опыт работы с системами DAQ во время докторской диссертации.
К концу статьи вы сможете запустить удаленный сеанс JupyterLab, запущенный на компьютере с GPU-хостом, с вашего ноутбука. Более того, вы сможете удаленно включить машину из любого места и смонтировать ее файловую систему прямо на вашем ноутбуке.
Контур:
- Установка и настройка Ubuntu 20.04 (автономный / с двойной загрузкой / WLS2)
- Настройка удаленного доступа (ssh, WOL, конфигурация DNS, перенаправление портов)
- Забота о драйверах и библиотеках NVIDIA (CUDA, cuDNN)
- Создание среды Python для машинного обучения (TensorFlow, JupyterLab)
- Удобные инструменты: монтирование удаленных каталогов с помощью SSHFS, установка некоторых часто используемых команд в качестве псевдонимов bash
Требования:
- Ноутбук / настольный компьютер, на котором вы обычно работаете. Я использую MacBook Pro 2015 с macOS 10.15.
- Например, компьютер с графическим процессором - это может быть ваш текущий игровой ПК. Вам не нужно тратить свой бюджет на дорогостоящий графический процессор, чтобы начать обучение DNN! Мое оборудование в настоящее время довольно скромное:
Процессор: AMD Ryzen 5 2600X (3,6 ГГц, шестиядерный)
Графический процессор: NVIDIA GTX 1660 (6 ГБ VRAM)
ОЗУ: 16 ГБ (DDR4 3200 МГц)
Хранение: 512 ГБ NVMe M.2 (SSD ), Жесткий диск 512 ГБ
Блок питания: 700 Вт
Вам также понадобятся монитор, клавиатура и мышь, пока мы не закончим настройку удаленного доступа. - Доступ на уровне администратора к настройкам вашего роутера (необязательно)
- Некоторое знакомство с Linux и терминалом
1. Установка и настройка Ubuntu 20.04
ОС Windows не подходит - на мой взгляд и мнение других - для разработки машинного обучения или работы в сети. Поэтому для этой цели мы настроим ОС Linux. Ubuntu Desktop 20.04 (скачать здесь) - идеальный выбор для этого, поскольку многие функциональные возможности работают из коробки, что позволяет нам сэкономить время на настройку по сравнению с другие дистрибутивы Linux. У вас есть три варианта продолжения:
- Установить только Ubuntu.
- Двойная загрузка Ubuntu вместе с существующей ОС Windows. Следуйте инструкциям здесь (рекомендуемый вариант).
- Используйте WSL2 (подсистема Windows для Linux); это обсуждается здесь. Предупреждение: я никогда не тестировал этот вариант (здесь вы сами по себе!).
Я рекомендую вариант №2, чтобы сохранить доступ к Windows (например, для игровых целей). Обязательно подключите свой компьютер к Интернету во время установки, чтобы получить последние обновления и драйверы.
После установки войдите в систему, обновите и установите необходимые пакеты, например
sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y install build-essential gcc g++ make binutils && sudo apt-get -y install software-properties-common git && sudo apt-get install build-essential cmake git pkg-config
2. Настройка удаленного доступа
В этом разделе мы настроим безопасный способ удаленного входа в систему. Также обсуждается возможность доступа к GPU-машине из любой сети.
ssh
А пока войдите в Ubuntu, откройте терминал и установите ssh-сервер:
sudo apt update &&
sudo apt install openssh-server
После этого убедитесь, что ssh-сервер установлен правильно.
sudo systemctl status ssh
и откройте брандмауэр
sudo ufw allow ssh
Проверьте свое ssh-соединение, запустив с портативного компьютера (предполагается, что он подключен к той же сети, что и ваш компьютер с графическим процессором).
ssh user@<local-ip-address>
где user - ваше имя пользователя Ubuntu, а ваш локальный IP-адрес в Ubuntu (например, 172.148.0.14) можно найти с помощью ip add
, что дает (например,)
link/ether b3:21:88:6k:17:24 brd ff:ff:ff:ff:ff:ff inet 172.148.0.14/32 scope global noprefixroute enp7s3
Запишите свой MAC-адрес (например, b3: 21: 88: 6k: 17: 24) и имя сетевой карты (например, enp7s3) на будущее.
Затем настройте ключи ssh для входа без пароля, как описано здесь. После этого, предполагая, что вы когда-либо захотите войти на свой компьютер только с этого портативного компьютера, полностью отключите возможность входа с паролем. Это позволит устанавливать ssh-соединения только от устройств с уже обмененной парой ssh-ключей, что улучшает безопасность. Отредактируйте /etc/ssh/sshd_config
(с правами sudo) в Ubuntu, чтобы добавить
#only ssh-key logins PermitRootLogin no ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no AllowUsers user PubkeyAuthentication yes # keep ssh connection alive ClientAliveInterval 60 TCPKeepAlive yes ClientAliveCountMax 10000
Не забудьте перезапустить ssh-service, чтобы он улавливал изменения с помощью
sudo restart ssh
DNS
Если вы хотите подключаться к компьютеру по ssh из-за пределов домашней сети, вам необходимо установить постоянное DNS-имя хоста, которое не зависит от глобальных IP-адресов вашего компьютера, которые ваш интернет-провайдер может изменить в любое время. Я лично пользовался бесплатным сервисом от no-IP (ссылка здесь, для начала используйте Создать свое бесплатное имя хоста сейчас из браузера Ubuntu); существуют альтернативные службы DNS, такие как FreeDNS, Dynu и т. д. Будьте изобретательны с вашим именем хоста; Не могу поверить, что mlgpu.ddns.net еще не занят. Это имя хоста будет использовано в качестве примера в этой статье.
После этого установите клиент динамического обновления (DUC), как описано здесь. Это гарантирует, что когда ваш глобальный IP-адрес действительно изменится, он будет повторно привязан к вашему имени хоста (например, mlgpu.ddns.net). Чтобы DUC запускался каждый раз с Ubuntu, добавьте новую cronjob с sudo crontab -e
(т.е. добавьте эту строку в конец файла)
@reboot su -l user && sudo noip2
и перезагрузите вашу машину.
Перенаправление порта
ssh по умолчанию использует порт 22 для подключения. Нам нужно открыть этот порт (как для протоколов TCP, так и для UDP) через маршрутизатор, чтобы иметь возможность подключаться к машине по ssh из внешней сети (вы все равно хотите отправлять эти ресурсоемкие задания на GPU из кафе, верно?). Этот параметр обычно находится на вкладке «Дополнительно / Безопасность». Ниже приведен снимок экрана с настройками моего роутера.
Необязательно: копаясь в настройках маршрутизатора, добавьте MAC-адрес и локальный IP вашей сетевой карты Ubuntu в список зарезервированных («Добавить зарезервированное правило» ) и сохраните настройки маршрутизатора в файл (на случай, если вам потребуется перезагрузить его позже).
Наконец, на своем ноутбуке отредактируйте ~/.ssh/config
, заменив user на имя пользователя Ubuntu, а HostName - на свое имя хоста DNS.
# keep ssh connection alive TCPKeepAlive yes ServerAliveInterval 60 # assign a 'shortcut' for hostname and enable graphical display over ssh (X11) Host mlgpu HostName mlgpu.ddns.net GSSAPIAuthentication yes User user ForwardX11Trusted yes ForwardX11 yes GSSAPIDelegateCredentials yes
Это позволит вам быстро подключиться к вашей машине по ssh и проверить, что DNS и переадресация портов работают с
ssh mlgpu
Это НЕ должно запрашивать пароль, и теперь вы можете использовать ssh на свой компьютер с графическим процессором из любой сети!
Пробуждение по локальной сети (WAL)
Представьте себе сценарий, в котором вы находитесь на конференции (до 2020 года она проходила в удаленном месте, кроме вашего дома - странно, я знаю!), И вы хотите обучить свой DNN на своем компьютере с графическим процессором. Но подождите, вы выключили его перед тем, как выйти из дома - о боже!
Вот тут-то и пригодятся WAL и волшебные пакеты!
В Ubuntu отредактируйте /etc/systemd/system/[email protected]
[Unit] Description=Wake-on-LAN for %i Requires=network.target After=network.target [Service] ExecStart=/sbin/ethtool -s %i wol g Type=oneshot [Install] WantedBy=multi-user.target
После этого включите услугу WOL через
sudo systemctl enable wol@enp7s3 && systemctl is-enabled wol@np7s3
Это должно вернуть «включено»; enp7s3 - это имя сетевой карты, возвращаемое командой ip add
. Наконец, проверьте настройки BIOS на «wake-on-lan» = enabled.
Теперь на своем ноутбуке установите wakeonlan через
brew install wakeonlan
Чтобы проверить, работает ли WOL, выключите Ubuntu и выполните следующую команду со своего ноутбука, используя имя хоста DNS (или IP-адрес) и MAC-адрес.
wakeonlan -i mlgpu.ddns.net -p 22 b3:21:88:6k:17:24
Это должно разбудить ваш GPU-компьютер из спящего режима или выключенного состояния (конечно, убедитесь, что он все еще подключен к источнику питания!). Если вы выбрали вариант двойной загрузки, а Ubuntu не первая ОС в меню загрузки, настройте это с помощью GRUB.
Вот и все: отключите монитор, клавиатуру и мышь от компьютера с графическим процессором, отсюда мы будем запускать все команды из удаленного сеанса ssh, запущенного на Ubuntu, с вашего ноутбука - аккуратно!
3. Забота о драйверах и библиотеках NVIDIA
Впереди еще много хороших новостей. Ubuntu 20.04 должен автоматически установить драйверы Nvidia (вместо nouveau). Давайте проверим это с nvidia-smi
Это не последняя версия драйверов. Однако мы можем оставить их для установки CUDA и cuDNN из стандартных репозиториев Ubuntu.
CUDA
Просто установите CUDA
sudo apt update && sudo apt install nvidia-cuda-toolkit
Подтвердить с nvcc --version
Наконец, создайте свой первый пример CUDA Hello World, используя файл отсюда.
nvcc -o hello hello.cu && ./hello
«Максимальная ошибка: 0,000000» означает, что ваши библиотеки CUDA работают должным образом!
cuDNN
Наконец, загрузите cuDNN v7.6.5 (5 ноября 2019 г.) для CUDA 10.1 (или для версии вашего выпуска CUDA от nvcc --version
). Вам необходимо зарегистрировать бесплатную учетную запись в программе NVIDIA Developer, чтобы загрузить cuDNN.
Из распакованного архива скопируйте библиотеки, используя:
sudo cp cuda/include/cudnn.h /usr/lib/cuda/include/ && sudo cp cuda/lib64/libcudnn* /usr/lib/cuda/lib64/ && sudo chmod a+r /usr/lib/cuda/include/cudnn.h /usr/lib/cuda/lib64/libcudnn*
и экспортируем библиотеки в $ LD_LIBRARY_PATH
echo 'export LD_LIBRARY_PATH=/usr/lib/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc && echo 'export LD_LIBRARY_PATH=/usr/lib/cuda/include:$LD_LIBRARY_PATH' >> ~/.bashrc && source ~/.bashrc
Работа сделана!
4. Создание среды Python для машинного обучения.
В Linux и macOS я лично предпочитаю использовать pip вместо conda для управления пакетами и средами Python. Ниже приведены инструкции по настройке среды ML Python3:
Прежде всего, получите последнюю версию Python3
sudo apt update && sudo apt install python3-pip python3-dev
Затем обновите pip и установите диспетчер среды
sudo -H pip3 install --upgrade pip sudo -H pip3 install virtualenv
Далее мы создадим новый каталог для наших проектов на базе GPU.
mkdir ~/gpu_ml && cd ~/gpu_ml
и создайте там новую среду Python
virtualenv gpu_ml_env
Это позволит нам устанавливать пакеты непосредственно в этой среде, в отличие от «глобальной» установки. Эту среду необходимо активировать (при каждом входе в систему) с помощью
source ~/gpu_ml/bin/activate
Вы должны увидеть (gpu_ml_env)
в своем терминале. Теперь давайте установим пакеты Python в этой среде (pip == pip3 в этой среде)
pip install jupyterlab && pip install tensorflow && pip install tensorflow-gpu
Любые другие пакеты Python, которые вам нужны, могут быть установлены аналогичным образом.
5. Простые в использовании инструменты
Баш
Есть несколько команд, которые я рекомендую добавить в ваш ~/.bash_aliases
в Ubuntu. Они будут активировать среду gpu_ml
при каждом входе в систему, а также добавлять полезные ярлыки терминала (жизнь слишком коротка, чтобы набирать jupyter lab вместо jlab, верно !?). Команды ниже (альтернативная ссылка)
На своем портативном компьютере вы можете добавить эти строки в свой ~/.profile,
, заменив ML своим именем хоста DNS (или IP-адресом) и используя свой MAC-адрес из шага № 2. Команды ниже (альтернативная ссылка)
SSHFS
Установите FUSE для macOS отсюда, настройте следующий скрипт, гдеremotedir="user@$ML:/home/user/"
, а mountdir="/Users/user/Documents/Ubuntu_mount"
- это каталог в вашей macOS, в который будут монтироваться файлы в Ubuntu. Скрипт ниже (альтернативная ссылка)
Запустите скрипт с
. ./mount.sh
и перейдите к /Users/user/Documents/Ubuntu_mount
(или просто введите cd_ML
) в macOS, чтобы увидеть файлы Ubuntu как «локальные файлы». Теперь вы можете открывать и редактировать удаленные файлы Ubuntu с помощью своего любимого редактора со своего ноутбука и многое другое - аккуратно!
Давайте проведем последний тест этой настройки (скрестим пальцы!). Со своего ноутбука
sg
что означаетssh -L 8899:localhost:8899 mlgpu.ddns.net
из наших ярлыков bash. Это должно открыть ssh-туннель на порту 8899 и войти в Ubuntu из этого типа сеанса.
jlab
который является ярлыком bash для jupyter lab --port=8899
.
Теперь откройте свой любимый веб-браузер на своем ноутбуке и перейдите к http://localhost:8899/lab
. В первый раз вам нужно будет вставить токен из вашего терминала в браузер (например, The Jupyter Notebook is running at:http://localhost:8899/?token=583049XXYZ…
)
В JupyterLab проверьте работоспособность, действительно ли мы запускаем этот ноутбук из Linux.
import platform platform.system()
и что Tensorflow обнаруживает графический процессор
import tensorflow as tf tf.config.list_physical_devices(‘GPU’)
Отсюда вы готовы реализовать свое обучение DNN и т. Д. С помощью графического процессора. Если вы выполнили все шаги из разделов с 1 по 5, ваш рабочий процесс будет довольно простым:
1. ssh и откройте ssh-туннель к серверу GPU с помощью sg
2. Запустите JupyterLab на сервере GPU с помощью jlab
3. Откройте веб-браузер на своем ноутбуке и перейдите к http://localhost:8899/lab
4. Удачного обучения - здесь начинается настоящая работа!
Послесловие
Я надеюсь, что эта статья оказалась для вас полезной, поскольку она поможет вам настроить удаленный сервер с графическим процессором для ваших нужд машинного обучения. Если вы обнаружите какие-либо улучшения в процедурах, описанных в этой статье, сообщите мне, и я сделаю все возможное, чтобы добавить их сюда.