<style>
.reveal {
font-size: 28px;
}
/* .reveal p {
text-align: left;
} */
.reveal section img {
background:none;
border:none;
box-shadow:none;
}
v=1.2
</style>
# Основы работы с данными в ML
## План лекции
[TOC]
---
## Зачем хранить и версионировать данные
**Хранить данные** - возможность повторно воспользоваться данными
Пример: Интернет-магазин, задача рекомендаций.
Нужно рекомендовать только те товары которые есть в наличие. Система управления магазином не хранит историю когда доступности товара.
Для обучения на ретороспективных данных и честной оценки метрик нам нужно позаботиться о сохранении этой истории
**Версионирование данных** - одна из составляющих для возможность воспроизвести эксперимент.Версионировать - означает возможность хранить несколько версий одного и того же объекта данных и переключаться между версиями.
* Удаление - это специальный маркер, а не фактическое удаление
* Изменение объекта - по сути новый объект
---
**Зачем хранить и версионировать данные**
Другие примеры изменения данных:
* CV система собирающая картинки и дообучающаяся со временем
* Конкурс "шляпа" - каждую неделю обновление корпуса слов
* Продакшен система обработки CV - дообучение раз в две недели. Необходимо мониторить качество при дообучении
---
## Версионирование в файловой системе
* Почему git не помошник в версионировании данных
* При решении задачи версионирования в файловой системе хорошо принять решение о разделении данных на чанки
* Некоторые файловые системы имеют встроенные системы версионирования
* Linux - NIFLS
* MacOS - Time Maсhine
* Для универсальности - проект [DVC](https://dvc.org/)
* Или [Quilt](https://docs.quiltdata.com/)
---
## Версионирование данных в облаках
Некоторые облачные системы поддерживают версионирование данных:
* [AWS S3 buckets](https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html) - 5GB на 12 месяцев (есть ограничения по запросам)
* [AZURE workspace](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-version-track-datasets) - 200$ на 30 дней.
* [GCS](https://cloud.google.com/storage/docs/object-versioning) - есть грант на использование 300$ для новых аккаунтов
---
## Версионирование данных в базах данных
* SQL
* Данные меняются - в каждой таблице есть поле версии и признак того что объект удален. Изменение - новый объект. Удаление объекта - метка
* Использование триггеров - перегружает и замедляет базу (ок, если это не продакшен)
* Postgres [Point in time recovery](https://www.postgresql.org/docs/current/continuous-archiving.html)
* Структура таблиц - [SQLAlchemy](https://alembic.sqlalchemy.org/en/latest/index.html) - только инкрементальные изменения
* [MariaDB](https://mariadb.com/resources/blog/automatic-data-versioning-in-mariadb-server-10-3/) - версионирование в коробке (не знаю кто этим пользовался)
---
## Версионирование данных в базах данных (продолжение)
* NoSQL
* Нет проблем со структурой
* Подход тот же что и в файловой системе но все версии одного объекта данных можно хранить внутри самого объекта. [Пример MongoDB](https://github.com/thiloplanz/v7files/wiki/Vermongo)
* Datalakes - вешь в себе. Обычно есть версионирование. Дружите с архитектором вашего Datalake :)
---
## Подробнее про dvc
DVC - надстройка над git
1. Установка и инициализация
```shell=
pip install dvc
cd [your_project]
dvc init
>>> new file: .dvc/.gitignore
>>> new file: .dvc/config
git commit -m "Initialize DVC"
```
2. Добавляем данные
```shell=
dvc add data/data.json
git add data/data.xml.dvc data/.gitignore
git commit -m "Add raw data"
```
3. Подключаем облачное хранилище
```shell=
dvc remote add -d storage s3://your-bucket/your-storage
git commit .dvc/config -m "Configure remote storage"
```
---
4. Отправляем данные в харнилище
```shell=
dvc push
```
5. Получаем данные из хранилища
```shell=
dvc pull
```
6. Добавление данных
```shell=
dvc add data/data.json
git commit data/data.xml.dvc -m "Dataset updates"
dvc push
```
7. Переключаемся между версиями
```shell=
git checkout <...>
dvc checkout
```
---
8. Python API
```python=
import dvc.api
with dvc.api.open(
'get-started/data.xml',
repo='https://github.com/iterative/dataset-registry'
) as fd:
# ... fd - можно работать как с обычным файлом.
```
---
## Выводы
* Воспроизводимость эксперимента - это не только гиперпараметры и код, но и данные
* Возможность лучше контролировать результат дообучения моделей
* DVC - наш друг
---
<style>
.reveal {
font-size: 22px;
}
.reveal section img {
background:none;
border:none;
box-shadow:none;
}
v=1.2
</style>
# Семинар
* Cтавим DVC
* Инициализируем DVC в проекте ```dvc init | git commit -m "Initialize DVC"```
* Добавляем файл с данными ```dvc add data/corpus.txt | git add data/data.xml.dvc data/.gitignore | git commit -m "Add raw data"```
* Создаем бакет для хранения https://console.cloud.google.com/storage/browser
* Подключаем и настраиваем GCP CLI
* Подключаем бакет для хранения данных в облаке ```dvc remote add -d myremote gs://dmia_dvc | git commit .dvc/config -m "Configure remote storage"```
* Сохраняем данные в хранилище ```dvc push```
* Добавляем новые файлы, меняем старые ```dvc add | git commt | dvc push```
* Возвращаемся к старым экспериментам ```git checkout | dvc checkout```
* Немного про pipleine и эксперименты
{"metaMigratedAt":"2023-06-15T18:10:11.211Z","metaMigratedFrom":"YAML","title":"Основы работы с данными в ML","breaks":false,"slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"e0bc91de-98f7-46f8-a3a9-852912833a93\",\"add\":258,\"del\":41},{\"id\":\"38b0f324-6648-4b08-b1c3-8bc762b8ab7b\",\"add\":14991,\"del\":9767}]"}