Как стать автором
Обновить

ML в облаке: как я попробовал Yandex DataSphere и почему его так непросто сравнить с Google Colab

Время на прочтение10 мин
Количество просмотров43K
Привет, Хабр! Меня зовут Дмитрий (@pagin), и я специализируюсь на вопросах ускорения и уменьшения свёрточных сетей. Моя основная работа — распознавание автомобилей и классификация транспорта, поэтому я обучаю много небольших CNN и часто пользуюсь облачными сервисами для ML. Раньше я использовал Google Colab и был в меру доволен. Но огорчался каждые 12 часов, когда ноутбук и окружение умирали. Недавно услышал про DataSphere от Yandex. Под катом расскажу про его отличия от Google Colab, опыт запуска обучения, особенности окружения и ценовую политику. Если любишь ресёрчить в ML и хочешь удобное рабочее пространство, то го под кат.

Чем я занимаюсь

Мы в TrafficData пилим ПО для оценки дорожного трафика. В процессе решаем задачу классификации транспорта на 23 типа. Топорный метод с обучением CNN на 23 класса заходит плохо из-за несбалансированности классов. Чтобы вы прочувствовали всю боль несбалансированности классов, вот распределение экземпляров на класс:
Однако есть дополнительная информация о том, что часть этих классов можно объединить в надклассы — все грузовые, все автопоезда или все автобусы. А ошибки внутри таких надклассов более предпочтительны, чем, например, между легковыми и грузовыми. Поэтому более правильное решение — одна CNN для определения надкласса и ещё 4 для уточнения подклассов. В таком случае и распределение экземпляров на класс становится более приятным:
Итого — 5 CNN по 500К весов, которые не так-то удобно учить одновременно на наших 2−3 свободных GPU. В таком контексте мне и подвернутся под руку Yandex DataSphere.

Yandex DataSphere: что это за зверь и как к нему подкатить

Разработчики Яндекса позиционируют DataSphere как платформу для исследований, разработки и эксплуатации сервисов в области анализа данных, машинного обучения и искусственного интеллекта. И тут нельзя сказать, что это ещё один «Облачный Jupyter Notebook», — решение оказывается гораздо шире. Для себя я нашёл встроенные механизмы версионирования (кода, переменных и состояний!), необычное решение выделения аппаратных ресурсов, кучу готовых сниппетов, фоновые операции, пригодность для продакшена и удобную среду для работы. Но обо всём по порядку.

Создание аккаунта и проекта

Итак, я зашёл на Yandex.Cloud. В консоли управления выбрал DataSphere. Дальше наткнулся на неочевидную вещь: чтобы создать рабочее пространство DataSphere, нужно выйти на уровень выше, зайти в биллинг и создать там свой платёжный аккаунт. Что хорошо, сейчас Яндекс даёт бонусные гранты, чтобы попробовать сервисы в Yandex.Cloud. DataSphere здесь относится ко второй строке (можно напробоваться на 3К):
После создания платёжного аккаунта достаточно зайти в DataSphere и нажать большую синюю кнопку Создать проект. Открываем проект и ждём, пока рабочее пространство будет создано. Иногда нужно подождать около 1–2 минут. Далее откроется интерфейс:
По вкладкам с первой странички лучше сразу пройтись, чтобы подробнее понять рабочие моменты. Впрочем, всё важное и интересное разберём прямо здесь.

Перенос, запуск и хранение проекта

Для начала работы со своим проектом нужно было перенести один .ipynb и заархивированный датасет на 5 ГБ (всего для работы в DataSphere доступно 300 ГБ). В DataSphere работает drag'n'drop файлов (или можно подключить свой Яндекс.Диск), причём скорость загрузки по ощущениям значительно выше, чем у Google Colab. И дальше — распаковать архив. Т. к. консольного доступа к ОС в DataSphere нет, я сделал всё через Python.
По библиотекам — практически всё любимое ML-щиками (от tensorflow до opencv) имеется. Мне пришлось накатить лишь seaborn для красоты и imgaug для аугментаций. Pip работает через символ процента:
В первый день работы встретил одну проблему. Я люблю разные необычные слои в CNN. Например, мне нравится экспериментировать с SeparableConv2D, реализация которых доступна в tensorflow.keras.layers. Этот слой присутствовал и в архитектуре, которую я использовал здесь. При компиляции CNN я получил малопонятный DeserializationException:
Пришлось потратить 10 минут, последовательно упрощая архитектуру, чтобы понять, что лишним был как раз SeparableConv2D. Неприятно, но терпимо. На моем ПК с таким же окружением всё ок, как и на Google Colab. О возможных причинах в следующем пункте.

Аппаратные ресурсы

Тут внимание и следим за руками. Способ работы с конфигурациями у DataSphere — особенная фича. Любой проект DataSphere стартует в бессерверном режиме. Выбор мощностей происходит уже при исполнении конкретной ячейки. По умолчанию ячейки будут исполняться в самой простой 4-ядерной конфигурации. Всего конфигураций 5:
Чтобы выполнить ячейку кода на другом железе, в начале ячейки нужно указать номер аппаратного набора, например — #!g1.1. На выделение ресурсов уходит 20−30 секунд. Правда, когда я запускал первый раз, пришлось ждать ≈5 минут. Я даже подумал, что-то сломалось, но позже поддержка Яндекса объяснила, что я попал на пиковую нагрузку, с которой уже справились.
Attention: Видимо, сервис набирает обороты и активных клиентов и отчасти защищается от майнеров, поэтому с 20.06.2021 доступ к конфигурациям g1.1 ограничен. Для доступа необходимо пополнить баланс до суммы 500 ₽ или отправить в поддержку запрос с описанием задачи. Зато теперь конфигурации g1.1 будут с большей вероятностью доступны.
По доступности аппаратных наборов. За 5 дней моих экспериментов всегда всё было доступно и выделялось. Лишь один раз g1.1 были недоступны и DataSphere попросил меня подождать несколько минут. И правда — потом подключилось.
Совершенно нормально и приветствуется, что разные ячейки выполняются на разных аппаратных конфигурациях. Все переменные и состояния между ними удачно передадутся. Ну не вау ли!
Не совсем вау. Насчёт проблемы из предыдущего пункта. Я не шарю во внутренних реализациях DataSphere, но по traceback могу предположить, что как раз эта фича с переносом состояний и стала причиной неработающего SeparableConv2D в нашем проекте. Ведь эти состояния нужно сериализовать в одном аппаратном окружении и десериализовать в другом. Но возможно, это лишь единичная проблема или просто я не прав насчёт DeserializationException. С другими слоями проблем я не встретил.
Тем не менее я запустил обучение в окружении DataSphere и, к сожалению, никак не смог полностью загрузить V100. Даже отключая аугментацию и нацеливая CPU полностью на формирование батчей, я не смог добиться утилизации GPU более 5−10 %. Просто очень оверхедная мощность GPU для нашей небольшой CNN. А вот если бы мы решились обучать в облаке нашу YOLOv4.5, то V100 как раз был бы к месту.

Фоновые операции

Фича, которую просто невозможно обойти стороной. Мне её очень не хватало в работе с Google Colab. Иной раз поставишь в Google Colab обучаться модель, а сам кукуешь. Вроде хочется провести эксперименты над другими моделями или датасетом в это время. Но для этого нужно заводить другой ноутбук, заново ставить окружение — короче, неприятно.
А здесь идея простая — можно запускать долгие операции (например, обучение моделей) в фоновом режиме, т. е. асинхронно. При этом можно продолжать работу с ноутбуком. Однако стоит иметь в виду, что:
  1. Запуск операций в фоновом режиме не гарантирует немедленный запуск исполнения.
  2. Фоновые операции в общем случае могут выполняться дольше, чем обычные операции.
  3. Фоновые операции могут выполняться на прерываемых виртуальных машинах и ресурсах.
  4. Фоновые операции тарифицируются по другим правилам.
И если первые три пункта здесь не очень радуют, то четвёртый приятный (подробнее через несколько абзацев).
Для текущей задачи фоновые операции мне не понадобились, т. к. датасет уже плотно исследован и нет необходимости в каких-то отдельных экспериментах. Я лишь убедился, что обучение успешно запускается в фоне и ячейки ноутбука доступны к выполнению.

Версионирование

DataSphere интегрирован с системой контроля данных DVC и системой контроля версий Git. Связка с Git сделана очень плотно — можно управлять практически без консоли. В верхнем и левом тулбарах есть специальные меню и область для просмотра и управления ветками. Интерфейс Git здесь не самый привычный, но приятный и понятный:
Отдельно стоит упомянуть про чекпоинты — код ячеек, вывод и значения переменных в определённый момент времени. Для них слева в тулбаре тоже есть своё меню. В любой момент можно переключиться на одно из предыдущих сохранённых состояний. Сохранить состояние можно самостоятельно, или оно сохранится автоматически при бездействии ВМ. Просто необходимый и уникальный инструмент для воспроизводимости экспериментов в ML. Что круто, ими можно поделиться вместе с ноутбуком.
Для нашего проекта Git был не нужен, т. к. скрипт обучения умещается в одну портянку.ipynb. Поэтому я лишь погипнотизировал предоставляемый интерфейс. А вот сохранение чекпоинтов пригодилось и сыграло на руку. Можно удобно распарсить датасет в переменную и затем сохранить состояние в чекпоинте. И при перезапуске обучения нужно лишь вернуть состояние этого чекпоинта. В моём случае это экономит приятные 4−5 минут. Т. е. не нужно снова бежать по 23 папкам, изменять разрешение изображений и составлять список объектов.

Ценовая политика

Тут тоже интересный подход. При работе с сервисом DataSphere вы платите за фактическое использование вычислительных ресурсов — посекундно тарифицируется время вычисления. То есть если ячейка закончила свои вычисления и CPU/GPU больше не загружен, то вы не платите ни цента. Вычисление общей стоимости происходит с помощью юнитов. Чем мощнее конфигурация, тем больше юнитов в секунду будет назначено:
И чтобы посчитать общую стоимость, необходимо время работы умножить на количество юнитов и на стоимость одного юнита. Скажу проще. 1 час работы самой слабой конфигурации — это 10,8 ₽. А 1 час работы g1.1 — это 194,4 ₽.
Стоимость фоновых операций высчитывается тоже с помощью юнитов. Но стоит отметить, что их выполнение значительно выгоднее. 1 час работы самой слабой конфигурации — это 2,7 ₽. А 1 час работы g1.1 — это 40,5 ₽. Ну и стоит затронуть вопрос трафика. Входящий не тарифицируется. Исходящий не тарифицируется до 10 ГБ.
У меня на полное обучение одной CNN в такой загрузке ушло ≈4 часа и было потрачено ≈600 ₽. И тут мне подумалось, что хочется ещё конфигурацию подешевле с GPU попроще. Ну хотя бы T4 или K80, как у Colab. Ведь загрузить V100 на 100 % — это задачка совсем непростая. Особенно когда ты просто учишь небольшие CNN.

Сравнение с Google Colab

Составляя сравнительную табличку, я ещё раз убедился, что в двух этих сервисах проще перечислить общее, чем различия. Тем не менее я постарался выделить наиболее важные моменты:
Тема с корги и котиками, которой так не хватает в Yandex DataSphere
Тут ещё для сравнения ценообразования — у Google Colab есть подписка за 10 $, где даётся приоритетный доступ к GPU и время жизни ноутбуков увеличивается до 24 часов! (На восклицательный знак смотреть с иронией.) Понятно, что, учитывая специфику DataSphere, подписка нам обошлась бы сильно дороже. И оплата только фактического времени вычислений освобождает нас от необходимости бежать выключать ноутбук после конца обучения. Но для себя я пока не понял, какой тип тарификации мне больше нравится.
У каждого сервиса есть свой ряд плюсов. Google Colab проще для старта, бесплатен, имеет более гибкий набор GPU и тему с корги. А DataSphere более гибок в выборе CPU, имеет удобное рабочее пространство, версионирование из коробки, сохранение окружения и фоновые операции. Как итог сложно сказать, что лучше или хуже. Но можно разделить сферы применения.
Если тебе срочно нужен облачный Jupyter для учёбы или коротких экспериментов и ты не собираешься к нему часто возвращаться, то Google Colab будет достаточно. А если ты хочешь перенести важную часть своей работы в облако, проводить там большие ресёрчи, делиться ими с коллегами и не переживать за сохранность данных, то предпочтительнее окажется DataSphere.

Что я нашёл для себя в Yandex DataSphere

Изначально я думал, что будет просто аналог Colab, а получилось иначе/самобытно/вдохновляюще. Очень порадовали версионирование из коробки, сохранность окружения и фоновые операции. Огорчил ограниченный выбор GPU — мне кажется, не все учат BERT и кому-то тоже будет достаточно K80 или T4. В целом DataSphere привлёк и уже стал закладкой в моём браузере. В ближайшее время планирую продолжить эксперименты — хочу потестить устойчивость фоновых операций, доску TensorBoard и шеринг экспериментов.
P. S.
Я специалист по машинному обучению, а не писатель — и в моём посте что-то могло остаться непонятным. Поэтому буду рад ответить на вопросы в комментариях.
Теги:
Хабы:
Всего голосов 26: ↑26 и ↓0+26
Комментарии17