В предыдущей статье мы познакомились с основными составляющими ClearML и детально рассмотрели модуль работы с данными. Теперь речь пойдёт о работе на удалённом сервере и настройках рабочего места с использованием ClearML Session. Заодно немного поговорим о модуле ClearML Agent. Поскольку эта тема вполне заслуживает отдельной статьи, в этот раз затронем агента лишь по касательной.
Что такое ClearML Session и для чего он используется в ML-задачах
ClearML Session — это инструмент для запуска удалённых экземпляров Jupyter Notebooks и VSCode внутри какого-либо докер-контейнера и в любом развёртывании: Cloud, Kubernetes, Bare-Metal. Таким образом, инструмент позволяет создавать рабочие места для ML-инженеров и выделять нужное количество мощностей для каждого из них.
Примеры использования ClearML Session:
Подключение к удаленным серверам с GPU;
Дебаггинг удаленного запуска (воспроизведения) ранее выполненного эксперимента в изолированной среде;
Быстрый перенос рабочего пространства на новый сервер.
С помощью этого решения можно эффективно распределять мощности и настраивать рабочие места для сотрудников. Об этом, например, рассказывал руководитель направления MLOps МТС в докладе на Data Fest Siberia.
Как применять Clear ML Session для настройки рабочей среды
Теперь рассмотрим по шагам, как настроить рабочую среду с Jupyter Lab и VSCode при использовании ClearML Session. Итак, поехали!
Шаг 1. Регистрация и установка ClearML
Как и в прошлый раз, начинаем с регистрации на сервере ClearML или разворачиваем свой фреймворк локально. Затем получаем креды (более подробно этот момент раскрыт в официальной документации). Поскольку мы подробно рассматривали процесс регистрации и установки в предыдущей публикации, не будем повторяться и обозначим лишь основные моменты под спойлером.
Установка ClearML
Для начала установим ClearML на локальной машине:
Устанавливаем у себя ClearML через
pip install clearml
Регистрируемся по ссылке: app.clear.ml/login
Заходим в Settings → Workspace → Создаем креды «Create new credentials»
Устанавливаем ClearML на локальную машину при помощи следующей команды:
pip install clearml
clearml-init
Затем используем креды во вкладке Local Python:
В консоли локальной машины запускаем команду clearml-init и вставляем креды:
После создания и получения кредов появится конфигурационный файл ~/clearml.conf для Linux.
А вот пути для других ОС:
Mac — $HOME/clearml.conf
Windows — \User\<username>\clearml.conf
Креды не должны коммититься и показываться публично. Примеры выше представлены только в демонстрационных целях.
После выполнения перечисленных действий появится файл clearml.conf, где будут записаны все созданные креды.
Шаг 2. Создание очереди в СlearML UI и агента на удаленном cервере
Как гласит народная мудрость, практика без теории слепа. Поэтому сперва немного поговорим о том, что такое агенты и очереди и как они работают, и только потом перейдём к пошаговым инструкциям.
Что такое агенты и очереди
ClearML Agent — это виртуальная среда и менеджер выполнения решений DL/ML на машинах с GPU, обеспечивающий полноценное кластерное решение.
В целом же агенты позволяют воспроизводить уже проведённые эксперименты и легко масштабироваться на нескольких удалённых серверах.
Например, есть код обучения, который был запущен с ClearML для отслеживания экспериментов (2 строки в начале вашего скрипта обучения). На сервере ClearML будет создана соответствующая задача. Напомним, что все сущности в СlearML относятся к типу task: для них сохраняются установленные пакеты с версиями, артефакты, не закоммиченый код, ссылки на репозиторий, запущенный скрипт, графики и др. Всё это позволяет воспроизвести эксперимент, клонировав задачу (task), изменив гиперпараметры и назначив его на очередь.
Запущенный агент будет слушать те очереди на сервере, на которые назначаются задачи. Притом в ClearML UI можно изменять приоритет выполнения задач, слушать несколько очередей и использовать множество других полезных фичей. Впрочем, здесь мы уже отклоняемся в тему для отдельной статьи ?
Для закрепления материала по ClearML Agent посмотрим на диаграмму из документации. Как видно, на сервере ClearML создаётся и назначается в очередь задача (Task). Затем она поступает в агент на машине пользователя, где начинается воспроизведение среды и состояния проекта. Далее запускается эксперимент, и его результаты логируются.
Снова к практике
С основными принципами работы агентов и очередей разобрались. Самое время попробовать самим создать очередь, в которую будут добавляться задачи. Агент может выполнять только одну задачу из очереди за раз. Однако он способен прослушивать несколько очередей в зависимости от установленного приоритета.
Прежде всего необходимо перейти в раздел с очередями «Queues» в пользовательском интерфейсе ClearML и создать там собственную очередь. Также можно воспользоваться очередью по умолчанию — default.
На удаленном сервере нужно создать агента Clear ML (подробнее смотрите в разделе руководства, посвященном, добавлению агента в файл конфигурации). Для этого придется выполнить несколько шагов.
Устанавливаем зависимости на удаленном сервере и инициализируем конфигурацию агента ClearML. В результате создается конфигурационный файл clearml.conf.
pip install clearml
pip install clearml-agent
clearml-agent init
Обратите внимание: если конфигурационный файл clearml.conf уже есть, то достаточно вписать в него блок про агента. Минимальное наполнение выглядит так:
agent {
# Set GIT user/pass credentials (if user/pass are set, GIT protocol will be set to https)
git_user=""
git_pass=""
# all other domains will use public access (no user/pass). Default: always send user/pass for any VCS domain
git_host=""
# Force GIT protocol to use SSH regardless of the git url (Assumes GIT user/pass are blank)
force_git_ssh_protocol: false
# unique name of this worker, if None, created based on hostname:process_id
# Overridden with os environment: CLEARML_WORKER_NAME
worker_id: ""
}
Полный вариант clearml.conf можно найти в репозитории ClearML.
Далее запускаем агента и назначаем его на созданную очередь:
clearml-agent daemon --queue <имя очереди>
Агент создаст виртуальное окружение, где будут устанавливаться нужные зависимости для работы вашей программы.
Приведем некоторые аргументы для его создания:
--docker <название образа>
— запуск агента в докер-режиме. Когда к нему придет новая задача, он сначала создаст докер-контейнер на основе выбранного образа (образ по умолчанию указан в конфиге clearml.conf), а затем выполнит задачу внутри него. Можно как использовать готовые образы из известных репозиториев (например, nvidia/cuda:11.6.2-cudnn8-runtime-ubuntu20.04), так и собирать образ на ML-сервере по желанию и затем подтягивать его по названию.--detached
— запуск в фоновом режиме.--gpus ****<номер GPU>
— разрешение агенту пользоваться только конкретной видеокартой (или несколькими).--foreground
— вывод дебага информации.
3 После создания на удаленном сервере clearml-agent'а (воркера) стоит проверить в интерфейсе ClearML UI, что воркер действительно появился и отслеживается и на него можно назначать задания.
Существуют несколько способов назначать задания:
Из ClearML UI, клонировав ранее выполненный эксперимент;
Из кода через API;
Из консоли через CLI.
Мы же воспользуемся СlearML Session, которая будет задачей в назначенной нами очереди.
Шаг 3. Установка и запуск ClearML Session
Переходим к третьей части Марлезонского балета последнему этапу настройки — созданию рабочей сессии на удаленном сервере.
Для этого нужно установить на локальную машину clearml-session:
pip install clearml-session
Теперь запускаем сессию с локальной машины. При этом нам доступно множество различных опций, с полным списком которых можно ознакомиться здесь.
При создании интерактивной сессии система обязательно задаст вопрос, к какой очереди подключиться, если это не указано явно. Если же вы уже создавали интерактивную сессию, ClearML уточнит, нужно ли использовать именно её:
clearml-session <опции>
Все настройки сохраняются. При создании новой сессии по умолчанию будут выставлены параметры старой.
Затем система спросит, хотите ли вы начать сессию. Чтобы не отвечать каждый раз, лучше воспользоваться аргументом — yes
.
Перечислим и другие полезные аргументы для создания сессии (полный их перечень можно посмотреть тут, а описание фичей — здесь):
--queue
— очередь, в которой создаем наше задание;--project
— создание проекта в ClearML;--docker
— указание докер образа;--packages
— указание конкретных библиотек для установки;--requirements
— указание файла с зависимостями;--store-workspace
— автоматическое создание с помощью сlearml-session снепшота всего вашего рабочего пространства при его закрытии, а затем его восстановление в новом сеансе на любой удаленной машине;--vscode-extensions
— заранее заданные расширения, которые нужно поставить в VSCode.
Начатая сессия станет заданием вашего агента. Она развернет Docker-контейнер на основе выбранного вами образа и по умолчанию установит в него Jupyter Lab, а также VSCode. Успешно созданная сессия выдаст следующее сообщение:
Interactive session is running:
SSH: ssh root@localhost -p 8022 [password: пароль]
Jupyter Lab URL: <http://localhost:8878/?token=277bfb2c594686d8c139943202d17777d0e1863057583845>
VSCode server available at <http://localhost:8898/>
После этого вы сможете подключиться к удобной среде разработки по указанному адресу.
Сессия будет создана в качестве task в проекте DevOps (на рисунке ниже это WP_Session) — там можно посмотреть все параметры запуска и вывод в консоли.
Кстати, если не завершить сессию и ввести в консоль Shutdown, то позже (даже после закрытия консоли) нетрудно переподключиться к последней сессии с помощью следующей команды:
clearml-session
Кроме того, можно подключиться к вашей сессии или сессии коллеги через --attach:
clearml-session --attach <session_id>
Чтобы пользоваться сессией после ее завершения, нужно обратиться к параметру --store-workspace. С ним весь ваш проект будет храниться в ClearML даже когда сессия закончится.
clearml-session --store-workspace ~/workspace
# Создание сессии из сохраненного воркспейса,
# но подключиться к завершенной сессии уже нельзя
clearml-session --continue-session <session_id> --store-workspace ~/workspace
Для завершения запущенной сессии нужно ввести в консоль с ней команду «Shutdown».
Если же консоль закрыта, сессию можно завершить по id через команду:
clearml-session shutdown --id <session_id>
Пара полезных хитростей или Как не потерять данные и конфиги
А «на десерт» у нас припасена пара полезных лайфхаков по работе с данными и конфигами.
Чтобы не потерять данные при работе в контейнере, нужно смонтировать туда директорию с удаленного сервера. Это можно прописать в конфиге ClearML-агента в поле extra_docker_arguments (clearml.conf).
Иногда ClearML-агент теряет свой конфиг. Его можно «напомнить», обновив переменную окружения:
export CLEARML_CONFIG_FILE=~/clearml.conf
Как видно из нашей инструкции, ClearML Session позволяет довольно быстро настроить рабочую среду с Jupyter Lab и VSCode. Конфигурационный файл clearml.conf дает возможность легко изменять важные параметры для работы с ClearML.
В свою очередь, ClearML Agent помогает создавать воркеры на удаленном сервере и назначать им задачи через пользовательский интерфейс (UI) или интерфейс командной строки (CLI). Именно об этом полезном модуле мы и поговорим в следующей статье: научимся назначать и приоритизировать задачи, воспроизводить эксперименты и использовать мощности colab. Так что продолжение следует ?
P.S.
Первая версия статьи написана для deep school-pro, на Хабре публикуется с изменениями и дополнениями.