От приема к предсказанию

Введение

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

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

  • «Эта часть выглядит хорошо? Могу ли я использовать его повторно?»
  • «Правильно ли я собрал это?»
  • «Нанес ли я покрытие с минимальным количеством пузырьков»

Эти примеры из производства, и то же самое относится ко многим отраслям. На данный момент алгоритмы добились фантастического прогресса в двух наших «чувствах»: зрении и языке. Этот блог будет посвящен зрению.

Постановка задачи

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

Вторая проблема связана с обнаружением аномалий или объектов на изображениях. Вы должны обучить алгоритм, опираясь на глубокие нейронные сети. Это требует большого количества данных и определенных технических компетенций. На производстве нет кошек, которые нужно обнаружить, так что вы действительно можете скопировать/вставить код, который вы можете увидеть во многих Colabs и учебниках, которые учат вас обнаруживать кошку? Проблема 2.

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

Выбранный нами Kaggle предназначен для обнаружения лодок на аэрофотоснимке. Это может быть очень полезно для систематического анализа изображений и применимо ко многим другим приложениям, от обнаружения нарушений безопасности до мониторинга безопасности предприятия и в сочетании с другими данными, например, с использованием геолокации. Больше примеров можно найти в этом блоге. Конкурс Kaggle, о котором идет речь, можно найти здесь: Ссылка Kaggle

Проблемы можно свести к следующей архитектуре:

Как построить конвейер данных с неструктурированными данными?

Как управлять неструктурированными данными в организованном порядке и в нужном масштабе? Должен ли я создавать хранилище метаданных вручную? Как обеспечить соответствующее масштабирование конвейера? что я могу повторно запустить часть процесса, если мои шаги преобразования изменятся? Как я могу обрабатывать потоковые изображения из приложений? Как эти изображения могут быть предоставлены нижестоящим пользователям? как я могу запросить их? …

Компьютерное зрение да, но я не эксперт!

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

Решение

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

Доступ к данным из Kaggle

Ключ API требуется в соответствии с данной документацией для загрузки и загрузки набора данных в ваше хранилище. Вы можете настроить свои кластеры с секретами Databricks (документация здесь) для подключения к вашему API, используя:

Загрузите набор данных из записной книжки, используя:

Создайте конвейер данных

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

Блоки данных работают на Apache Spark, а изображения можно рассматривать как двоичное содержимое в кадрах данных Spark. Мы используем наш AutoLoader, см. документацию здесь, чтобы гарантировать, что загрузка выполняется только один раз, может запускаться в потоковом или пакетном режиме и может масштабироваться от нескольких изображений до миллионов файлов.

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

В нашем случае мы извлекли размер изображения, формат и гистограмму, чтобы мы могли включить критерии качества, чтобы отклонить любые изображения, которые не соответствуют нашим критериям.

Теперь, когда мы определили преобразования, которые мы хотели бы применить к нашим изображениям, мы можем организовать наш конвейер с помощью многозадачного оркестратора Databricks или Delta Live Table (см. документацию здесь), что обеспечит автоматическую оптимизацию для ваших кластеров, управление производительностью таблиц, происхождение и наблюдаемость из коробки.

Загрузка необработанной маски изображения

Для каждого изображения у нас есть сопутствующий набор данных, содержащий все пиксели, в которых была обнаружена лодка. Эти данные сохраняются в виде файла CSV.

Сначала мы начнем с приема этих данных CSV и сохранения их в виде необработанной дельта-таблицы.

Преобразование масок в изображения

Теперь у нас есть вся информация о метках изображения, сохраненная в виде массива, содержащего координату пикселя (где была обнаружена лодка).

Однако модели машинного обучения работают с изображениями. Поэтому нам нужно создать Маску (изображение) на основе этой информации.

Маска будет сохранена в формате jpg, черном (без лодки) и белом (лодка обнаружена).

Объединение изображения и маски в качестве золотого слоя

В конечном счете, мы можем построить наш золотой набор данных, объединив маску и исходное изображение вместе в 1 единую таблицу.

Это простая операция соединения, основанная на идентификаторе изображения.

Мы можем использовать эту таблицу для отображения масок и изображений с помощью команды SQL.

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

Вот и все. У нас есть надежный пайплайн с возможностью наблюдения. Нам нужно будет создать несколько интеграционных тестов, и мы готовы приступить к работе!

Создайте модель сегментации изображения

Выберите подходящую архитектуру

Наш следующий шаг в качестве специалистов по данным — реализовать сегментацию изображений ML. Мы будем повторно использовать золотую таблицу, созданную в нашем предыдущем конвейере данных, в качестве обучающего набора данных.

Модели сегментации изображений могут быть сложными, и разработка методов трансфертного обучения значительно упростила обучение таких моделей на вашем конкретном наборе данных. Использование предварительно обученных моделей с заранее определенной архитектурой в заранее определенных базовых наборах данных значительно упростило разработку компьютерного зрения. Здесь мы полагаемся на библиотеку Pytorch segmentation_models.pytorch.

Разделить данные как набор данных для обучения/тестирования

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

Подготовьте набор данных

Хотя построить модель сегментации изображения можно легко, развернуть такую ​​модель в производственной среде гораздо сложнее.

Дельта-таблица для DL с Petastorm

