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

МЕНЮ


Главная страница
Поиск
Регистрация на сайте
Помощь проекту
Архив новостей

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Привет, Хабр! Меня зовут Дмитрий (@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

Составляя сравнительную табличку, я ещё раз убедился, что в двух этих сервисах проще перечислить общее, чем различия. Тем не менее я постарался выделить наиболее важные моменты:

;Google Colab;Yandex DataSphere

Порог вхождения;5 минут;?1 час. Нужно прочитать краткие справки, чтобы понять некоторые важные принципы работы Ценовая политика;Бесплатно;Оплачивается только фактическое время вычислений. Для слабых конфигураций и фоновых операций практически бесплатно. Для теста бонусом 3К Мощности;K80 в обычном. T4 и P100 в Pro. 2vCPU @2.2GHz;V100 + 4/8/32/80vCPU. Время жизни окружения;12 или 24 (Pro) часа;Всегда Версионирование;Результаты нужно сохранять на диск. Коммитить в репо вручную;Код, переменные и диск версионируются из коробки Смена GPU/CPU;Сессия заканчивается, данные теряются;Ничего не теряется (!) Пакеты;Новые установленные умирают в конце сессии;Окружение сохраняется Тема с корги и котиками;+;?

Тема с корги и котиками, которой так не хватает в 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.

Я специалист по машинному обучению, а не писатель — и в моём посте что-то могло остаться непонятным. Поэтому буду рад ответить на вопросы в комментариях.


Источник: habr.com

Комментарии: