Рекурсивная инициализация и как использовать config group внутри другой config group

#fb-hydra #hydra-python

#fb-hydra

Вопрос:

Я изучаю варианты рекурсивной инициализации в hydra. Я смог настроить рабочий пример на основе этого PR. Пробуя более продвинутые вещи, я наткнулся на следующую проблему. Моя структура каталогов выглядит следующим образом:

 config/
  config.yaml
    /tokenizer
      Tokenizer.yaml
    /normalizer
      Normalizer.yaml
  

Конфигурации содержат:

 <config.yaml>
default:
  - tokenizer: Tokenizer

<Tokenizer.yaml>
_target_: some.path.Tokenizer
normalizer: Normalizer # I want this to be the Normalizer object after instantiation, but getting string. 

<Normalizer.yaml>
_target_: some.other.path.Normalizer
arg1: value1
  

Я хочу рекурсивно создать экземпляр токенизатора без необходимости явной записи всех аргументов нормализатора, поскольку все они уже упомянуты в файле Normalizer.yaml. Другими словами, я хотел бы использовать группу конфигурации нормализатора внутри группы конфигурации токенизатора. Прямо сейчас, если я вызываю tokenizer = instantiate(cfg.tokenizer) , результатом является объект класса Tokenizer, но tokenizer.normalizer это строка Normalizer . Если я использую интерполяцию значений и настрою проект следующим образом:

 <config.yaml>
default:
  - tokenizer: Tokenizer
  - normalizer: Normalizer

<Tokenizer.yaml>
_target_: some.path.Tokenizer
normalizer: ${normalizer} 

<Normalizer.yaml>
_target_: some.other.path.Normalizer
arg1: value1
  

Результирующая переменная tokenizer.normalizer представляет собой dict, содержащий аргументы для нормализатора, подобного so {"_target_": ...} , вместо того, чтобы быть инициализированным классом нормализатора. Как я могу избежать необходимости явно повторять определение нормализатора внутри конфигурации токенизатора?

Комментарии:

1. Это поможет, если вы покажете свою фактическую окончательную конфигурацию и теперь, что вы делаете, чтобы ее составить.

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

3. @omry Я отредактировал вопрос, чтобы придать ему больше смысла. Некоторые части отсутствовали. Теперь это более понятно?

Ответ №1:

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