Это самый дешевый способ разместить модели машинного обучения?

Недавно я снял видео на тему Использование обширного.ai для недорогого построения моделей машинного обучения. Это полезно для кого-то вроде меня, который хочет построить модель без бюджета. Используя «обширный. всего несколько долларов. Мой рабочий процесс заключается в том, чтобы перейти на графический процессор huge.ai, такой как RTX 3090, платя 80 центов в час, пройти некоторое обучение, провести анализ, а затем вернуться к своему ноутбуку для дальнейшей разработки моего плана атаки. Несколько повторений этого, и я готов.

Но куда идти?

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

У меня нет очевидного начального потока доходов от моих моделей для оплаты их хостинга, но я все же хочу построить несколько моделей и разместить их. Если мой дружелюбный сосед Фред слишком занят, чтобы посмотреть, то я не хочу оплачивать хостинг моделей, сидящих без дела. Вот тут-то и появляется «бессерверный».

Бессерверный

Бессерверная версия - это хорошие модели неоднородного трафика. «Бессерверный» не означает бессерверный. Вы все еще пользуетесь серверами. Вы просто делитесь ими с другими в режиме переключения контекста в черный ящик. Непрозрачные отношения между вами и сервером означают, что сложно оптимизировать базовый сервер для вашего конкретного случая использования. Переключение контекста между различными пользователями этого сервера означает, что, без вашего ведома, ресурсы загружаются и выгружаются непрерывно. За такую ​​неэффективность приходится платить, но надбавка за использование, которую вы платите за гораздо меньшее использование, означает, что выигрывают все.

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

EC2 против SageMaker против Lambda

Когда я начал искать варианты размещения моделей машинного обучения на AWS, я обнаружил, что почти все дороги ведут к Amazon SageMaker, но я обнаружил, что расходы на долгосрочный хостинг все еще выходят за рамки моего бюджета. Именно тогда я начал думать, возможно ли это с помощью AWS Lambda.

Чтобы сравнить затраты, полезно посмотреть на эквивалентные экземпляры EC2. AWS Lambda предоставляет 6 виртуальных ЦП и до 10 ГБ ОЗУ. Ближайший экземпляр EC2, который я вижу, - это c5.2xlarge с 8 виртуальными ЦП и 16 ГиБ ОЗУ. Стоимость этой машины составляет 0,34 доллара США в час на EC2 и 0,476 доллара США в час на SageMaker. Я еще недостаточно знаком с SageMaker, чтобы заметить разницу, и мои потребности в хостинге довольно просты, так что давайте потратим 0,34 доллара. В месяц это 244 доллара и почти 3 тысячи долларов в год. Это приведет к увеличению бюджета любителя и, следовательно, подпитывает мое желание искать другие варианты.

Бессерверные затраты

Https://aws.amazon.com/lambda/pricing/ дает нам калькулятор для определения стоимости хостинга нашей модели, которая сводится к памяти (RAM), умноженной на время.

Мое тестирование показывает, что для моей модели мне нужно от 720 до 860 МБ ОЗУ для каждого запроса, в зависимости от объема изображений, содержащихся в запросе. Я использовал 1024 Мбайт, чтобы получить 20% накладных расходов.

Не все запросы занимают одинаковое время. Если моделью никто не пользуется, значит, ее нет в ОЗУ. Если его нет в ОЗУ, его необходимо загрузить с кодом Python, что на данный момент занимает примерно 10 секунд.

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

Запросы на запуск без холодного пуска занимают около 1,5 секунд, что тоже не очень хорошо. Но компьютеры творит чудеса, чего вы хотите ?! Есть некоторые оптимизации, которые я не пробовал, например, использование Pillow-simd.

Величина разницы в стоимости между запросами на холодный и не холодный запуск означает, что общая стоимость очень сильно зависит от шаблонов запросов. Для простоты предположим, что я получаю 1000 запросов в день, и это все холодные запуски. Так получилось, что это нормально для уровня бесплатного пользования AWS, и это будет стоить мне колоссальных 0 долларов США. Но мы хотим, чтобы этот подход был устойчивым и масштабируемым, поэтому в наших расчетах мы не будем учитывать уровень бесплатного пользования.

Как видите, даже если я получаю 1000 посещений в день, я трачу всего 5 долларов в месяц. Если бы количество запросов достигло 1 000 000 в день, мы увидели бы меньше холодных запусков, а продолжительность была бы ближе к 1,500 мс. Это будет стоить 756 долларов в месяц, хотя я, вероятно, рассмотрю другие варианты оптимизации задолго до этого. У меня также было бы больше статистики по использованию памяти, чтобы сжать те 20% буфера ОЗУ, которые я добавил. Но в целом я бы пережил бессерверный режим, и, если бы я мог найти время между ответами на звонки от венчурных капиталистов по поводу моей новой горячей модели, я бы перенес ее на постоянные машины, получил дополнительную оптимизацию, добавил один или два графических процессора и ... вы поняли.

