И разверните энергоемкую модель глубокого обучения в масштабном производстве.

Многие люди интересовались архитектурой Cartoonizer. Итак, Теджас и я (Нирадж) попытались объяснить процесс, который мы использовали, чтобы заставить его работать. Престижность Algorithmia за работу нашего конвейера вывода видео. 😇

Ожидается, что в современном быстро меняющемся мире эксперты по машинному обучению возьмут на себя множество обязанностей в рабочем процессе машинного обучения. Одна из важнейших задач рабочего процесса - обслуживание моделей в производстве! Этот, казалось бы, важный элемент в конвейере часто упускается из виду, поэтому он не может обеспечить ценность для клиентов.

Инженерная дисциплина явно не может существовать без работы (данных) ученых - MLE (Machine Learning Engineering) построена на работе науки о данных, но инженерия - это то, как наука применяется в мире.
-
Калеб Кайзер

В этой статье объясняется наша попытка не только недорого обслуживать вычислительно-ресурсоемкую модель GAN в производстве, но и масштабировать ее по горизонтали.

ML Горе 😅

Если вы знакомы с размещением REST API, он гарантирует следующие основные вещи:

  1. Быстрый прототип во Flask
  2. Настройка среды
  • Экземпляр GCP или AWS
  • Системные зависимости, а также зависимости от Python (pip)
  • Прокси сервер
  • Несколько рабочих для горизонтального масштабирования

Для инженера машинного обучения второй пункт утомителен и менее чем удовлетворителен с точки зрения масштабируемости и затрат на сервер. Прошли те времена, когда ответственность за обслуживание серверов лежала на ваших плечах! Я говорю об аутсорсинге и полной автоматизации 2-го пункта. Введите Google Cloud Run!

Запускаем Cloud Run!

Прежде чем я перейду к тому, как работает архитектура, я хотел бы побаловать вас некоторой пользовательской статистикой и дать вам представление о трафике, который мы могли бы обслужить с минимальными затратами!

Трафик мы получили 😮

С момента запуска нашего демонстрационного веб-приложения 26 июля у нас было около 12 000 пользователей менее чем за 3 недели! 6000 из тех, что приходят в первые 4 дня - большая часть трафика поступает из наших постов на Reddit и статей в TheNextWeb, которые затем были перехвачены другими блогами из различных страны тоже.

В любой момент этого пикового времени у нас было около 50+ пользователей, запрашивающих наши изображения и видеоуслуги.

Трафик, к которому мы готовы 💪

Cloud Run позволяет нам создавать 1000 экземпляров в зависимости от входящего трафика. По умолчанию он составляет не более 80 запросов на экземпляр контейнера. Итак, в идеале мы можем обрабатывать 80 000 запросов в секунду!

НО, поскольку процесс создания мультфильмов был уже тяжелым, мы ограничили нашу программу 8 рабочими на экземпляр. Это означает, что один экземпляр был ограничен 8 одновременными запросами. 9-й запрос будет перенаправлен на второй экземпляр, если вообще будет. Таким образом, мы можем обслуживать 8000 запросов в секунду!

Обработка видео на CPU или GPU? 🎥

Нашим уникальным коммерческим аргументом было создание архитектуры, которая позволила бы нам обслуживать видео вместе с изображениями с минимальными затратами. Видео - это не что иное, как набор изображений (кадров), и мы должны сделать каждый кадр карикатурным.

На 8-ядерном процессоре i7 на создание мультфильма с разрешением 1080p требуется около 1 секунды. К сожалению, Google Cloud Run предоставляет не более 2 виртуальных ЦП, что увеличивает время до 3 секунд на изображение! Вы можете представить себе ужас обработки видео на таком компьютере! 10-секундное видео с частотой 30 кадров в секунду займет 15 минут! 😱

Мы использовали 2 техник, чтобы уменьшить время вывода видео.

  • Уменьшите разрешение изображения до 480p: это существенно снизило нагрузку на кадр без заметного изменения качества. Это помогло нам достичь времени вывода 1 секунда на изображение.
  • Уменьшите частоту кадров видео: мы уменьшили ее с 30 до 15 кадров в секунду, что резко сократило время обработки видео.

