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

Просто дайте мне код

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

Почему важна структура проекта

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

Вот почему важна хорошая структура проекта:

  1. Улучшенная понятность. Логически и интуитивно структурированный проект легче понять не только другим, но и вам самим в будущем. Каждый каталог и файл в структуре имеют четкую цель и вносят значимый вклад в общий проект.
  2. Улучшенная ремонтопригодность. При хорошей структуре проекта изменение одной части системы оказывает минимальное влияние на остальные. Эта изоляция снижает риск непреднамеренных побочных эффектов, упрощая поддержку и расширение проекта.
  3. Эффективная совместная работа. В командной работе жизненно важен хорошо структурированный проект. Он предоставляет четкую дорожную карту для каждого члена команды, облегчая им понимание всего проекта и эффективное участие, не рискуя помешать работе друг друга.
  4. Масштабируемость. Хорошо спланированная структура может обеспечить рост. По мере роста сложности или размера вашего проекта хорошая структура позволит вам эффективно управлять этим ростом, гарантируя, что повышенная сложность не превратится в обязательство.

Структура проекта

Обсудив важность хорошей структуры проекта, давайте теперь рассмотрим, как ее структурировать. Имейте в виду, что хотя эта структура, как правило, является хорошей отправной точкой для любого проекта машинного обучения, она лучше всего подходит для PyTorch и PyTorch Lighting и следует шаблонам, которые помогают разделить проблемы и сделать код более управляемым с помощью этих библиотек.

Структура выглядит следующим образом:

.
├── .data
│   ├── processed
│   │   ├── test.csv
│   │   └── train.csv
│   └── raw
│       └── data.csv
|
├── .experiments
│   └── model1
│       ├── version_0
|       |   └── ...
|       └── ...
└── src
    |
    └── ml
        ├── data
        │   ├── make_dataset.py
        │   └── preprocessing.py
        |
        ├── datasets
        │   ├── dataset1
        │   |   ├── datamodule.py
        │   |   └── dataset.py
        |   └── ...
        |
        ├── engines
        │   └── system.py
        |
        ├── models
        │   ├── model1.py
        │   └── model2.py
        |
        ├── scripts
        │   ├── predict.py
        │   ├── test.py
        │   └── train.py
        |
        └── utils
            ├── constants.py
            └── helpers.py

Теперь давайте пройдемся по структуре каталогов:

.data: Этот каталог предназначен для хранения всех данных, используемых в проекте. Далее он разделен на два подкаталога:

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

.experiments: В этом каталоге хранятся результаты различных прогонов обучения модели. У каждой модели может быть несколько версий, каждая из которых соответствует уникальному тренировочному запуску с потенциально разными гиперпараметрами или данными. Хотя PyTorch Lighting по умолчанию называет этот каталог .lightining_logs, предпочтительно переименовать его, чтобы упростить понимание для тех, кто впервые изучает проект.

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

ml/data: В этом каталоге хранятся сценарии, обрабатывающие данные. Он может включать такие файлы, как make_dataset.py (скрипт для загрузки, фильтрации, предварительной обработки и разделения необработанных данных на обучающие и тестовые сплиты) и preprocessing.py (скрипт, содержащий функции для очистки данных и подготовки к моделированию).

ml/datasets: Этот каталог содержит скрипты, которые определяют, как загружать и обрабатывать данные, используемые моделями. Он также может содержать подкаталоги, такие как dataset1, для дополнительного разделения в случае нескольких наборов данных. Каждый каталог должен содержать как минимум два файла:

  • dataset.py: содержит Dataset PyTorch, который обеспечивает эффективную и гибкую загрузку данных.
  • datamodule.py: содержит LightningDataModule от PyTorch Lighting, который организует этапы загрузки и подготовки данных и предлагает понятный и стандартизированный интерфейс для данных, используемых в системах PyTorch Lightning.

ml/engines: Этот каталог содержит все, что связано с обучением, проверкой и тестированием моделей, а также может содержать файлы, связанные с этими процессами, такие как оптимизаторы и расписания. Например, system.py должен включать LightningModule, определяющий этапы обучения, проверки и тестирования.

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

ml/scripts: этот каталог содержит сценарии для запуска различных частей проекта, например train.py для обучения модели, test.py для тестирования и predict.py для использования обученной модели для прогнозирования. Эти сценарии обычно включают класс Trainer PyTorch Lightning, который занимается слиянием LightningModule с mLightningDataModule, выполнением определенных обратных вызовов, таких как EarlyStopping и Checkpointing, и, как правило, автоматизацией всего процесса машинного обучения.

ml/utils: Этот каталог содержит вспомогательные функции, константы и все остальное, что используется в проекте. Общее эмпирическое правило заключается в том, что если элемент используется в проекте и не помещается в указанные выше каталоги, его следует поместить в этот каталог.

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

Заключение

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

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

Вы можете найти этот шаблон проекта на моем Github в этом репозитории. Если у вас есть какие-либо вопросы или предложения, я буду рад их услышать! Пожалуйста, не стесняйтесь оставлять комментарии — всегда приятно поболтать и обсудить эти темы дальше.