Начало работы с MLOps с кодом, переданным git, версионными наборами данных и отслеживанием экспериментов

Что мы построим

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

Напишите обучающий код

Вы можете использовать пример кода в репозитории VESSL на GitHub (vessl-ai/examples).

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

Установить пути ввода и вывода

Когда набор данных подключается к эксперименту VESSL во время выполнения, набор данных по умолчанию прикрепляется к определенному пути /input в контейнере эксперимента. Кроме того, выходной путь по умолчанию установлен на /output. Если вы сохраните контрольные точки и модели в выходном пути по умолчанию, вы сможете легко загрузить файлы или создать модель с этими файлами после завершения эксперимента.

  • Путь ввода по умолчанию на VESSL: /input
  • Выходной путь по умолчанию на VESSL: /output

Я покажу вам, как создать набор данных в VESSL через мгновение, но сначала установите путь, как показано ниже, во всех частях кода, которые считывают набор данных. Функция get_balloon_dicts()принимает в качестве параметра путь /input/baloon и загружает набор данных оттуда.

def get_balloon_dicts(img_dir):
  json_file = os.path.join(img_dir, "via_region_data.json")
  with open(json_file) as f:
    imgs_anns = json.load(f)
  ...
  return dataset_dicts


for d in ["train", "val"]:
  DatasetCatalog.register("/input/balloon_" + d, lambda d=d: get_balloon_dicts("/input/balloon/" + d))
  MetadataCatalog.get("/input/balloon_" + d).set(thing_classes=["balloon"])

Задайте путь к набору обучающих данных и конфигурацию выходного каталога следующим образом. Для получения дополнительной информации о конфигурации детектора 2 обратитесь к документации по детектору 2.

config = get_cfg()
...
config.DATASETS.TRAIN = ("/input/balloon_train",)
...
config.OUTPUT_DIR = "/output"
...

Кроме того, установите входной и выходной каталоги оценщика следующим образом.

evaluator = COCOEvaluator(
    "/input/balloon_val", cfg, False, output_dir="/output/")

Регистрация метрик и изображений на VESSL

Как вы можете видеть на скриншотах ниже, вы можете записывать различные типы данных в VESSL. Давайте записывать метрики и изображения с помощью простой команды vessl.log().

В этом примере я оборачиваю vessl.log() хуком, который наследует HookBase, предоставленный detectron2, и позже зарегистрирую хук с методом register_hooks() в trainer.

import vessl
from detectron2.engine import DefaultTrainier, HookBase

class VesslHook(HookBase):
def after_step(self):
  logging_metrics = [
    'loss_cls', 'loss_mask', 'total_loss',
    'fast_rcnn/cls_accuracy', 'fast_rcnn/false_negative', 'fast_rcnn/fg_cls_accuracy',
    'mask_rcnn/accuracy', 'mask_rcnn/false_positive', 'mask_rcnn/false_negative',
  ]

  for metric in logging_metrics:
    vessl.log(
      step=self.trainer.iter,
      payload={
        metric: self.trainer.storage.history(metric).latest(),
      }
  )
  ...

trainer = DefaultTrainier(cfg)
after_step_hook = VesslHook()
trainer.resgister_hoooks([after_step_hook])
trainer.train()

Я буду записывать изображения результатов вывода на обученной модели. Среди этих полученных изображений девять случайно выбранных логических изображений записываются на VESSL с использованием vessl.log()и vessl.Image()в качестве следующего фрагмента кода. Более подробные инструкции по VESSL SDK см. в Документации VESSL.

import cv2
import random
import vessl

from detectron2.engine import DefaultPredictor

predictor = DefaultPredictor(cfg)
dataset_dicts = get_balloon_dicts("/input/balloon/val")
for d in random.sample(dataset_dicts, 9):
  im = cv2.imread(d["file_name"])
  outputs = predictor(im)
  v = Visualizer(
    im[:, :, ::-1], 
    metadata=balloon_metadata, 
    scale=0.5, 
    instance_mode=ColorMode.IMAGE_BW
  )
  
 out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
 image = out.get_image()[:, :, ::-1]
 vessl.log(
   payload={"inference-image": [
     vessl.Image(data=image, caption=d["file_name"])
   ]}
 )

Как только вы закончите обучающий код, отправьте его в свой репозиторий GitHub, и все готово.

Интегрировать репозиторий GitHub

VESSL рекомендует использовать инструменты управления версиями кода, такие как GitHub и BitBucket. Сначала интегрируйте свою учетную запись GitHub в организацию VESSL и создайте проект, который подключается к определенному репозиторию GitHub из этой учетной записи.

Интеграция GitHub в организацию VESSL

Перейдите на страницу Organization settings > Integrations и подключите репозитории GitHub или BitBucket к VESSL.

Создайте проект со встроенным репозиторием GitHub.

Далее перейдите на Projects > New projectpage и создайте проект с интегрированным репозиторием GitHub.

Создать набор данных

Набор данных VESSL может быть создан из различных источников. В этом примере я создам набор данных, импортировав данные из общедоступной корзины AWS S3, которую я создал заранее.

Создайте набор данных из AWS S3

Перейдите к Datasets > New Dataset > Amazon Simple Storage Service и создайте новый набор данных, используя общедоступный путь корзины S3, как показано ниже.

Bucket path: s3://vessl-public-apne2/detectron2/

Зарегистрируйте набор данных в проекте

Теперь зарегистрируйте созданный набор данных на странице Projects > Settings. После того, как вы зарегистрируете репозиторий и набор данных в проекте, они будут служить шаблоном для создания эксперимента, который поможет вам более легко настроить конфигурацию volume mount.

Проведите эксперимент

Развернуть эксперимент

Теперь мы готовы запустить эксперимент. Давайте создадим эксперимент, выбрав подходящий ресурс графического процессора, выбрав образ Docker и введя команду запуска для запуска обучающего кода.

Изучите панель эксперимента

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

С другой стороны, в представлении диаграммы показаны общие показатели экспериментов, объединенные в один график. Это облегчает анализ численного сравнения экспериментов в разных условиях.

Заключение

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

Интаэ Рю, инженер по машинному обучению в VESSL AI