Версионирование данных и конвейера с помощью Git, DVC и облачного хранилища

Введение

Подавляющее большинство проектов в области науки о данных рождается в блокнотах Jupyter. Будучи интерактивными и простыми в использовании, они делают исследовательский анализ данных (EDA) таким удобным. Они также широко используются для дальнейших шагов, таких как разработка моделей машинного обучения, оценка производительности, настройка гиперпараметров и т.д. Однако по мере продвижения проекта и изучения сценариев развертывания блокноты начинают страдать с точки зрения версионности, воспроизводимости, совместимости, проблем с типом файлов и т. д. Другими словами, по мере того, как проект переходит от изолированных локальных сред к общим средам, нужны инструменты, ориентированные на программную инженерию, а не на науку о данных. На этом этапе некоторые из практик DevOps могут внести свой вклад.

Общей и неизбежной лучшей практикой современной разработки программного обеспечения является использование контроля версий, В повседневной практике это почти эквивалентно использованию git. Он помогает переключаться между различными версиями файлов. Однако у него есть ограничения, основными из которых являются ограничение на размер файла и совместимость типов файлов. Можно удобно осуществлять контроль версий файлов .py или .ipynb. Однако версионирование набора данных размером в пару сотен мегабайт или файла в формате .bit с помощью git невозможно и неудобно. В этот момент на сцену выходит бесплатный инструмент с открытым исходным кодом, а именно Data Version Control (DVC) от iterative.ai.

1.1 DVC

DVC — это очень мощный инструмент командной строки. По общему определению, он делает удобным версионирование наборов данных и экспериментов, дополняя некоторые другие основные инструменты разработчика, такие как Git. Например, он позволяет версионировать наборы данных вместе с git и облачным (или удаленным) хранилищем. Он предоставляет инструменты командной строки для определения файлов .dvc, версии которых отслеживаются git. Эти специфические файлы хранят ссылки на точные версии вашего набора данных, которые хранятся в облаке (например, S3, Gdrive и т.д.). Короче говоря, DVC действует как посредник, который служит вам для интеграции git и облака для версионирования набора данных.

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

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

2. Начнем

Этот учебник является частичным воспроизведением предыдущего проекта по науке о данных, который во время разработки зависел от ноутбуков. Здесь построен простой конвейер для рабочего потока, который начинается с получения данных и заканчивается оценкой двух простых альтернативных моделей (развертывание не задействовано). Поскольку учебник посвящен версионности, коды для подготовки данных, обучения модели и оценки производительности модели просто переносятся из соответствующих блокнотов предыдущего проекта в папку src нового проекта в виде файлов .py. Таким образом, вначале дерево выглядит так, как показано ниже.

.
├── README.md
└── src
    ├── config.py
    ├── evaluate.py
    ├── prepare.py
    └── train.py
Вход в полноэкранный режим Выход из полноэкранного режима

Следующий шаг — развертывание pipenv для управления зависимостями:

x@y:~/DVC_tutorial$ pipenv install
x@y:~/DVC_tutorial$ pipenv shell
(DVC_tutorial) x@y:~/DVC_tutorial$ pipenv install 
dvc[gdrive] pandas numpy sklearn openpyxl
Войти в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что установить DVC в Linux так же просто, как pip install dvc. Однако здесь используется dvc[gdrive] для установки определенной версии DVC. Это может правильно работать с Gdrive, так как он будет использоваться для хранения версий данных во время обучения. Другие варианты установки смотрите на сайте DVC.

Затем git и DVC запускаются командами git init и dvc init. На данный момент у нас есть следующие файлы и папки:

(DVC_tutorial) x@y:~/DVC_tutorial$ ls -a
.dvc  .dvcignore  .git  Pipfile  Pipfile.lock  README.md  src
Вход в полноэкранный режим Выход из полноэкранного режима

3. Версионирование данных

Исходный набор данных проекта хранится в репозитории UCI. Создайте папку data и извлеките файл данных (в формате .xlsx) с помощью специальной команды DVC:

(DVC_tutorial) x@y:~/DVC_tutorial$ mkdir data && cd data
(DVC_tutorial) x@y:~/DVC_tutorial/data$ dvc get-url https://archive.ics.uci.edu/ml/machine-learning-databases/00242/ENB2012_data.xlsx

Войти в полноэкранный режим Выйти из полноэкранного режима

Затем «добавьте» файл данных в DVC командой dvc add ENB2012_data.xlsx. Это создаст соответствующий файл .dvc для его отслеживания. Именно этот файл будет отслеживать git, а не исходный набор данных. Используя этот файл, DVC действует как инструмент, который сопоставляет набор данных в локальном или удаленном хранилище (Gdrive, S3 и т.д.) с кодовой базой проекта, хранящейся на git.

Следующим шагом будет перемещение данных в облако, которым в данном учебнике является Gdrive. Сначала создайте папку вручную в веб-интерфейсе Gdrive и получите метку:

Получив метку, объявите ее в DVC как место удаленного хранения и зафиксируйте ее, как показано ниже:

(DVC_tutorial) x@y:~/DVC_tutorial/data$ dvc remote add -d raw_storage gdrive://1I680q6HvPqcxbNJ8qnQ01c1pKxxxxxxxxxx
Setting 'raw_storage' as a default remote.
(DVC_tutorial) x@y:~/DVC_tutorial/data$ git commit ../.dvc/config -m "Remote data storage is added with name: dataset"
(DVC_tutorial) x@y:~/DVC_tutorial/data$ dvc push
Войдите в полноэкранный режим Выйдите из полноэкранного режима

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

3.1 Создание и хранение другой версии набора данных

Представьте себе ситуацию, когда вам нужно сохранить исходные данные, но в таком виде они не пригодятся. Вам нужно преобразовать их по мере необходимости и хранить только новую версию на локальном диске. В качестве примера, допустим, нам нужен файл .csv вместо .xlsx. Просто преобразуйте его с помощью python с именем «dataset.csv»:

(DVC_tutorial) x@y:~/DVC_tutorial/data$ python3
>>> import pandas as pd
>>> pd.read_excel("ENB2012_data.xlsx").to_csv("dataset.csv", index=None, header=True)
(DVC_tutorial) x@y:~/DVC_tutorial/data$ ls
dataset.csv  ENB2012_data.xlsx  ENB2012_data.xlsx.dvc
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем повторите шаги DVC и git:

(DVC_tutorial) x@y:~/DVC_tutorial/data$ dvc add dataset.csv 
(DVC_tutorial) x@y:~/DVC_tutorial/data$ git add dataset.csv.dvc
(DVC_tutorial) x@y:~/DVC_tutorial/data$ git commit -m "Converted data is integrated with DVC"
(DVC_tutorial) x@y:~/DVC_tutorial/data$ dvc push
Вход в полноэкранный режим Выйдите из полноэкранного режима

и получите вторую папку на Gdrive для преобразованных данных:

Теперь вы можете удалить необработанные данные (сохранив файл .dvc) из локальной папки для экономии места на диске. Однако, по мере продвижения в EDA, вам может понадобиться обновить набор данных. И снова вы можете создать новую версию набора данных и хранить ее только в локальной среде. Предыдущие версии будут находиться в удаленном хранилище, и вы сможете обращаться к ним по мере необходимости.

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

(DVC_tutorial) x@y:~/DVC_tutorial/data$ cat dataset.csv | wc -l
769
(DVC_tutorial) x@y:~/DVC_tutorial/data$ head -n -100 dataset.csv > tmp.txt && mv tmp.txt dataset.csv
(DVC_tutorial) x@y:~/DVC_tutorial/data$ cat dataset.csv | wc -l
669
Войти в полноэкранный режим Выйти из полноэкранного режима

Имея новую версию набора данных, вам также необходимо сохранить ее в удаленном хранилище. Снова используйте последовательность команд dvc add, git add (для файла .dvc), git commit и dvc push, как описано выше. После завершения работы у вас появится еще одна папка на странице Gdrive.

3.2 Переключение между версиями наборов данных

Конечно, DVC не только помогает хранить различные версии вашего набора данных. Он также позволяет переключаться между ними. Давайте посмотрим наши журналы git:

(DVC_tutorial) x@y:~/DVC_tutorial/data$ git log --oneline
ca1258b (HEAD -> master) dataset is pre-processed
ea6973a Converted data is integrated with DVC
4025c49 Remote data storage is added with name: dataset
a20ad92 Raw data is pulled and integrated with DVC
6bff3fb (origin/master) initiation
Вход в полноэкранный режим Выход из полноэкранного режима

Допустим, мы с сожалением стерли последние 100 строк и хотели бы использовать их снова. Единственное, что нам нужно сделать, это перейти в соответствующее состояние файла .dvc:

(DVC_tutorial) x@y:~/DVC_tutorial/data$ cat dataset.csv | wc -l
669
(DVC_tutorial) x@y:~/DVC_tutorial/data$ git checkout ea6973a dataset.csv.dvc
(DVC_tutorial) x@y:~/DVC_tutorial/data$ dvc checkout
(DVC_tutorial) x@y:~/DVC_tutorial/data$ cat dataset.csv | wc -l
769
Войти в полноэкранный режим Выйти из полноэкранного режима

