2022-03-08 15:00:57
machine learning pipeline - часть 2В предыдущих частях мы поговорили об основах ML пайплайнов и о структуре проекта и cookiecutter, а сегодня о конфигурациях для проектов машинного обучения - Hydra.
В чем собственно проблема и почему я стал использовать Hydra? При запуске Python скриптов добавляют много аргументов, хотя иногда их можно и сгруппировать. Вот пример такого скрипта:
parser.add_argument('data', metavar='DIR', help='path to dataset')
parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18', choices=model_names, help='model architecture: ' + ' | '.join(model_names) + ' (default: resnet18)')
parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', help='number of data loading workers (default: 4)')
parser.add_argument('--epochs', default=90, type=int, metavar='N', help='number of total epochs to run')
....
Распространенным решением, позволяющим контролировать растущую сложность, является переход на файлы конфигураций. Файлы конфигурации могут быть иерархическими и могут помочь уменьшить сложность кода, определяющего аргументы командной строки. Но и у них есть свои недостатки.
Например:
- Во время экспериментов вам может понадобиться запустить приложение с различными параметрами конфигурации. Сначала вы можете просто изменять файл конфигурации перед каждым запуском, но вскоре вы поймете, что трудно отслеживать изменения, связанные с каждым запуском.
- Файлы конфигурации становятся монолитными. Но если вы, например, хотите, чтобы ваш код использовал разные параметры конфигурации, скажем, один для набора данных ImageNet и один для набора данных CIFAR-10, у вас есть два варианта: поддерживать два файла конфигурации или поместить оба параметра в один файл конфигурации и каким-то образом используйте только то, что вам нужно во время выполнения.
Ну, а решение всех вышеперечисленных неудобств - Hydra.
Hydra — позволяет создавать композицию конфигураций. Композиция может работает как с файлом конфигурации, так и в командной строке. При этом всё в составленной конфигурации также может быть переопределено через командную строку.
Пример использования:
Файл conf/config.yamldefaults:
- dataset: cifar10
Файл conf/dataset/imagenet.yamldataset:
name: imagenet
path: /datasets/imagenet
Файл app.pyimport hydra
from omegaconf import DictConfig @hydra.main(config_path="conf/config.yaml")
def my_app(cfg: DictConfig) -> None:
...
if __name__ == "__main__":
my_app()
При запуске будет использоваться параметр dataset по умолчанию. Но вы так же передать параметр и консоле:
python app.py dataset.path = /datasets/cifar10Еще одна крутая фишка: multirun — это возможность Hydra запускать вашу функцию несколько раз, каждый раз создавая новый объект конфигурации. Это очень удобно для проверки параметров без написания дополнительных функций. Например, мы можем просмотреть все 4 комбинации (2 набора данных X 2 оптимизатора):
python app.py —multirun dataset= imagenet, cifar10 optimizer=adam, nesterovВ этой мини заметке я постарался описать проблемы с конфигами, с которым сталкиваешься при написании пайплайнов и часть функций, которые предлагает Hydra.
Чтобы узнать больше о Hydra предлагаю почитать и посмотреть:
- Сайт Hydra
- Hydra — A fresh look at configuration for machine learning projects
- Как эффективно проводить эксперименты, Роман Суворов
- Артур Кузин: DL Pipelines tips & tricks
PS. То как это выглядит у меня проекте можно увидеть на скрине
3.0K views12:00