[Первоначально опубликовано в блоге Paperspace.]

В этой статье мы научим модель PyTorch выполнять визуализацию сверхвысокого разрешения - технику для изящного масштабирования изображений. Мы будем использовать Реестр данных Quilt для создания моментальных снимков обучающих данных и моделей в виде версий пакетов данных.

Кризис воспроизводимости

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

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

Как разработчики, у нас есть множество инструментов для управления версиями кода. GitHub, Docker и PyPI - три примера. Мы используем эти службы, чтобы делиться и открывать строительные блоки для приложений. Строительные блоки имеют версии и развертываются, что делает их легко воспроизводимыми.

Но как насчет данных многократного использования? В этой статье мы создадим повторно используемые блоки данных, которые будут развертываться как пакеты PyPI:

$ quilt install akarve/BSDS300

А как насчет хранения данных на GitHub?

Если вы когда-либо пытались хранить данные на GitHub, вы могли обнаружить, что большие объемы данных не приветствуются. GitHub ограничивает файлы размером 100 МБ и ограничивает репозитории до 1 ГБ. GitHub LFS снимает эти ограничения, но ненамного.

В отличие от этого, репозитории Quilt могут содержать терабайты данных и тысячи файлов, как показано в этом примере в Allen Cell Explorer. Пакетный поток данных прямо из хранилища BLOB-объектов. Таким образом, клиенты могут получать данные так же быстро, как они могут читать их из Amazon S3. Кроме того, Quilt сериализует данные в столбчатые форматы, такие как Apache Parquet. Сериализация ускоряет ввод-вывод и увеличивает пропускную способность сети.

Пример: получение изображений в сверхвысоком разрешении с помощью PyTorch и Quilt

Версия обучающих данных

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

Мы собираемся обучить нашу модель сверхвысокого разрешения на наборе данных сегментации Berkeley и эталонном тесте, BSDS300. Для начала скачайте данные из Беркли (22 МБ). Распакуйте содержимое в чистый каталог и откройте папку BSDS300. Вы увидите следующее:

$ ls
iids_test.txt iids_train.txt images

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

# Berkeley Segmentation Dataset (BDS300)
See [BSDS on the web](https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/).
# Citations
```
@InProceedings{MartinFTM01,
 author = {D. Martin and C. Fowlkes and D. Tal and J. Malik},
 title = {A Database of Human Segmented Natural Images and its
 Application to Evaluating Segmentation Algorithms and
 Measuring Ecological Statistics},
 booktitle = {Proc. 8th Int’l Conf. Computer Vision},
 year = {2001},
 month = {July},
 volume = {2},
 pages = {416–423}
}
```

Чтобы преобразовать указанные выше файлы в пакет данных с версией, нам необходимо установить Quilt:

$ pip install quilt

Затем создайте пакет данных из содержимого текущего рабочего каталога:

$ quilt build YOUR_USERNAME/BSDS300 .

На данный момент пакет находится на вашем компьютере. Если вы хотите развернуть пакет на других машинах, вам понадобится бесплатная учетная запись на [quiltdata.com] (https://quiltdata.com).

$ quilt login
$ quilt push YOUR_USERNAME/BSDS300 --public

Теперь любой человек в мире может воспроизвести точно такие же данные:

quilt install akarve/BSDS300 -x e472cf0

Параметр -x указывает дайджест SHA-256 экземпляра пакета.
›Подобно тому, как PyPI размещает повторно используемые пакеты программного обеспечения (например, pandas, numpy и torch), Quilt размещает повторно используемые пакеты данных.

У каждого пакета есть целевая страница, на которой отображается документация, история изменений и многое другое. Ниже мы видим размер пакета (22,2 МБ), статистику файлов (300 файлов .jpg) и хэш пакета e472cf0...).

Разверните данные на любой машине

Установите Quilt на удаленную машину, а затем пакет BSDS300.

$ pip install quilt[img]
$ quilt install akarve/BSDS300

(Чтобы настроить место хранения пакетов данных, см. Приложение 2.)

Теперь мы готовы исследовать BSDS300 на Python:

In [1]:
from quilt.data.akarve import BSDS300 as bsds
bsds.images
Out [1]:
<GroupNode>
test/
train/

Пакеты доступны для просмотра, как и файловые системы. bsds.images.test содержит изображения:

Под капотом `quilt.asa.img.plot ()` делает что-то вроде следующего для каждого изображения:

from matplotlib import image, pyplot
pyplot.imshow(
    image.imread(
        bsds['images']['test']['n101085']()
    ))

bsds['images']['test'] представляет файл bsds/images/test/101085.jpg. Quilt добавляет n к имени файла, чтобы каждый узел пакета был действительным идентификатором Python, доступным с помощью оператора точки Python или скобок. Завершающие круглые скобки () указывают Quilt вернуть путь к нижележащему фрагменту данных.