Разогрев холодного старта

Я сделал две ключевые вещи, чтобы сделать 10-секундное время запуска лямбда-функции более терпимым.

Первый - это запрос «запустил и забыл» к лямбда-функции, которая загружает модель, но не использует модель. Это мое «пробуждение»! request, и я вызываю его, когда вы посещаете веб-страницу, на которой размещена модель. Люди довольно медлительны (без обид), и к тому времени, когда они поймут, о чем эта веб-страница, выберут изображение для загрузки или наберут какой-то текст, эти 10 секунд уже пройдут. К моменту отправки фактического запроса модели функция должна быть запущена и готова к работе. Это потенциально удваивает количество запросов, но увеличивает затраты для меня только на 15% (10 с + 1,5 с), поскольку я плачу в зависимости от продолжительности запроса. Нет никакой гарантии, что AWS на самом деле будет делать в серверной части с этими запросами, но в их интересах кэшировать вашу функцию, и на практике это, похоже, работает достаточно хорошо.

Вторая «оптимизация» - это просто добавление визуального индикатора выполнения, который запускается быстро и становится все медленнее, медленнее и медленнее… до тех пор, пока запрос не завершится и он не перейдет к завершению. Это просто достаточно отвлекает и дает нам как минимум 10 секунд, пока человек не начнет сомневаться в силе Интернета. Я не уверен, что для моделей, которые занимают больше времени. Музыка в режиме ожидания?

Плюсы

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

Минусы

Самый большой недостаток - сложность архитектуры и развертывания. Я начал свой путь по пути AWS API Gateway + AWS Lambda + AWS EFS после того, как нашел эту публикацию на тему Платите по мере использования машинного обучения с помощью AWS Lambda.

AWS Lambda - это сервис бессерверных вычислений с оплатой по факту использования. Однако платформы машинного обучения, такие как XGBoost, слишком велики, чтобы соответствовать ограничению размера артефакта приложения 250 МБ или ограничению пространства 512 МБ / tmp. Хотя вы можете хранить пакеты в Amazon S3 и загружать их в Lambda (до 3 ГБ), это может увеличить стоимость.

Для решения этой проблемы функции Lambda теперь могут монтировать Amazon Elastic File System (EFS). Это масштабируемая и эластичная файловая система NFS, хранящая данные внутри и в нескольких зонах доступности (AZ) для обеспечения высокой доступности и надежности.

Для этой настройки требуется развернуть код в AWS Lambda и на томе AWS EFS. Следовательно, вы должны убедиться, что развертываете совместимый код в обоих местах.

Если вы используете joblib для сохранения модели, как я, и в сообщении выше предлагается сделать это с того же тома EFS после установки зависимостей Python в каталог lib / конкретной версии на EFS. объем. Любое несоответствие при регидратации модели приведет к простою.

На данный момент я не рассматривал сложность CI / CD вокруг этого, потому что я уже чувствую, что это идет по слишком сложному пути. Я хочу сделать шаг назад, написать этот пост в блоге и подумать, какое может быть лучшее решение.

Может, здесь Docker поможет? Это то, что я собираюсь рассмотреть в следующий раз.

Заключение

Сложность с выполнением CI / CD и сложность Lambda + EFS + API Gateway (API Gateway безумно сложный) не позволяют рекомендовать это другим. Хотя, когда я смотрю на свой прогнозируемый счет за AWS на март, который составляет всего 6,72 канадских доллара, трудно спорить о его стоимости. Это включает CloudFront + S3 для внешнего интерфейса, VPC, Route53 и SES, который я использую для электронной почты. Конечно, отсутствие трафика помогает.

У Джастина Пинкни есть пост о хостинге Toonify на GCP. На первый взгляд, это вариант намного проще, по крайней мере, с точки зрения инфраструктуры. Задержка запроса холодного запуска кажется больше, но его модель больше.

Скорее всего, я напишу более подробную информацию о том, как инфраструктура связана вместе и как я развертываю все это с Terraform Cloud и CircleCI, но дайте мне знать, если вам что-то конкретное интересно или вы хотите подскажите способ получше.

Если вас интересует работа с шинами, вы можете найти мою последнюю модель на сайте https://dogedreams.ai/.

Хорошего дня!