Утилита для создания шаблонов проектов по машинному обучению и анализу данных.
- Установите Sphinx для генерации документации.
Ссылка на страничку с инструкцией установки. Предпочтительный способ установки через pip3: pip3 install -U sphinx
.
- Выполните эти команды в терминале:
sudo -i
git clone https://github.com/EnlightenedCSF/Ocean.git
cd <cloned repo>
pip install --upgrade .
Создание нового эксперимента:
ocean project new -n "<project_name>" \ # ! обязательное значение !
-a "<author>" \ # по умолчанию `Surf`
-v "<version>" \ # по умолчанию `0.0.1`
-d "<description>" \ # по умолчанию ``
-l "<licence>" \ # по умолчанию `MIT`
-p "<path>" # по умолчанию `.`
Установка проекта как пакета в ваше pip-окружение:
make -B package
Создание нового эксперимента в проекте:
ocean exp new -n "<exp_name>" # ! обязательное значение !
-a "<author>" # ! обязательное значение !
За основу построения Ocean был взял шаблон cookiecutter-data-science и модифицирован. Прежде чем продолжить чтение, я настоятельно рекомендую взглянуть на него в рамках приведенной статьи, так как многие аспекты философии и подхода к организации проекта взяты оттуда.
Давайте взглянем на структуру оригинального шаблона:
├── LICENSE
├── Makefile <- Makefile with commands like `make data` or `make train`
├── README.md <- The top-level README for developers using this project.
├── data
│ ├── external <- Data from third party sources.
│ ├── interim <- Intermediate data that has been transformed.
│ ├── processed <- The final, canonical data sets for modeling.
│ └── raw <- The original, immutable data dump.
│
├── docs <- A default Sphinx project; see sphinx-doc.org for details
│
├── models <- Trained and serialized models, model predictions, or model summaries
│
├── notebooks <- Jupyter notebooks. Naming convention is a number (for ordering),
│ the creator's initials, and a short `-` delimited description, e.g.
│ `1.0-jqp-initial-data-exploration`.
│
├── references <- Data dictionaries, manuals, and all other explanatory materials.
│
├── reports <- Generated analysis as HTML, PDF, LaTeX, etc.
│ └── figures <- Generated graphics and figures to be used in reporting
│
├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g.
│ generated with `pip freeze > requirements.txt`
│
├── setup.py <- Make this project pip installable with `pip install -e`
├── src <- Source code for use in this project.
│ ├── __init__.py <- Makes src a Python module
│ │
│ ├── data <- Scripts to download or generate data
│ │ └── make_dataset.py
│ │
│ ├── features <- Scripts to turn raw data into features for modeling
│ │ └── build_features.py
│ │
│ ├── models <- Scripts to train models and then use trained models to make
│ │ │ predictions
│ │ ├── predict_model.py
│ │ └── train_model.py
│ │
│ └── visualization <- Scripts to create exploratory and results oriented visualizations
│ └── visualize.py
│
└── tox.ini <- tox file with settings for running tox; see tox.testrun.org
Взяв такой подход за основу в проекте, мы немного улучшили его сразу:
- добавили команду
make docs
для автоматической генерации документации по всем docstrings модуляsrc
; - добавили логгер для удобного файлового логирования (и, соответственно, добавили папку
logs
в корне проекта); - добавили сущность координатора для удобной навигации по проекту из скриптов и тетрадей без боязни опечататься в пути или без необходимости утомительно писать каждый раз
os.path.join
,os.path.abspath
илиos.path.dirname
.
С какими проблемами столкнулись, применив cookiecutter-data-science?
- Папка
data
может разростаться, но какой скрипт/тетрадь порождает очередной файл - не совсем ясно. В большом количестве легко запутаться. Не ясно, нужно ли в рамках реализации новой фичи использовать какие-то файлы из существующих, так как нигде не хранится описание/документация по их предназначению. - В
data
не хватает подпапкиfeatures
, в которую можно было бы складировать признаки: посчитанные статистики, эмбеддинги и другие характеристики, из которых можно было бы собрать разные конечные представления данных. Об этом было уже замечательно написано в этом блог-посте. src
- другая папка-проблема. В ней смешаны в одной большой куче как функциональность, актуальная в рамках проекта в целом (например, подготовка и чистка данных из подмодуляsrc.data
), так и очень частные вещи вродеsrc.models
: каждая модель может решать, возможно, узкую подзадачу, и в итоге получаем такую же свалку файлов.references
представлен, но все ещё стоит открытый вопрос, кто, когда и в каком виде должен заносить туда материалы. А рассказать можно много по ходу проекта: какие эксперименты проведены, каков их результат, каковы дальнейшие планы.
Для решения вышеперечисленых проблем и была выделена следующая сущность: эксперимент.
Назовем экспериментом сущность, которая является хранилищем всех данных, участвовавших в проверке некоторой гипотезы.
К их числу относятся:
- Какие данные были использованы.
- Какие данные (артефакты) были порождены в результате.
- Версия кода.
- Время начала и завершения эксперимента.
- Исполняемый файл.
- Параметры.
- Метрики.
- Логи.
Многие перечисленные пункты могут быть реализованы с помощью утилит-трекеров, например, mlflow, но этого не достаточно. Хотелось бы улучшить workflow, решив проблемы с организацией проекта, выделенные выше.
Модуль одного эксперимента выглядит следующим образом:
<project_root>
└── experiments
├── exp-001-Tree-models
│ ├── config <- yaml-файлы с настройками grid search или просто конфигурацией модели
│ ├── models <- сохраненные модели
│ ├── notebooks <- ноутбуки для экспериментов
│ ├── scripts <- скрипты, например, train.py или predict.py
│ ├── Makefile <- для управления экспериментом из консоли
│ ├── requirements.txt <- список зависимых библиотек
│ └── log.md <- лог проведения эксперимента
│
├── exp-002-Gradient-boosting
...
Рассмотрим подробнее workflow при проведении одного эксперимента.
- Создаются ноутбуки, в них подготавливаются данные, создается структура модели.
- Как только код подготовки модели завершен, он переносится в
train.py
.- В коде должен присутствовать трекинг параметров, например, с помощью
mlflow
. - В
config
создается файл с конфигурациейtrain.py
. - Обязательно должен управляться из консоли и принимать пути к необходимым данным,
config
-файлу и локации последующего сохранения готовой модели.
- В коде должен присутствовать трекинг параметров, например, с помощью
- Корректируется
Makefile
для последующего многократного запуска обучения. Итоговая команда должна быть без параметров вродеmake train
. - Прогоняется множество моделей, все метрики и параметры попадают в
mlflow
. А черезmlflow ui
можно посмотреть на результаты. - В завершении результаты пишутся в
log.md
. В нем предусмотрены элементы impact-анализа: необходимо пояснить, какие данные были использованы и какие были созданы в процессе. В последствии это поможет объединить все такие логи и сформировать единый readme в папкеdata
, и пояснить, где-что используется, автоматически.