Мы экспериментировали с tenorflow lite для квантования весов, чтобы ускорить конвейер вывода, но столкнулись с проблемами при обслуживании моделей для динамических размеров входного изображения. Хотя это сработало для изображения фиксированного размера, мы не нашли оправданным компромисс, связанный с задержкой и вычислением.

Даже при уменьшении разрешения и уменьшении количества кадров в секунду, мультипликация видео занимала 2,5 минуты для 10-секундного видео. Это все еще было слишком высоким, учитывая пользовательский опыт. Следовательно, преобразование видео в мультфильм потребовало дополнительной артиллерии.

Преимущество скорости на GPU ⏩

Использование графического процессора позволило увеличить скорость изображения в 10 раз. Время вывода сократилось до 50 мс / изображение. Это означало, что мы могли нарисовать и показать 10-секундное видео за 7 секунд! Теперь мы в деле.

По крайней мере, мы так думали. Было 2 вопроса, которые не давали нам покоя -

  1. Как мы масштабируем сервис GPU, чтобы не отставать от масштабирования, подобного Cloud-Run?
  2. Как мы можем сделать это рентабельно?

Одним из способов было развернуть модель в экземпляре Google Compute Engine в качестве API, но это не позволило масштабировать Cloud Run. Все параллельные запросы будут помещены в очередь, и графический процессор станет узким местом в нашем конвейере. Кроме того, круглосуточная работа инстанса - это не дешево 💰

Как масштабировать с помощью графического процессора (недорого)?

Cloud Run, будучи управляемой контейнерной службой без сохранения состояния, не может позволить себе поддержку GPU. Поэтому мы передали вычисления на GPU службе под названием Algorithmia вместо того, чтобы сдавать в аренду дорогой сервер Google Compute Engine. Причина двоякая -

  1. Прежде всего, он может похвастаться возможностью масштабировать развернутые модели глубокого обучения в производстве! Он может обрабатывать 24 одновременных запроса на каждый экземпляр вычислений на GPU. Кроме того, он может автоматически масштабироваться до 80 экземпляров в любой момент времени.
  2. Поскольку мы создавали его как хакерский прием на выходные, мы хотели оправдать потраченное время; здесь Algorithmia удивила превосходной гибкой платформой, позволяющей легко развертывать модели машинного обучения с поддержкой графического процессора и сконфигурированными средами, не беспокоясь о том, совместимы ли драйвер графического процессора и версия тензорного потока, если вы понимаете, о чем я. :П

Это означало, что мы могли удовлетворить около 1500+ видео запросов одновременно и сравнительно недорого!

Обучение

80 запросов на одном экземпляре! 🤔

Наш Flask API был запрограммирован для обработки 8 одновременных запросов путем создания 8 воркеров с помощью Gunicorn, НО мы не изменили настройку по умолчанию 80 запросов на экземпляр в Cloud Run.

Это означало, что за все время создавался только один экземпляр, и, возможно, запросы пользователей помещались в очередь на нашем сервере Flask. Обратной стороной является то, что пользователю приходилось дольше ждать, чтобы получить свои мультяшные изображения и видео ☹️

Положительным моментом является то, что нам выставили счет только за один экземпляр. Чем меньше количество запросов на экземпляр, тем больше будет порожденных экземпляров, тем самым увеличивая оплачиваемое время экземпляра. Но перенаправление запросов на отдельные экземпляры означает лучшее и быстрое удовлетворение запросов пользователей. 😉

Будущее

Мы предполагаем, что это будет использоваться для следующего -

  • Создавайте быстрые прототипы или спрайты для аниме, мультфильмов и игр.
  • Поскольку он подчиняет черты лица и информацию в целом, его можно использовать для создания минималистичного искусства.
  • Игры могут очень легко импортировать короткие видеоролики, без использования захвата движения
  • Может быть смоделирован как помощник графического дизайнера или аниматора.

Если у вас есть что-то интересное для демонстрации, напишите нам!

Код для демонстрации веб-приложения доступен на Github! Попробуйте демо здесь!