Руководство по глубокому обучению на уровне производства
:ferry:
[Примечание: этот репозиторий всё ещё находится в разработке, и мы будем рады любым отзывам и вкладам
]
Развёртывание моделей глубокого обучения на производстве может быть сложной задачей, поскольку это выходит далеко за рамки обучения моделей с хорошей производительностью. Для развёртывания системы глубокого обучения производственного уровня необходимо разработать несколько отдельных компонентов (см. ниже):
Этот репозиторий призван стать руководством по созданию систем глубокого обучения для производственных целей, которые будут развёрнуты в реальных приложениях.
Материал, представленный здесь, заимствован из Full Stack Deep Learning Bootcamp (от Питера Аббела из Калифорнийского университета в Беркли, Джоша Тобина из OpenAI и Сергея Караяева из Turnitin), TFX workshop от Роберта Кроу и Pipeline.ai's Advanced KubeFlow Meetup от Криса Фреди.
Проекты машинного обучения
Забавный факт: 85% проектов ИИ терпят неудачу. 1 Возможные причины включают:
- Техническую неосуществимость или плохо определённые границы проекта
- Отсутствие перехода к производству
- Неясные критерии успеха (метрики)
- Плохое управление командой
1. Жизненный цикл проектов ML

- Важность понимания передовых достижений в вашей области:
- Помогает понять, что возможно
- Помогает знать, что попробовать дальше
2. Ментальная модель для проекта ML
Два важных фактора, которые следует учитывать при определении и приоритизации проектов ML:
- Высокая значимость:
- Сложные части вашего конвейера
- Где «дешёвое предсказание» ценно
- Где автоматизация сложного ручного процесса ценна
- Низкая стоимость:
- Стоимость определяется:
- Доступностью данных
- Требованиями к производительности: затраты, как правило, растут сверхлинейно в зависимости от требований к точности
- Сложностью задачи:
- Некоторые сложные задачи включают неконтролируемое обучение, обучение с подкреплением и некоторые категории контролируемого обучения
Полный стек конвейера
На следующем рисунке представлен общий обзор различных компонентов системы глубокого обучения производственного уровня:
Далее мы рассмотрим каждый модуль и порекомендуем наборы инструментов и фреймворков, а также лучшие практики от практиков, соответствующие каждому компоненту.
1. Управление данными
1.1 Источники данных
- Глубокое обучение под наблюдением требует большого количества размеченных данных
- Разметка собственных данных стоит дорого!
- Вот некоторые ресурсы для данных:
- Открытые исходные данные (хорошо для начала, но не преимущество)
- Увеличение объёма данных (обязательно для компьютерного зрения, вариант для НЛП)
- Синтетические данные (почти всегда стоит начинать с них, особенно в НЛП)
1.2 Маркировка данных
-
Требуется: отдельный программный стек (платформы маркировки), временный персонал и контроль качества
-
Источники рабочей силы для маркировки:
- Краудсорсинг (Mechanical Turk): дёшево и масштабируемо, менее надёжно, требуется контроль качества
- Наём собственных аннотаторов: меньше контроля качества, дорого, медленно масштабируется
- Компании, предоставляющие услуги по маркировке данных:
-
Платформы для маркировки:
-
Diffgram: Программное обеспечение для обучения данным Компьютерное зрение
-
Prodigy: инструмент аннотирования, основанный на активном обучении (разработчики Spacy), текст и изображение.
-
HIVE: платформа искусственного интеллекта для компьютерного зрения.
-
Supervisely: целая платформа компьютерного зрения.
-
Labelbox: компьютерное зрение.
-
Scale: платформа данных ИИ (компьютерное зрение и NLP).
1.3. Хранение данных
Варианты хранения данных:
-
Хранилище объектов: хранение двоичных данных (изображения, звуковые файлы, сжатые тексты).
- Amazon S3.
- Ceph Object Store.
-
База данных: хранение метаданных (пути к файлам, метки, активность пользователей и т. д.).
- Postgres — правильный выбор для большинства приложений, с лучшим в своём классе SQL и отличной поддержкой неструктурированных JSON.
-
Озеро данных: агрегирование функций, которые невозможно получить из базы данных (например, журналы).
-
Магазин функций: хранение, доступ и совместное использование функций машинного обучения. Извлечение функций может быть вычислительно затратным и практически невозможным для масштабирования, поэтому повторное использование функций различными моделями и командами является ключом к высокой производительности команд машинного обучения.
- FEAST (Google cloud, Open Source).
- Michelangelo Palette (Uber).
Предложение: во время обучения копируйте данные в локальную или сетевую файловую систему (NFS).
1.4. Управление версиями данных
Это «ОБЯЗАТЕЛЬНО» для развёрнутых моделей машинного обучения: развёрнутые модели машинного обучения являются частью кода, частью данных. Отсутствие управления версиями данных означает отсутствие управления версиями моделей.
Платформы управления версиями данных:
- DVC: система управления версиями с открытым исходным кодом для проектов машинного обучения.
- Pachyderm: управление версиями для данных.
- Dolt: управление версиями для базы данных SQL.
1.5. Обработка данных
Обучающие данные для производственных моделей могут поступать из разных источников, включая хранимые данные в базах данных и хранилищах объектов, обработку журналов и выходные данные других классификаторов.
Существуют зависимости между задачами, каждая из которых должна запускаться после завершения своих зависимостей. Например, обучение на новых данных журнала требует предварительного этапа обработки перед обучением.
Make-файлы не масштабируются. В этом отношении становятся весьма важными «менеджеры рабочих процессов».
Управление рабочим процессом:
- Luigi от Spotify.
- Airflow от Airbnb: динамичный, расширяемый, элегантный и масштабируемый (наиболее широко используемый).
- Рабочий процесс DAG.
- Надёжное условное выполнение: повторная попытка в случае сбоя.
- Pusher поддерживает образы Docker с TensorFlow Serving.
- Весь рабочий процесс в одном файле .py.
Победитель в номинации «Язык программирования»: Python.
Редакторы:
- Vim.
- Emacs.
- VS Code (рекомендуется автором): встроенные git-стадии и diff, проверка кода, удалённое открытие проектов через ssh.
Ноутбуки: отличная отправная точка для проектов, трудно масштабировать (забавный факт: архитектура Notebook-Driven от Netflix является исключением, полностью основанным на наборах nteract).
- nteract: новый пользовательский интерфейс React для Jupyter ноутбуков.
- Papermill: библиотека nteract, созданная для параметризации, выполнения и анализа Jupyter ноутбуков.
- Commuter: ещё один проект nteract, который обеспечивает отображение ноутбуков только для чтения (например, из корзин S3).
- Streamlit: интерактивный инструмент для работы с данными с апплетами.
Вычислительные ресурсы. Рекомендации
1:
- Для физических лиц или стартапов:
- Разработка: ПК с архитектурой Тьюринга, 4x.
- Обучение/оценка: Используйте тот же ПК с 4x GPU. При проведении множества экспериментов купите общие серверы или используйте облачные экземпляры.
- Для крупных компаний:
- Разработка: Купите ПК с архитектурой Тьюринга 4x на каждого специалиста по машинному обучению (ML) или позвольте им использовать экземпляры V100.
- Обучение/Оценка: Используйте облачные экземпляры с надлежащим предоставлением ресурсов и обработкой сбоев.
Облачные провайдеры:
- GCP: возможность подключения графических процессоров к любому экземпляру + наличие TPU.
- AWS:
2.2. Управление ресурсами
- Распределение свободных ресурсов между программами.
- Варианты управления ресурсами:
- Старое кластерное планирование заданий (например, менеджер рабочей нагрузки Slurm).
- Docker + Kubernetes.
- Kubeflow.
- Polyaxon (платные функции).
2.3. DL-фреймворки
- Если нет веской причины не делать этого, используйте Tensorflow/Keras или PyTorch.
- На следующей диаграмме представлено сравнение различных фреймворков с точки зрения их возможностей для разработки и производства.
2.4. Управление экспериментами
- Стратегия разработки, обучения и оценки:
- Всегда начинайте просто.
- Обучите небольшую модель на небольшой партии данных. Только если это работает, переходите к большим данным и моделям, а также настройке гиперпараметров!
- Инструменты управления экспериментами:
- Tensorboard (https://www.tensorflow.org/tensorboard) — предоставляет визуализацию и инструменты, необходимые для экспериментов в области машинного обучения.
- Losswise (Мониторинг для ML) (https://losswise.com/).
- Comet (https://comet.ml/) — позволяет отслеживать код, эксперименты и результаты проектов машинного обучения.
- Weights & Biases (https://wandb.com/) — записывайте и визуализируйте каждую деталь вашего исследования с возможностью лёгкого сотрудничества.
- MLFlow Tracking (https://mlflow.org/docs/latest/tracking.html#tracking) — для регистрации параметров, версий кода, метрик и выходных файлов, а также визуализации результатов.
- Автоматическое отслеживание экспериментов с помощью одной строки кода на Python.
- Сравнение экспериментов бок о бок.
- Настройка гиперпараметров.
- Поддержка заданий на основе Kubernetes.
2.5. Настройка гиперпараметров
-
Подходы:
- Поиск по сетке.
- Случайный поиск.
- Байесовская оптимизация.
- HyperBand (и ASHA).
- Популяционное обучение.
-
Платформы:
2.6. Распределённое обучение
- Параллелизм данных: используйте его, когда время итерации слишком велико (поддерживается как TensorFlow, так и PyTorch).
- Модель. Параллелизм: когда модель не помещается на одном GPU
Другие решения:
3. Устранение неполадок [TBD]
4. Тестирование и развёртывание
4.1. Тестирование и CI/CD
Для программного обеспечения машинного обучения требуется более разнообразный набор тестовых наборов, чем для традиционного программного обеспечения:
- Модульное и интеграционное тестирование:
- Типы тестов:
- Тесты системы обучения: тестирование конвейера обучения;
- Валидационные тесты: тестирование системы прогнозирования на валидационном наборе;
- Функциональные тесты: тестирование системы прогнозирования по нескольким важным примерам.
- Непрерывная интеграция: запуск тестов после каждого нового изменения кода, отправленного в репозиторий.
SaaS для непрерывной интеграции:
- Argo (https://argoproj.github.io/): открытый исходный код Kubernetes native workflow engine для организации параллельных заданий (включая рабочие процессы, события, CI и CD).
- CircleCI (https://circleci.com/): языковая поддержка, настраиваемые среды, гибкое распределение ресурсов, используется instacart, Lyft и StackShare.
- Travis CI (https://travis-ci.org/).
- Buildkite (https://buildkite.com/): быстрые и стабильные сборки, агент с открытым исходным кодом работает практически на любой машине и архитектуре, свобода использования собственных инструментов и сервисов.
- Jenkins: старая система сборки.
4.2. Веб-развёртывание
Состоит из системы прогнозирования и обслуживающей системы.
Система прогнозирования обрабатывает входные данные и делает прогнозы. Обслуживающая система (веб-сервер) обслуживает прогнозы с учётом масштаба. Использует REST API для обслуживания HTTP-запросов прогнозирования. Вызывает систему прогнозирования для ответа.
Варианты обслуживания:
- Развертывание на виртуальных машинах, масштабирование путём добавления экземпляров.
- Развёртывание в виде контейнеров, масштабирование через оркестровку. Контейнеры: Docker. Оркестровка контейнеров: Kubernetes (самый популярный сейчас), MESOS, Marathon.
- Развёртывание кода как «бессерверной функции».
- Развёртывание через решение для обслуживания модели.
Обслуживание модели: специализированное веб-развёртывание для моделей машинного обучения. Пакетирует запросы для вывода на GPU. Фреймворки: Tensorflow serving, MXNet Model server, Clipper (Berkeley), SaaS-решения.
Принятие решения: CPU или GPU?
Вывод на CPU предпочтительнее, если он соответствует требованиям. Масштабируется путём добавления большего количества серверов или перехода на бессерверную архитектуру.
Вывод на GPU: TF serving или Clipper. Адаптивное пакетирование полезно.
(Бонус) Развёртывание Jupyter Notebooks: Kubeflow Fairing (https://github.com/kubeflow/fairing) — это гибридный пакет развёртывания, который позволяет развёртывать коды Jupyter notebook!
4.5. Сервисная сетка и маршрутизация трафика
Переход от монолитных приложений к распределённой микросервисной архитектуре может быть сложным. Сервисная сетка (состоящая из сети микросервисов) снижает сложность таких развёртываний и облегчает нагрузку на команды разработчиков. Istio (https://istio.io/) — сервисная сетка для упрощения создания сети развёрнутых сервисов с балансировкой нагрузки, аутентификацией между сервисами, мониторингом, с небольшими изменениями или без изменений в коде сервиса.
4.4. Мониторинг
Цель мониторинга: оповещения о простоях, ошибках и сдвигах распределения, выявление сервисных и регрессий данных. Решения облачных провайдеров вполне приличные. Kiali (https://kiali.io/) — консоль наблюдаемости для Istio с возможностями настройки конфигурации сервисной сетки. Отвечает на вопросы: как связаны микросервисы? Как они работают?
Мы закончили? 4.5. Развёртывание на встраиваемых и мобильных устройствах
4.6. Комплексные решения
* TensorFlow Extended (TFX);
* Michelangelo (Uber);
* Google Cloud AI Platform;
* Amazon SageMaker;
* Neptune;
* FLOYD;
* Paperspace;
* Determined AI;
* Domino data lab.
TensorFlow Extended (TFX)
[TBD]
Airflow и KubeFlow ML-конвейеры
[TBD]
Другие полезные ссылки:
- Уроки, извлечённые из создания практических систем глубокого обучения.
- Машинное обучение: кредитная карта технического долга с высокими процентами.
Ссылки:
[1]: Полноценный курс глубокого обучения, ноябрь 2019 года.
[2]: Расширенный семинар по KubeFlow от Pipeline.ai, 2019 год.
[3]: TFX: машинное обучение в реальных условиях в производстве.
Комментарии ( 0 )