ClearML Session — магия вне Хогвартса

от автора

В предыдущей статье мы познакомились с основными составляющими ClearML и детально рассмотрели модуль работы с данными. Теперь речь пойдёт о работе на удалённом сервере и настройках рабочего места с использованием ClearML Session. Заодно немного поговорим о модуле ClearML Agent. Поскольку эта тема вполне заслуживает отдельной статьи, в этот раз затронем агента лишь по касательной.

Что такое ClearML Session и для чего он используется в ML-задачах 

ClearML Session — это инструмент для запуска удалённых экземпляров Jupyter Notebooks и VSCode внутри какого-либо докер-контейнера и в любом развёртывании: Cloud, Kubernetes, Bare-Metal. Таким образом, инструмент позволяет создавать рабочие места для ML-инженеров и выделять нужное количество мощностей для каждого из них.

Примеры использования ClearML Session:

  1. Подключение к удаленным серверам с GPU;

  2. Дебаггинг удаленного запуска (воспроизведения) ранее выполненного эксперимента в изолированной среде;

  3. Быстрый перенос рабочего пространства на новый сервер.

С помощью этого решения можно эффективно распределять мощности и настраивать рабочие места для сотрудников. Об этом, например, рассказывал руководитель направления MLOps МТС в докладе на Data Fest Siberia.

Как применять Clear ML Session для настройки рабочей среды

Теперь рассмотрим по шагам, как настроить рабочую среду с Jupyter Lab и VSCode при использовании ClearML Session. Итак, поехали! 

Шаг 1. Регистрация и установка ClearML

Как и в прошлый раз, начинаем с регистрации на сервере ClearML или разворачиваем свой фреймворк локально. Затем получаем креды (более подробно этот момент раскрыт в официальной документации). Поскольку мы подробно рассматривали процесс регистрации и установки в предыдущей публикации, не будем повторяться и обозначим лишь основные моменты под спойлером.

Установка ClearML

Для начала установим ClearML на локальной машине:

  1. Устанавливаем у себя ClearML через pip install clearml

  2. Регистрируемся по ссылке: app.clear.ml/login

  3. Заходим в Settings → Workspace → Создаем креды «Create new credentials»

  4. Устанавливаем 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). Затем она поступает в агент на машине пользователя, где начинается воспроизведение среды и состояния проекта. Далее запускается эксперимент, и его результаты логируются.

Диаграмма ClearML Agent

Диаграмма ClearML Agent

Снова к практике 

С основными принципами работы агентов и очередей разобрались. Самое время попробовать самим создать очередь, в которую будут добавляться задачи. Агент может выполнять только одну задачу из очереди за раз. Однако он способен прослушивать несколько очередей в зависимости от установленного приоритета.

Прежде всего необходимо перейти в раздел с очередями «Queues» в пользовательском интерфейсе ClearML и создать там собственную очередь. Также можно воспользоваться очередью по умолчанию — default.

Создание очереди

Создание очереди

На удаленном сервере нужно создать агента Clear ML (подробнее смотрите в разделе руководства, посвященном, добавлению агента в файл конфигурации). Для этого придется выполнить несколько шагов.

  1. Устанавливаем зависимости на удаленном сервере и инициализируем конфигурацию агента 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.

  1. Далее запускаем агента и назначаем его на созданную очередь:

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, что воркер действительно появился и отслеживается и на него можно назначать задания.

Слева: очереди default и deep_school. Справа: воркер, слушающий выбранную очередь deep_school

Слева: очереди default и deep_school. Справа: воркер, слушающий выбранную очередь deep_school

Существуют несколько способов назначать задания:

  • Из 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) — там можно посмотреть все параметры запуска и вывод в консоли.

Созданная сессия в проекте DevOps

Созданная сессия в проекте DevOps

Кстати, если не завершить сессию и ввести в консоль 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>

Пара полезных хитростей или Как не потерять данные и конфиги

А «на десерт» у нас припасена пара полезных лайфхаков по работе с данными и конфигами.

  1. Чтобы не потерять данные при работе в контейнере, нужно смонтировать туда директорию с удаленного сервера. Это можно прописать в конфиге ClearML-агента в поле extra_docker_arguments (clearml.conf).

  2. Иногда 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, на Хабре публикуется с изменениями и дополнениями.


ссылка на оригинал статьи https://habr.com/ru/articles/824798/