TensorFlowGPU, JupyterLab, CUDA, cuDNN, перенаправление портов, конфигурация DNS, SSHFS, bash

Преимущества использования графических процессоров для вашего рабочего процесса машинного обучения обсуждались ранее. Цель этой статьи - обобщить шаги по настройке машины для личных проектов машинного обучения. Я последовал аналогичному руководству из 2017 года и обнаружил, что с тех пор многие шаги изменились - к лучшему - в 2020 году. Кроме того, я предложу несколько процедур, которые сделают ваш удаленный рабочий процесс более простым и безопасным, на основе мой опыт работы с системами DAQ во время докторской диссертации.

К концу статьи вы сможете запустить удаленный сеанс JupyterLab, запущенный на компьютере с GPU-хостом, с вашего ноутбука. Более того, вы сможете удаленно включить машину из любого места и смонтировать ее файловую систему прямо на вашем ноутбуке.

Контур:

  1. Установка и настройка Ubuntu 20.04 (автономный / с двойной загрузкой / WLS2)
  2. Настройка удаленного доступа (ssh, WOL, конфигурация DNS, перенаправление портов)
  3. Забота о драйверах и библиотеках NVIDIA (CUDA, cuDNN)
  4. Создание среды Python для машинного обучения (TensorFlow, JupyterLab)
  5. Удобные инструменты: монтирование удаленных каталогов с помощью SSHFS, установка некоторых часто используемых команд в качестве псевдонимов bash

Требования:

  1. Ноутбук / настольный компьютер, на котором вы обычно работаете. Я использую MacBook Pro 2015 с macOS 10.15.
  2. Например, компьютер с графическим процессором - это может быть ваш текущий игровой ПК. Вам не нужно тратить свой бюджет на дорогостоящий графический процессор, чтобы начать обучение DNN! Мое оборудование в настоящее время довольно скромное:
    Процессор: AMD Ryzen 5 2600X (3,6 ГГц, шестиядерный)
    Графический процессор: NVIDIA GTX 1660 (6 ГБ VRAM)
    ОЗУ: 16 ГБ (DDR4 3200 МГц)
    Хранение: 512 ГБ NVMe M.2 (SSD ), Жесткий диск 512 ГБ
    Блок питания: 700 Вт
    Вам также понадобятся монитор, клавиатура и мышь, пока мы не закончим настройку удаленного доступа.
  3. Доступ на уровне администратора к настройкам вашего роутера (необязательно)
  4. Некоторое знакомство с Linux и терминалом

1. Установка и настройка Ubuntu 20.04

ОС Windows не подходит - на мой взгляд и мнение других - для разработки машинного обучения или работы в сети. Поэтому для этой цели мы настроим ОС Linux. Ubuntu Desktop 20.04 (скачать здесь) - идеальный выбор для этого, поскольку многие функциональные возможности работают из коробки, что позволяет нам сэкономить время на настройку по сравнению с другие дистрибутивы Linux. У вас есть три варианта продолжения:

  1. Установить только Ubuntu.
  2. Двойная загрузка Ubuntu вместе с существующей ОС Windows. Следуйте инструкциям здесь (рекомендуемый вариант).
  3. Используйте 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. Удачного обучения - здесь начинается настоящая работа!

Послесловие

Я надеюсь, что эта статья оказалась для вас полезной, поскольку она поможет вам настроить удаленный сервер с графическим процессором для ваших нужд машинного обучения. Если вы обнаружите какие-либо улучшения в процедурах, описанных в этой статье, сообщите мне, и я сделаю все возможное, чтобы добавить их сюда.