[Первоначально опубликовано в блоге 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.