Обучите модель PyTorch из пакета Quilt

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

Итак, как нам получить данные из нашего пакета в PyTorch?

Quilt предоставляет функцию высшего порядка asa.pytorch.dataset(), которая преобразует упакованные данные в объект torch.utils.data.Dataset:

from quilt.data.akarve import BSDS300 as bsds
from quilt.asa.pytorch import dataset
return bsds.images.train(
    asa=dataset(
        include=is_image,
        node_parser=node_parser,
        input_transform=input_transform(...),
        target_transform=target_transform(...)
    ))

Полный пример кода можно найти в этой вилке pytorch-examples. Форк содержит весь код, необходимый для обучения и применения нашей модели сверхвысокого разрешения. Что особенного в вилке? Меньше кода.

Когда Quilt управляет данными, десятки строк шаблонного кода исчезают. Больше нет необходимости в одноразовых функциях загрузки, распаковки и загрузки данных.

Выполните обучающую работу

Репозиторий quiltdata / pytorch-examples содержит сценарий точки входа, train_super_resolutioin.sh, который вызывает main.py для установки зависимостей, обучения модели и сохранения контрольных точек модели на диске:

#!/usr/bin/bash
export QUILT_PRIMARY_PACKAGE_DIR='/storage/quilt_packages'
cd super_resolution
pip install -r requirements.txt
mkdir -p /storage/models/super_resolution/
N_EPOCHS=$1
echo "Training for ${N_EPOCHS:=10} epochs\n"
# train
python main.py \
 --upscale_factor 3 \
 --batchSize 4 \
 --testBatchSize 100 \
 --nEpochs $N_EPOCHS \
 --lr 0.001 \
 --cuda

Вы можете клонировать this Paperspace Job, чтобы обучить модель в своей учетной записи. На NVIDIA P4000 обучение занимает около 12 минут. Если вы хотите изменить место хранения моделей, см. main.py.

Снимки моделей PyTorch

Помимо данных, в Quilt можно хранить модели и их полную историю изменений.

$ quilt build USR/PKG /storage/models/super_resolution/
$ quilt push USR/PKG

С помощью созданного выше пакета любой может восстановить силы прошлых тренировочных эпох.

Вывод: супер-размер мое разрешение

Теперь, когда наша модель обучена, мы можем повторно гидратировать эпоху 500 и сверхразрешить изображение из тестового набора:

$ bash infer_super_resolution.sh 500 304034

Ниже приведены результаты.

Работа по выводу доступна здесь. Чтобы вывод работал, убедитесь, что контрольные точки вашей модели сохранены в /storage/models/super_resolution (как показано в сценариях обучения выше), или что вы обновляете код, чтобы использовать другой каталог. Кроме того, если вы тренировались с --cuda, вам нужно будет позвонить super_resolve.py --cuda.

Заключение

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

Воспроизводимое машинное обучение можно представить себе как уравнение с тремя переменными: код + данные + модель = воспроизводимость.

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

Благодарности

Спасибо разработчикам оригинального примера super_resolution, кураторам и создателям BSDS300, Dillon Erb и Adam Sah за рецензирование черновиков этой статьи и Paperspace за предоставление вычислительных ресурсов.

Приложения

1. Установите Quilt в блокнот Jupyter

По причинам, подробно описанным Джейком Вандерпласом, установить пакеты изнутри ноутбука Jupyter сложно. Вот как это сделать правильно:

import sys
!{sys.executable} -m pip install quilt

2: Установите пакеты в определенный каталог

Если вы хотите, чтобы ваши пакеты данных располагались в определенном каталоге, например, на общем диске, создайте каталог quilt_packages. Если вы используете Paperspace Gradient, постоянный каталог /storage станет идеальным домом для пакетов данных.

$ mkdir -p /storage/quilt_packages

Используйте переменную среды, чтобы указать Quilt, где искать пакеты:

# set an environment variable in Jupyter
%env QUILT_PRIMARY_PACKAGE_DIR=/storage/quilt_packages

3. Покажи мне файлы

Quilt выполняет дедупликацию файлов, сериализует их в высокоскоростные форматы и сохраняет их под уникальным идентификатором (хеш SHA-256 файла) в quilt_packages. В результате дедупликации файлы, которые повторяются в пакетах данных, сохраняются на диске только один раз. Пакеты данных, которые включают один и тот же файл, например foo.csv, используйте единственную ссылку на фрагмент foo.csv в quilt_packages.

Все вышеперечисленное улучшает производительность и уменьшает занимаемое место на диске, но иногда вам нужно работать с базовыми файлами. Для этого используйте quilt.export:

quilt.export(“akarve/BSDS300”, “SOME_DIRECTORY”)

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