Наши данные в настоящее время хранятся в виде дельта-таблицы и доступны в виде фрейма данных Spark. Однако PyTorch ожидает данные определенного типа. Нам нужна библиотека для создания набора данных в формате PyTorch и управления кэшированием из хранилища BLOB-объектов на локальный SSD. Для этого мы используем Petastorm, как описано в этом блоге.

Обучите базовую модель

Следующие ячейки реализуют модель машинного обучения, использующую PyTorch.

Для подготовки изображения к PyTorch (изменение размера) требуется пара преобразований, остальное — стандартный код глубокого обучения с использованием библиотеки Pytorch Segmentation Models. Обратите внимание, что мы будем использовать MLflow для автоматической регистрации метрик нашего эксперимента.

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

Точная настройка гиперпараметров с Hyperopt

Наша модель готова. Теперь настроить такую ​​модель может быть непросто. Можно выбрать различные архитектуры, кодировщики и дополнительные гиперпараметры, такие как скорость обучения.

Как правило, мы обучаем несколько моделей с различными комбинациями параметров и выбираем лучший результат на основе определенной метрики. Здесь для сегментации изображения используется метрика IoU. Как правило, этот поиск по сетке гиперпараметров выполняется последовательно, что может занять много времени. В нашем случае мы будем использовать среду выполнения Databricks, которая может распределять и распараллеливать поиск по этому параметру. Для этого мы используем библиотеку Hyperopt.

Разверните нашу модель в продакшене

Блоки данных упрощают этот процесс и ускоряют переход науки о данных от POC к производству с помощью MLFlow, предоставляя:

  • Автоматическое отслеживание экспериментов для отслеживания прогресса
  • Упаковка модели в MLFlow, абстрагирующая нашу инфраструктуру ML
  • Типовой реестр для управления
  • Пакетное обслуживание или обслуживание в режиме реального времени (развертывание в один клик)
  • Мониторинг моделей, хранилище функций и конвейерная обработка машинного обучения

Теперь наша модель обучена. Все, что нам нужно сделать, это получить лучшую модель (на основе метрики valid_per_image_iou) и зарегистрировать ее в реестре MLflow в качестве нашей рабочей модели. Этот реестр служит эталонной производственной моделью для нашего проекта.

Сохранить лучшую модель в реестре (как новую версию)

Пометить эту версию как готовую к производству

Наша модель теперь развернута и помечена как готовая к производству! Это обеспечивает управление моделью, а также упрощает и ускоряет все последующие разработки конвейера. Модель можно использовать в любом конвейере данных (DLT, пакетная обработка или работа в режиме реального времени с помощью Databricks Model Serving).

Давайте посмотрим, как мы можем использовать его для выполнения выводов в масштабе.

Вывод в масштабе

Это последний шаг нашего пайплайна и один из самых сложных:

  • Модель следует использовать в пакетном режиме или в режиме реального времени в зависимости от варианта использования.
  • Модель должна быть упакована и развернута со всеми зависимостями.
  • Чтобы упростить интеграцию, модель/структура модели должны быть абстрагированы.
  • Мониторинг обслуживания модели необходим для отслеживания поведения модели с течением времени.
  • Развертывание новой модели в продакшене должно быть в 1 клик, без простоев
  • Управление моделью необходимо для понимания того, какая модель развернута и как она обучена, для обеспечения схемы и т. д.

Как только наша модель появится в реестре, Databricks упростит эти последние шаги, развернув их одним щелчком мыши.

  • Пакетный вывод (высокая пропускная способность, но ›секундные задержки)
  • В режиме реального времени (задержки мс)

Окружающая среда Отдых

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

Установите требование модели для пакетных выводов

Вывод — пакетный режим

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

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

Выполняйте специальные выводы в виде простых запросов Python или SQL или интегрируйте их в конвейер DLT.

Вывод — в режиме реального времени с Model Serving

Второй вариант — использовать возможности Databricks Model Serving для ваших приложений. Одним щелчком мыши Databricks запустит бессерверный REST API, обслуживающий модель, определенную в MLflow.

Откройте реестр моделей и нажмите «Обслуживание моделей». Это предоставит вам возможности в реальном времени без какой-либо настройки инфраструктуры. Порция масштабируется вверх (и вниз до 0).

Выводы в реальном времени с Python REST API на нашей конечной точке обслуживания модели

Заключение

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

Databricks Lakehouse ускоряет вашу команду и упрощает переход к производству:

  • Уникальные возможности приема и подготовки данных с помощью Delta Live Table, делающие разработку данных доступной для всех.
  • Способность поддерживать все варианты использования, получая и обрабатывая структурированные и неструктурированные наборы данных.
  • Расширенные возможности машинного обучения для обучения машинному обучению
  • Покрытие MLOps позволяет вашей команде Data Scientist сосредоточиться на том, что важно (улучшение вашего бизнеса), а не на операционных задачах.
  • Поддержка всех типов производственного развертывания, чтобы охватить все ваши варианты использования без внешних инструментов.
  • Безопасность и соответствие требованиям на всех этапах, от защиты данных (таблица ACL) до управления моделями

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

Сценарий: Тарик Бухерисса и Флоран Бросс. Спасибо Bala Amavasai и Quentin Ambard за помощь.