1. Введение
  2. Надлежащие методы MLOps для переобучения воспроизводимых моделей в облаке
  3. Решение идеальных требований
  4. Образец кода
  5. Возможные расширения

Введение

Обучение моделей машинного обучения является неотъемлемой частью управления жизненным циклом модели машинного обучения, и в последнее время MLOps, кажется, в моде. В Чермати и Индодане мы, конечно же, пронюхали об этом и запрыгнули на подножку.

Что такое MLOps, спросите вы? Если говорить кратко и цитируя Википедию [1].

MLOPs — это набор практик, направленных на надежное и эффективное развертывание и поддержку моделей машинного обучения в производственной среде. Слово представляет собой соединение машинного обучения и практики непрерывного развития DevOps в области программного обеспечения.

Его происхождение можно проследить до статьи «Скрытый технический долг в системах машинного обучения» [2], в которой говорится о техническом долге, который может возникнуть с реальными системами ML, в котором исследуется несколько факторов риска, характерных для ML, которые необходимо учитывать в системе. дизайн.

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

Надлежащие методы MLOps для переобучения воспроизводимых моделей в облаке

Для моделей обучения есть определенные аспекты, которых мы хотели бы достичь:

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

Давайте углубимся в каждый из упомянутых пунктов:

1. Воспроизводимые модели

Обученная модель машинного обучения состоит из 1) кода, который определяет этапы обучения, его алгоритм и архитектуру, 2) входных данных, используемых для ее обучения, и 3) ее выходных артефактов, таких как объект модели и его веса.

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

2. Регистрация показателей

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

Тем не менее, также полезно знать, как потери и потери проверки проявляются с течением времени. Это может помочь нам понять, присутствует ли переоснащение, если кривая потерь проверки начинает увеличиваться и требуется ранняя остановка.

3. Простое и эффективное развертывание обучения в облаке

Еще один бонусный балл можно получить, если мы сможем быстро развернуть обучение в облаке. Есть несколько ключевых шагов, которые мы должны сделать — запуск виртуальной машины, подключение графического процессора (при необходимости), обеспечение установки необходимых библиотек Nvidia, таких как CUDA и cuDNN, инициализация среды Python, запуск необходимых сценариев, ведение журнала и сохранение. артефакты, а затем остановите виртуальную машину после завершения обучения. Это может быть довольно много работы, чтобы обучить модель машинного обучения, и мы хотели бы найти решение для этого.

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

Решение идеальных требований

Есть несколько способов решить эту проблему в зависимости от обстоятельств и предпочтений, но в Cermati и Indodana мы решили использовать DVC (Контроль версий данных), MLflow и GCP AI Platform — в частности, AI Platform Training. , или также известный как Vertex AI Training, его новый преемник — для обучения моделей, которые включают в себя упомянутые выше моменты.

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

1. ДВК

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

2. Млфлоу

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

Что касается Projects, он предоставляет структурированный формат для упаковки кода и среды, а также полезные инструменты API и CLI. Среду Python, используемую для обучения, можно легко восстановить, а обученную модель можно развернуть в той же среде с помощью моделей MLflow. Кроме того, это позволяет нам регистрировать фиксацию Git (фиксация Git, используемая для выполнения запуска, если она была выполнена из проекта MLflow).

Это также помогает регистрировать интересующие нас метрики, как упоминалось в пункте 2 (регистрация метрик) в предыдущем разделе.

3. Платформа искусственного интеллекта GCP

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

Он запустит проект MLflow, и как только это будет сделано, виртуальная машина будет автоматически отключена. Использование AI Platform Training помогает решить пункт 3 (простое и эффективное развертывание обучения в облаке) из предыдущего раздела.

Образец кода

Чтобы проиллюстрировать, как это можно сделать, мы подготовили простой пример кода, который вы можете использовать для начала работы. В нем будет показано, как вы можете включить инструменты/платформы, как описано выше, за исключением DVC. Полный код можно найти в этом репозитории Github. Не стесняйтесь использовать его в качестве базового кода для настройки и расширения в соответствии с вашими потребностями.

Обзор

Код будет обучать 2 модели на наборе данных Fashion MNIST — одна основана на простой кастомизированной архитектуре нейронной сети, а вторая — на упрощенной архитектуре VGG. Каждая модель поставляется со своим обучающим кодом, соответствующей спецификацией среды и вспомогательными файлами для обучения. Затем мы запустим сценарий обучения на платформе AI и будем регистрировать метрики и артефакты во время и после обучения. Затем мы приступим к созданию образа и загрузке его в Google Container Registry (GCR) и отправке обучающих заданий на платформу GCP AI.

Вот как в конечном итоге выглядит весь рабочий процесс:

Обратите внимание, что у нас будет две модели с именами model_a и model_b в каталоге каждой модели, он содержит:

  • Файл environment.yaml, в котором указаны пакеты Python, которые должны быть установлены в среде Python для выполнения сценария.
  • train.py и другие необходимые файлы Python, необходимые для запуска обучающего кода. Будут фрагменты кода MLflow для регистрации метрик и артефактов на сервере отслеживания MLflow.
  • Файл MLproject, который указывает точку входа и соответствующие доступные параметры, файл среды Conda, который будет использоваться для запуска сценария, и сценарии, необходимые для выполнения обучения.

Довольно просто! Всего несколько файлов в каталоге каждой модели.

Кроме того, Dockerfile используется для создания образа Docker с установленным Python, container.yaml определяет среду в среде Conda и Makefileдля быстрого и простого доступа к выполнению команд, необходимых для выполнения сборки образа, отправки в реестр контейнеров Google, а затем отправьте вакансию на обучение платформе AI!

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

Создание моделей

Для первой модели с именем model_a мы создадим простую модель NN только с одним скрытым слоем, используя класс Keras Sequential. Код адаптирован из этого учебника по Keras.

Чтобы подготовить набор данных Fashion MNIST, мы просто импортируем и загружаем набор данных через объект tf.keras.datasets.fashion_mnist следующим образом:

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

Далее мы продолжаем создавать нашу простую NN.

model = tf.keras.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10)])

Он просто берет изображение формы (28, 28), которое соответствует размеру всех изображений, найденных в наборе данных Fashion MNIST, и сглаживает его в одномерный массив длиной 784, передает его в полносвязный слой и выводит другой массив длина 128, которая будет проходить через уровень ReLU. Наконец, он проходит через другой плотный слой и выводит логиты длины 10, что является количеством классов/категорий в наборе данных (платье, рубашка, сумка и т. д.).

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

model.compile(optimizer='adam',
  loss=tf.keras.losses.SparseCategoricalCrossentropy(
  from_logits=True),
  metrics=['accuracy'])

Прежде чем мы начнем обучение, мы будем использовать функцию автологирования MLflow для моделей Tensorflow с помощью этой строки кода: mlflow.tensorflow.autolog(). Затем мы можем приступить к выполнению метода model.fit для обучения набору обучающих данных в течение определенного количества эпох. Мы разрешим число эпох быть переменной, чтобы мы могли показать, как мы можем передавать аргументы в задание обучения платформы ИИ, которое, в свою очередь, переходит к точке входа MLproject, а затем к сценарию.

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

model_output = "simple_model.h5"
model.save(model_output)
mlflow.log_artifact(local_path=model_output)

На этом сценарий обучения для model_a заканчивается. Что касается другой модели, model_b, она следует той же схеме сценария обучения, за исключением того, что она использует архитектуру мини-VGG NN, код адаптирован из https://www.pyimagesearch.com/2019/02/ 11/fashion-mnist-with-keras-and-deep-learning. Модель определена в файле minivgg.py, который будет импортирован в сценарий обучения для этой модели в файле train.py.

Упаковка как проект MLflow

Затем, чтобы упаковать это как проект MLflow, суть заключается в наличии файла MLproject. Пример файла определяется следующим образом:

name: model_a
conda_env: environment.yaml
entry_points:
  main:
    parameters:
      epochs: { type: float, default: 10 }
    command: "python train.py --epochs {epochs}"

Мы просто даем ему имя, значение для conda_env, чтобы сообщить имя файла YAML, чтобы предоставить среду Conda и доступные точки входа, в данном случае только одну — main.

Каждый файл MLproject должен иметь хотя бы одну точку входа. Запуск команды mlflow run в каталоге, где хранится MLproject, эквивалентен mlflow run main (т.е. он ищет и запускает точку входа main). При необходимости в файл могут быть добавлены дополнительные точки входа (например, добавление entrypoint_named1, entrypoint_named2, затем их запуск можно выполнить с помощью mlflow run entrypoint_named1 / mlflow run entrypoint_named2). Однако для этого примера нам нужна только одна точка входа, поэтому мы назовем ее main.

Для этой конкретной точки входа он выполнит команду python train.py — epochs {epochs}, при этом он принимает один параметр с именем epochs, который предоставляется обучающему сценарию.

Это все, что нужно, чтобы упаковать его в проект MLflow, и мы можем запустить mlflow run model_a через интерфейс командной строки (CLI) из корневого каталога.

После того, как это будет проверено на работоспособность, мы можем перейти к созданию образа Docker, который мы отправим в GCR.

Создание образа Docker

Для начала код всего Dockerfile показан ниже.

Подытожу, что делается:

  1. Извлеките образ на основе Ubuntu из nvidia/cuda, в котором установлены CUDA и cuDNN, чтобы мы могли использовать графический процессор, подключенный к виртуальной машине, для более быстрого обучения.
  2. Установите определенные зависимости Python (и любые другие зависимости, которые могут вам понадобиться для запуска вашего кода) и Miniconda в образе.
  3. Установите новую среду Conda на основе файла container.yaml, в котором mlflow будет указан как один из устанавливаемых пакетов. Файл container.yaml максимально компактен и используется просто для установки mlflow (и для сохранения небольшого размера образа).
  4. Установите эту недавно установленную среду Conda в качестве среды Conda по умолчанию.
  5. Скопируйте необходимые папки и файлы в образ.
  6. Установите переменные среды, такие как MLFLOW_TRACKING_URI, чтобы MLflow знал URL-адрес сервера отслеживания.
  7. Устанавливает ENTRYPOINT в mlflow run , что позволяет нам передавать аргумент, такой как model_a или model b (а также позволяет использовать дополнительные параметры, такие как model a -P epochs 20).

Чтобы построить образ, мы можем запустить docker build -t training . или, альтернативно, запустить make build, который также выполнит то же самое, и построенный образ будет назван как training (обратите внимание, что первый запуск команды займет некоторое время, так как он должен загрузите базовый образ, установите зависимости и настройте среду Conda и т. д., поэтому затраченное время больше, чем время на изображении, показанном ниже)

Пометка и отправка в GCR

После создания образа мы готовы пометить его и отправить в GCR. Не забудьте заранее ввести необходимые значения в Dockerfile и Makefile!

Запустите make tag, чтобы пометить изображение (в данном случае, добавив префикс gcr.io/<GCP_PROJECT>/ к имени изображения. Затем мы отправим GCR с docker push, который можно выполнить с помощью команды make push.

Отправка задания на обучение платформе ИИ

Наконец, мы готовы отправить задание на обучение на платформу GCP AI!

Это можно сделать либо с помощью консоли GCP, либо с помощью команды CLI, которую мы возьмем здесь. Команда выглядит следующим образом для тренировочного задания, в котором используется графический процессор Tesla T4, подключенный к машине типа n1-standard-4, размещенной в определенном $(REGION). Команде требуется ссылка master-image-uri, указывающая на изображение GCR, которое мы только что загрузили. Пожалуйста, не стесняйтесь изменять значения в пределах $(VALUE) на свои собственные.

gcloud --project=$(GCP_PROJECT) ai-platform jobs submit training \
  "$(MODEL)_training_`date +'%Y%m%d_%H%M%S'`" \
  --master-image-uri gcr.io/$(GCP_PROJECT)/training:latest \
  --region $(REGION) \
  --scale-tier custom \
  --master-machine-type n1-standard-4 \
  --master-accelerator count=1,type=nvidia-tesla-t4 \
  -- \
  $(MODEL); \

Обратите внимание, что значения $(MODEL) здесь могут быть только model_a или model_b.

В качестве альтернативы это можно выполнить через make -e MODEL=model_b -e GPU=True submit , который затем сообщит MLflow о запуске model_b MLproject с GPU, подключенным к виртуальной машине.

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

Здесь у вас есть несколько вариантов: нажмите model_b_training_20211022_153351, чтобы просмотреть дополнительную информацию об этом задании и его статусе, или нажмите View Logs, чтобы просмотреть журналы в режиме реального времени. Нажав на журналы, вы увидите следующее:

Мы видим, что он инициализирует задание, выполняя проверки перед его запуском. После запуска он запускает mlflow run на модели, которую мы указали, и именно тогда MLflow вступает во владение, устанавливая среду Conda для запуска кода внутри.

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

Как уже упоминалось, после обучения модель оценивается на тестовом наборе данных, и точность регистрируется как 0,923699. Кроме того, модель сохраняется в формате файла .h5 и регистрируется как артефакт. Давайте перейдем к нашему серверу отслеживания MLflow, чтобы проверить и получить!

Посттренинг

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

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

Мы можем увидеть определенную информацию для этого запуска, такую ​​как дата, исходная папка, используемая точка входа и параметры, которые были зарегистрированы с помощью авторегистратора. Если мы прокрутим дальше вниз, мы увидим параметр test_acc, который мы записали вручную, и его значение совпадает со значением, показанным в журнале обучения AI Platform для этой работы.

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

Мы видим, что он записал определенные файлы, такие как conda.yaml, который представляет среду, которая использовалась для обучения модели, и файл MLmodel, который позволяет представить эту модель как модель MLflow, которую можно зарегистрировать в своем реестре и развернуть после . Кроме того, используя функцию автоматического ведения журнала, он также создал журналы Tensorboard, которые затем можно загрузить на сервер Tensorboard, чтобы увидеть метрики модели и веса слоев в нескольких формах визуализации.

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

И… это все, что вам нужно сделать, чтобы обучить модель с помощью MLflow и AI Platform!

Возможные расширения отсюда

Здесь есть несколько расширений, над которыми вы можете работать.

  • Журнал версии данных. Как упоминалось ранее, для регистрации версии данных вам придется использовать DVC в качестве инструмента контроля версий ваших данных. В этом случае вы можете затем записать хэш фиксации (DVC) данных, используемых для этого конкретного тренировочного прогона.
  • Версия кода журнала — чтобы записать версию кода, вам нужно будет выполнить этот код из репозитория с инициализированным Git (не показан в этом примере), поскольку он ищет папку .git.
  • Запланированное обучение — теперь, когда все это подготовлено, вы можете периодически запускать этот процесс обучения с помощью планировщика, такого как Airflow.
  • Удаленный репозиторий. Обратите внимание, что в этом примере нам придется создать новое изображение, если мы внесли изменения в наш код, а затем загрузить его в GCR. Чтобы еще больше ускорить этот процесс, рассмотрите возможность создания базового образа и git pull репозитория в контейнере при запуске задания обучения.

Краткое содержание

С появлением передовой практики MLOps мы также решили взять несколько советов и внедрить их в наши процессы, и в этой статье мы специально рассмотрели переобучение моделей в облаке. Есть определенные идеальные требования, которые мы ищем, и мы решили использовать MLflow и AI Platform, чтобы решить эту проблему для нас. Это ни в коем случае не единственный метод, который можно использовать, и мы с нетерпением ждем возможности увидеть, что делают другие, и хотели бы адаптировать его по своему усмотрению, если будет более простой и эффективный метод для нашего использования.

Мы надеемся, что вам понравилось читать эту статью, и мы надеемся, что она может быть полезной для вас!

Рекомендации

[1] MLOps, Википедия, 20 апреля 2020 г. https://en.wikipedia.org/wiki/MLOps.

[2] Д. Скалли и др., Скрытый технический долг в системах машинного обучения, 2015 г. [Онлайн]. Доступно: https://papers.nips.cc/paper/2015/file/86df7dcfd896fcaf2674f757a2463eba-Paper.pdf.

О Чермати

Cermati Fintech Group — ведущая стартап-компания в сфере FinTech, специализирующаяся на рынке Индонезии. Портфель продуктов состоит из Cermati.com, Indodana, Cermati Insurance и Cermati Bank-as-a-Service. Видение нашей группы состоит в том, чтобы обеспечить большую финансовую доступность в Индонезии, расширив возможности игроков внутри экосистемы.