ClearML Agent: обучение модели в Google Colab

Страницы:  1

Ответить
 

Professor Seleznov


pic
ClearML — это целый космос, так что мы продолжаем разбирать его компоненты. В прошлой статье мы рассматривали ClearML Session и настраивали удаленную среду разработки с Jupyter Lab и VSCode. В этот раз поговорим о ClearML Agent и разберем, как с его помощью запустить обучение на удаленном сервере, в частности, Google Colab.
Итак, поехали!
Кратко о ClearML Agent
ClearML Agent — это виртуальная среда и менеджер выполнения решений DL/ML на машинах с GPU «в одном флаконе». Он представляет собой полноценное кластерное решение.
Вот основные возможности ClearML Agent:
  • запуск экспериментов на произвольных ресурсах — локальных или в облаке;
  • воспроизведение экспериментов: агент клонирует код, устанавливает зависимости, воспроизводит окружение, а затем запускает код (это позволяет запускать задачи на удаленной машине так же, как и на локальной);
  • запуск сервисов/контейнеров для долгоживущих задач (не только коротких экспериментов);
  • управление ресурсами: агент можно запустить в CPU-only режиме или с --gpus, а также управлять выделением GPU через NVIDIA_VISIBLE_DEVICES;
  • планирование выполнения задач: можно запускать задачи по очереди/в зависимости от очередей, а также назначать им приоритеты;
  • масштабирование: можно добавлять/удалять машины из «кластера», использовать ресурсы разных машин — облачных и on-premise вместе;
  • логирование: stdout/stderr процесса, установка зависимостей, клонирование — всё логируется и может просматриваться через UI;
  • конфигурация запуска/переопределение параметров задачи через UI, SDK, CLI — без необходимости менять код, например, можно менять гиперпараметры, зависимости, аргументы командной строки, docker-образ;
  • возможность интеграции с Kubernetes/bare-metal/SLURM.
pic
Рисунок 1. Логика запуска эксперимента на удаленной машине с ClearML Agent
Если вкратце, ClearML Agent обеспечивает запуск кода на удаленной машине, воссоздавая окружение проекта так, словно эксперимент проводится локально. Заглянем под капот этого процесса.
  • При локальном запуске кода вызов Task.init(...)создает новую Task на ClearML Server. В этой Task сохраняется:
    • ссылка на Git-репозиторий;
    • незакоммиченные изменения в виде diff-патча;
    • автоматически собранный список зависимостей;
    •  параметры, метрики, stdout / stderr;
    •  конфигурации и артефакты.
    Поясним, что Task — это полное и исчерпывающее описание состояния проекта в момент запуска.
  • После локального запуска Task отправляется в очередь — канал, по которому задачи распределяются от сервера к агентам. Процесс назначения может осуществляться через SDK, CLI или ClearML UI, о чем расскажем подробнее ниже. Агент способен слушать сразу несколько очередей, откуда задачи берутся в работу. Каждый агент работает только над одним task-ом в моменте, сколько бы их не скопилось в очереди. Притом ClearML Agent выполняет следующие действия.
  • Загружает метаданные задачи с ClearML Server, получая план действий от главного вычислительного центра.
  • Клонирует Git-репозиторий, указанный в задаче, воссоздавая основу проекта. Если репозиторий приватный, необходимо предоставить SSH-ключи или credentials.
  • Применяет diff-патч с локальными незакомиченными изменениями, настраивая репозиторий под конкретную задачу. Патч применяется только к текстовым файлам.
  • Создает виртуальное окружение (pip / conda / poetry), подготавливая лабораторное пространство для эксперимента.
  • Восстанавливает зависимости (сначала из списка библиотек, собранного на локальной машине, затем из requirements.txt, если он существует).
  • Запускает основной скрипт в этом окружении, оживляя код.
  • Передает stdout, метрики и логи обратно на ClearML Server.
Таким образом, вместо грубого копирования всего проекта с локальной машины агент полноценно воссоздает его через Git, патчи и окружение.
pic
Рисунок 2. Назначение очереди на ClearML агента и последовательность воспроизведения эксперимента
Подготовка окружения
Самое время перейти от теории к практике. Работа с ClearML начинается с регистрации на сервере и установки экосистемы на локальную машину. Далее необходимо настроить ClearML Agent и создать очереди. Мы уже рассматривали эти два шага в статье про ClearML Session, так что здесь повторяться не станем и сразу пойдем дальше.
Поскольку в одной статье все не отразишь, мы подготовили несколько полезных «плюшек» для подготовки окружения. Прежде всего эторепозиторийс дообучением BERT на решение определения тональности текста. В README.md содержится подробный гайд по локальному развертыванию проекта.
Но и это не все: в файле train.py реализовано дообучение модели с использованием фреймворка PyTorch Lightning и логированием в ClearML.
Локальный запуск обучения и логирование в ClearML
Опишем пошагово логирование эксперимента в ClearML.
# Импортируем Task из библиотеки clearml
from clearml import Task
BATCH_SIZE = args.batch_size
MAX_EPOCHS = args.max_epochs
LEARNING_RATE = args.learning_rate
MAX_LENGTH = 128
SUBSET_SIZE = args.subset_size
# Самая главная часть для логгирования Task.init
# с Task.init уже работает логгирование большей части информации в ClearML Server
task = Task.init( #
project_name="BERT-Sentiment-Classification",
task_name="IMDB-Training-BERT-Base",
task_type=Task.TaskTypes.training,
)
# логгируем интересующие нас гиперпараметры
task.connect(
{
"batch_size": BATCH_SIZE,
"max_epochs": MAX_EPOCHS,
"learning_rate": LEARNING_RATE,
"max_length": MAX_LENGTH,
"subset_size": SUBSET_SIZE,
"model_name": "bert-base-uncased",
"device_arg": args.device,
"cuda_available": device_info["cuda_available"],
"device_name": device_info["device_name"],
"device_count": device_info["device_count"],
}
)
# Так как мы используем PyTorch Lightning, добавляем логгер clearml в класс модели
model = BERTSentimentClassifier(
learning_rate=LEARNING_RATE,
num_labels=2,
clearml_logger=task.get_logger(), # передаем ClearML logger
)
Как говорится, семь раз отмерь: прежде чем запускать код на удаленном сервере, сделаем это локально. Установим зависимости согласно инструкции в README.md и запустим файл train.py для начала обучения:
python train.py
Далее проверяем в ClearML UI корректность логирования.
pic
Рисунок 3. Результаты логирования метрик в ClearML UI при локальном запуске обучения
Запуск ClearML Agent в Google Colab
Для начала создадим очередь, откуда в агент будут поступать задачи. Это можно сделать в ClearML UI в разделе с очередями «Queues». Если не хочется совершать лишних телодвижений, используйте канал по умолчанию — default.
pic
Рисунок 4. Пример создания очереди через ClearML UI
Далее создаем агента, который будет слушать эту очередь. Для выполнения его действий подготовлен ноутбук в Google Colab, в котором:
  • устанавливается clearml-agent;
  • проверяется доступность GPU;
  • добавляется SSH-ключ, чтобы агент ClearML смог склонировать GitHub-репозиторий с обучением.

Инструкция по созданию SSH-ключа и добавлению его на GitHub

Генерация SSH-ключей выполняется следующей командой:
ssh-keygen -t ed25519 -C "example@gmail.com"
pic
Рисунок 5. Создание SSH-ключей
В результате будут сгенерированы два файла: id_ed25519.pub и id_ed25519.
Далее нужно:
  • Авторизоваться на GitHub, перейти в настройки: Settings → SSH and GPG keys → New SSH key.
  • Скопировать содержимое ключа с расширением .pub и вставить в поле «Key». После этого нажать кнопку «Add SSH key»:
pic
Рисунок 6. Добавление публичного SSH-ключа в GitHub для доступа к приватным репозиториям поSSH
Теперь пройдем весь путь создания агента. 
Шаг 1. Добавляем созданные SSH-ключи в папку на Google Drive.
pic
Рисунок 7. Добавление ключей в Google Drive
Шаг 2. Подключаем Google Drive в Google Colab. При этом Google запрашивает подтверждение для доступа к вашим данным:
from google.colab import drive
drive.mount('/content/drive')
Шаг 3. Подключаем и проверяем доступ к GitHub:
# копируем эти файлы из google drive в папку .ssh в Google Colab
!mkdir /root/.ssh/
!cp -r /content/drive/MyDrive/rsa_keys/id_ed25519* /root/.ssh/
# Проверяем
!ls -a /root/.ssh
# Для получения публичных ключей хоста SSH для GitHub.com добавляем github в файл known_hosts
!ssh-keyscan github.com >> /root/.ssh/known_hosts
# Проверяем, что мы можем получить доступ к нашему github
!ssh -T git@github.com # Hi {тут будет ваш никнейм}! You've successfully authenticated, but GitHub does not provide shell access.
# Добавляем переменную окружения, чтобы не отрисовывать и не выводить информацию matplotlib
!export MPLBACKEND=TkAg
Шаг 4. Устанавливаем credentials для ClearML Agent.
Как и на этапе настройки ClearML, хорошей практикой считается создание отдельных credentials для агента.

Пример создания отдельных credentials для ClearML Agent

Settings → Workspace→ Create new credentials
pic
Рисунок 8. Настройка рабочего пространства и создание кредов
Добавляем переменные CLEARML_API_ACCESS_KEY и CLEARML_API_SECRET_KEY в секретах Google Colab:
pic
Рисунок 9. Создание переменных окружения в Google Colab
Затем эти переменные используются для подключения к ClearML Server.
from clearml import Task
from google.colab import userdata
# Читаем переменные окружения
clearml_api_key = userdata.get('CLEARML_API_ACCESS_KEY')
clearml_secret_key = userdata.get('CLEARML_API_SECRET_KEY')
# Настраиваем креды для подключения к ClearML Server
Task.set_credentials(
api_host="<https://api.clear.ml>",
web_host="<https://app.clear.ml>",
files_host="<https://files.clear.ml>",
key=clearml_api_key,
secret=clearml_secret_key,
)
Шаг 5. Запускаем ClearML Agent для прослушивания очереди. По умолчанию задача выполняется в фоновом режиме.
Список аргументов для запуска агента доступен по ссылке.
pic
Рисунок 10. Запуск агента ClearML в ячейке Google Colab ноутбука
Поведение агента задается переменными окружения, которые отображаются в терминале при запуске. Задать или поменять значение переменной можно в файле clearml.conf. Или же это делается напрямую — через переменную окружения. Список переменных доступен по ссылке. Будьте внимательны: не все переменные в clearml.conf дублируются переменными окружения!
Итак, ClearML Agent на удаленном сервере создан и отслеживается, о чем сообщается в ClearML UI. Теперь на агента можно назначать задачи.
pic
Рисунок 11. Слева: очереди default и deep_school. Справа: агент, слушающий выбранную очередь deep_school
Назначение задачи в очередь
С процессом подготовки среды разобрались — переходим к следующему шагу. Существуют три способа назначения задач в очередь. Рассмотрим каждый из них подробно.
Назначение задачи в очередь средствами ClearML UI
Появившуюся в ClearML UI задачу можно клонировать, после чего она перейдет в статус Draft. Это позволяет менять гиперпараметры задачи и назначать её на выполнение в нужную очередь.
На видео ниже продемонстрировано, как это сделать:
pic
Назначение задачи в очередь с помощью SDK
В этом случае для добавления задачи в очередь необходимо дописать в код train.py следующую строку:
task.execute_remotely(queue_name="deep_school")
Вуаля! При выполнении скрипта train.py создается Task в ClearML Server, где сохраняется всё необходимое для воспроизведения эксперимента. Вызов task.execute_remotely() завершает локальное выполнение кода и назначает созданный task из ClearML Server в очередь deep_school, указанную в аргументе queue_name. Прослушивающий очередь агент извлекает задачу и запускает её выполнение с нуля.
Лайфхак:лучше вызватьtask.execute_remotely()после первой или второй эпохи, когда нет сомнений в том, что эксперимент работает локально и не падает.
Назначение задачи в очередь с помощью CLI
В этом сценарии используется уже запущенная локально задача. Она назначается на выполнение в очередь при запуске агента. При необходимости можно изменить параметры задачи: количество эпох, пути к данным или другие аргументы командной строки.
clearml-task --base-task-id b8e466bc55b24a5b9cc164b6cb986fab --queue deep_school
После выполнения этой команды агент возьмет задачу из очереди и запустит её в полностью воспроизводимой среде:
  • —base-task-id — id задачи, на основе которой будет воспроизведен эксперимент;
  • —queue — очередь, на которую назначаем задачу. Важно, чтобы был агент, который её слушает.
Документация по ClearML Task доступна по ссылке.
Вне зависимости от способа запуска логи выполнения задачи доступны в интерфейсе ClearML UI.
pic
Рисунок 13. Логи обучения задачи на удаленном сервере (в Colab)-Итак, мы рассмотрели принципы работы ClearML Agent и запуск обучения на удаленной машине с его помощью, а также способы назначения задач для агента в очередь.
Среди плюсов ClearML Agent — возможность запускать эксперименты на разных удаленных серверах c логированием в ClearML UI. Важно, что при запуске задачи в ClearML применяются все изменения в репозитории (даже незакоммиченные). Это позволяет сравнивать эксперименты и дает уверенность в их воспроизводимости. P.S. Первая версия статьи написана для блога DeepSchool. На Хабре публикуется с изменениями и дополнениями. -Источник
 
Loading...
Error