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

Я обнаружил, что начинать проект, предполагая, что он будет расти, всегда хорошо.

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

Использование git для управления кодом обязательно. Способ управления данными также является обязательным, но никто не знает, что лучше всего.

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

Традиционные способы управления данными

Если вы работаете над проектом машинного обучения, вы неизбежно будете работать с различными версиями набора данных (необработанными, обработанными по-разному, разделенными на обучение / разработку, дополненными) и будете пробовать разные модели (базовые параметры, разные параметры, архитектуры , алгоритмы).

Вам также нужно будет перенести их с локального компьютера в облако, а также поделиться ими со своими товарищами по команде и самим собой в будущем.

Для управления этим распространением файлов данных и моделей традиционно есть два варианта: ручное управление файлами и сохранение всего, что это git.

В таблице ниже представлены различные подходы и их наибольший риск.

Путь ленивых данных

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

Всегда хорошо иметь возможность вернуться к той модели, которую вы создали несколько месяцев назад.

Но это не означает, что всем, кто хочет проверить ваш проект, нужно загрузить всю историю - скорее всего, им нужна лишь небольшая часть.

Включение ленивых данных - это пара строк кода

Так как же использовать ленивые данные? Сначала установите его (для этого требуется Python 3.5+):

$ pip install lazydata

Затем перейдите в корневой каталог вашего проекта и введите:

$ lazydata init

Это создаст новый файл lazydata.yml, который будет содержать список ваших отслеживаемых файлов данных.

Затем вы можете использовать lazydata в своем коде для отслеживания файлов данных:

# my_script.py
from lazydata import track 
import pandas as pd
df = pd.read_csv(track("data/my_big_table.csv"))
print("Data shape:" + df.shape)

Когда вы запускаете этот скрипт в первый раз, lazydata начнет отслеживать ваш файл.

Отслеживание включает:

  • Создание копии вашего файла в ~/.lazydata - это ваш локальный кеш, где хранятся ваши версии файлов, поэтому вы можете вернуться к ним, если вам нужно, и отправить их в облако.
  • Добавление уникальной ссылки (SHA256) вашего файла данных в lazydata.yml. Вы добавляете этот yml-файл в git, чтобы отслеживать файлы данных, которые были у вас в этой конкретной фиксации. Это позволяет вам проводить криминалистику позже, если это необходимо, и аккуратно отслеживать ваши файлы данных, как если бы они были кодом.

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

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

$ lazydata add-remote s3://mybucket
$ lazydata push

Как только ваши товарищи по команде загрузят последний код, они также получат файл lazydata.yml. Затем они могут использовать настроенный вами пульт S3 и уникальную ссылку SHA256 для извлечения файла с lazydata pull.

В качестве альтернативы они могут просто запустить ваш скрипт, чтобы лениво загрузить отсутствующий файл:

$ python my_script.py
## lazydata: Downloading tracked file my_big_table.csv ...
## Data shape: (10000,100)

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

В приведенном выше примере мы применили ленивые данные к входным данным, но вы также можете использовать track() для выходных данных, например с файлом веса модели, который вы только что сохранили - он работает точно так же.

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

Чтобы узнать больше о библиотеке, посетите страницу GitHub: