В этом посте мы будем обслуживать pyt🔥rch модель глубокого обучения с AWS lambda. Простота и эффективность этого подхода поразительны. Для многих случаев использования это значительно упростит наш производственный конвейер. Вдобавок к этому мы, вероятно, увидим улучшения в различных показателях по всем направлениям - мы коснемся некоторых из них в ходе этой публикации. Код будет предоставлен по мере продвижения, чтобы вы могли быстро начать работу 🏃.

Основная 🔑 статьи - преодоление жесткого ограничения размера пакета развертывания AWS Lambda (250 МБ без сжатия) путем создания больших зависимостей (например, numpy и pytorch) из исходного кода. Никаких хаков или сложных обходных путей, никакого глубокого дерьма.

  • Если вы используете другую библиотеку / фреймворк глубокого обучения (например, keras / tensorflow), вы сможете следить за этим сообщением и делать замены там, где это необходимо. То же самое и с другим облачным сервисом.
  • Если вы обслуживаете производственные модели изначально на мобильных устройствах (например, CoreML или tensorflow на Android), вы можете рассмотреть этот подход, поскольку нашу лямбда-функцию можно вызывать непосредственно из любого веб-приложения или мобильного приложения.

Бизнес-метрики (стоимость / задержку можно немного настроить)

  • Стоимость 💰 - вы платите только за потраченное время вычислений - плата не взимается, когда ваш код не работает. В нашем примере (ResNet-18, предварительно обученный в ImageNet), классификация 100000 изображений в месяц будет стоить ~ 13,22 доллара в месяц (меньше, если бесплатный уровень).
  • Задержка 🕐 - наша лямбда-функция выполняется и возвращает наши результаты через ~ 2,7 секунды. Для многих случаев использования это приемлемо, для некоторых - нет 🚗
  • Отсутствие администрирования - лямбда позаботится обо всем, что необходимо для запуска и масштабирования 📈 вашего кода с высокой доступностью

Почему (с нашей точки зрения разработки программного обеспечения)

  • Уменьшение дублирования - мы можем обслуживать нашу модель через различные интерфейсы (например, веб, мобильные устройства, чат-боты и т. Д.). Необходимость экспортировать нашу модель в разные библиотеки / фреймворки, переписывать код вывода и тестировать для каждой поддерживаемой платформы звучит болезненно 😖
  • Гибкость - во второй части этой серии я представлю пример полного производственного конвейера (т.е. интерфейс загружает изображение в s3 и соответствующие метаданные (например, демографические данные пациента, симптомы и т. Д.) В базу данных, которая запускает наша лямбда-функция, которая выполняет и отправляет результаты обратно в базу данных, которую затем извлекает наш интерфейс) 🏃
  • Улучшенная модульность 🗂 - обновление нашей модели становится тривиальным. Просто обновите объект s3, где он хранится. Не нужно прикасаться к лямбде или любой другой части вашего конвейера. Это позволит непрерывно строить и развертывать модели по мере развития НИОКР, сбора большего количества данных и повышения точности 🎯. Без головной боли 🤕
  • Экологичность 🌏 - мы хорошо разбираемся в инструментах, с которыми работали во время исследований и разработок, а также в хорошо протестированном коде с большим оттоком. Не нужно переключаться на другую производственную среду
  • Повышенная безопасность - наша модель мажорная 👜. Наша модель никогда не нуждается в хранении на диске в лямбда-выражении (если вы параноик) и, вероятно, должна быть зашифрована. То же самое и с пользовательскими данными 🔐
  • Намного меньше кода ✊

Обзор

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



Майор 🔑

Lambda накладывает некоторые ограничения, которые могут быть жесткими для сценариев использования глубокого обучения.

Основное ограничение, с которым мы столкнемся, - это ограничение в 250 МБ на размер несжатого пакета развертывания (ограничение в 50 МБ на размер сжатого пакета развертывания не применяется, если мы извлекаем из s3) ‹major 🔑 # 2. Ключом к уменьшению размера нашего пакета развертывания является создание больших зависимостей (в этом примере numpy и pytorch) из исходного кода (сборка из исходного кода также создает символ 💪). Никаких хаков или сложных обходных путей не требуется 🙏.

Один только pytorch имеет размер более 1 ГБ при установке из предварительно созданных двоичных файлов. Собирая pytorch из исходников, мы можем уменьшить его размер до ~ 124 МБ. Мы экономим так много места, потому что указываем, что не используем CUDA (в AWS Lambda пока нет такой возможности).

Наша лямбда-функция (срабатывает при загрузке изображения на Amazon s3) 😎

Вот и все ... Это лишь верхушка айсберга. При необходимости зависимости Python могут быть значительно сокращены (некоторые флаги сборки / оптимизации и простой сценарий, подобный этому могут сократить общий размер вдвое, избегая дублирования данных). Если вы нажмете масштаб, вы можете подумать об экспорте обученной модели в onnx, а затем импортировать ее в более ориентированную на производство библиотеку глубокого обучения, такую ​​как caffe2.

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

Если вашей компании нужен опытный инженер-программист, специализирующийся на инженерии данных / науке и глубоком / машинном обучении, свяжитесь со мной или посетите https://waya.ai для получения консультационных услуг.