Как видно из приведенных примеров, DVC помогает нам перемещаться между различными версиями нашего набора данных с помощью отслеживания .dvc-файлов на основе git. На странице Github видно, что файла dataset.csv нет, а вместо него доступны только соответствующие файлы .dvc.

На данный момент мы имеем следующее дерево для нашей локальной папки проекта:

.
├── data
│   ├── dataset.csv
│   ├── dataset.csv.dvc
│   └── ENB2012_data.xlsx.dvc
├── Pipfile
├── Pipfile.lock
├── README.md
└── src
    ├── config.py
    ├── evaluate.py
    ├── prepare.py
    └── train.py
Вход в полноэкранный режим Выход из полноэкранного режима

4. Построение конвейеров

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

Вы можете построить конвейер с помощью DVC, используя команду dvc run или через файл dvc.yaml. На самом деле, когда вы используете первый вариант, DVC сам производит первый вариант. Давайте попробуем.

Примитивный конвейер, который мы будем строить здесь, включает 3 основных этапа: подготовка, обучение и оценка. Для каждого из этих этапов существует специальный файл .py в папке src. Используя эти файлы и соответствующие деклерации, можно легко построить конвейер.

  • Код для этапа предварительной подготовки конвейера:
(DVC_tutorial)x@y:~/DVC_tutorial/src$ dvc run 
> -n prepare 
> -d prepare.py -d ../data/dataset.csv 
> -o ../data/prepared
> python3 prepare.py ../data/dataset.csv
Вход в полноэкранный режим Выход из полноэкранного режима
  • Код для этапа обучения конвейера:
(DVC_tutorial)x@y:~/DVC_tutorial/src$ dvc run 
> -n training -d train.py 
> -d ../data/prepared 
> -o ../assets 
> python3 train.py ../data/dataset.csv
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Код для этапа оценки конвейера:
(DVC_tutorial)x@y:~/DVC_tutorial/src$ dvc run  
> -n evaluating 
> -d evaluate.py -d ../data/prepared -d ../assets/models 
> -o ../assets/metrics 
> python3 evaluate.py ../data/prepared ../assets/metrics 
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что существует общая схема объявления каждого шага. Вы определяете

  • имя процедуры с помощью флага -n,
  • зависимости с помощью флага -d,
  • место вывода с помощью флага -o,
  • код для выполнения и его зависимости с помощью команды python3.

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

(DVC_tutorial) x@y:~/DVC_tutorial$ cat src/dvc.yaml 
stages:
  prepare:
    cmd: python3 prepare.py ../data/dataset.csv
    deps:
    - ../data/dataset.csv
    - prepare.py
    outs:
    - ../data/prepared
  training:
    cmd: python3 train.py ../data/dataset.csv
    deps:
    - ../data/prepared
    - train.py
    outs:
    - ../assets/models
  evaluating:
    cmd: python3 evaluate.py ../data/prepared ../assets/metrics
    deps:
    - ../assets/models
    - ../data/prepared
    - evaluate.py
    outs:
    - ../assets/metrics
Вход в полноэкранный режим Выход из полноэкранного режима

После того, как вы построили трубопровод, вы можете изменить любую его часть и перестроить его очень удобно. Допустим, вы хотите изменить модель, используемую в файле train.py. Изначально это была модель Random Forest, но вы хотите попробовать также Extra Tree Regressor. Вам нужно изменить только соответствующую часть:

# Build the Random Forest  model:

# model = RandomForestRegressor(
#    n_estimators=150, max_depth=6, random_state=Config.RANDOM_SEED )

# Build Etra Tree Regression Model (alternative model):

model = ExtraTreesRegressor(random_state=155)
Войти в полноэкранный режим Выйти из полноэкранного режима

После модификации единственное, что вам нужно сделать, это запустить команду dvc repro. Она выполнит всю процедуру за вас. Кроме того, DVC достаточно умна, чтобы исключить шаги, на которые не влияет изменение. В нашем примере, например, нет необходимости повторно запускать шаг подготовки.

С помощью данного кода и файла конфигурации метрика производительности каждого запуска сохраняется в файле assets/metrics/metrics.json.

5. Заключение

В статье рассказывается о том, как DVC делает итерации над вашим рабочим потоком настолько удобными. В учебнике основное внимание уделено версионированию набора данных и конвейера (репозиторий находится здесь). Однако DVC предоставляет больше инструментов для настройки гиперпараметров, построения графиков и управления экспериментами, которые станут темой следующей статьи.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *