Время прочтения: 4 мин.

В данной статье рассмотрим инструмент Hydra для работы с конфигурационными файлами на Python.

Рис. 1: Пример парсинга аргументов для тренировки ImageNet

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

Конфигурационные файлы — файлы, используемые для настройки параметров и начальных настроек некоторых компьютерных программ. Они используются для пользовательских приложений, серверных процессов и настроек операционной системы.

Популярные форматы: .yaml, .ini, .cnf, .cfg

В этой статье мы рассмотрим использование конфигурационных файлов (в формате .yaml) вместе со специальным пакетом Hydra[1],упрощающим работу с ними. Для иллюстрации базовых возможностей библиотеки рассмотрим минимальный пример.

Для установки модуля вызываем:

pip install hydra-core --upgrade

В директории проекта создадим папку conf и в ней  конфиг-файл first.yaml содержащий две строки с гиперпараметрами:

batch_size: 32
lr: 1e-5

Далее, создадим сам скрипт, main.py:

import hydra 
from omegaconf import DictConfig 
# декоратор необходимый для подгрузки конфигурации hydra
@hydra.main(config_path="conf", config_name="first")
def func(cfg: DictConfig): 
	# адрес временной папки
	working_dir = os.getcwd() 
	print(f"Batch size is {cfg.batch_size}") 
	print(f"Learning rate is {cfg['lr']}") 
if __name__ == "__main__": 
	func()

Обратим внимание на следующие моменты:

1) По умолчанию, при каждом запуске Hydra создает в директории скрипта отдельную папку по адресу: outputs/ДАТА_ЗАПУСКА/ВРЕМЯ_ЗАПУСКА/, куда складываются лог-файлы, конфигурация запуска и куда также можно сохранить результаты работы своего скрипта. Адрес папки получается так: working_dir = os.getcwd().

2) Для подключения гидры в проект, нужно перед методом, где будут использоваться прописанные в конфиг-файл параметры разместить декоратор: @hydra.main(config_path=»conf», config_name=»first»)

с указанием пути и названием конфигурационного файла. В качестве аргумента функции указывается cfg: DictConfig.

3) Параметры из конфиг-файла доступны по умолчанию в переменной cfg, например cfg.batch_size.

4) При запуске из командной строки есть возможность перезаписать или добавить дополнительные параметры конфиг-файла:

—config-name=first.yaml lr=2 +some_new_arg=1.0

lr был перезаписан, «+» перед названием аргумента some_new_arg показывает, что он добавлен.

Существует возможность сгруппировать конфигурации в отдельные файлы. Например, мы хотим протестировать для нашей модели различные оптимизаторы. Для этого можно создать новую директорию conf/optimizers и поместить в неё несколько конфиг-файлов для каждого из оптимизаторов.

Содержание файла adam.yaml, в нём находятся параметры оптимизатора adam:

beta_1: 0.9
beta_2: 0.99

Теперь если добавить в first.yaml:

defaults:
  - optimizer: adam

Тогда мы сможем получить параметры оптимизатора как:

cfg.optimizer.beta_1 
cfg.optimizer.beta_2

Такой модульный подход становится особенно удобен в больших проектах.

         Ещё одной интересной возможностью библиотеки является перебор нескольких конфигураций за один запуск. Предположим, мы создали ещё две конфигурации для использования различных датасетов: titanic и households.

 Тогда, чтобы перебрать все 4 доступные комбинации, нужно запустить:

—config-name=first.yaml optimizer=adam,sgd dataset=housholds,titanic -m

Указав флаг -m или —multirun и перечислив через запятую различные комбинации параметров мы запустили перебор.

Для сохранения результатов будет создана отдельная директория /multirun/.

Рассмотренное выше является лишь частью всех возможностей библиотеки Hydra. Ознакомиться с остальными функциями, такими как лаунчеры (позволяют выполнять код параллельно или даже удалённо на серверах AWS),  свиперы (оптимизируют определённую метрику перебирая разные конфигурации) и многим другим можно в документации: https://hydra.cc/docs/intro/.


[1]     Hydra framework: https://hydra.cc/