如何在Hydra中使用带有数据类参数的可调用目标



是否可以使用结构化配置定义目标以避免重新定义所有参数?

def good(config: Config):
pass
def bad(param1, param2):
pass
@dataclass
class Config:
param1
param2
_target_: Any = good
# _target_: Any = bad
# _target_: str = 'Config.also_good'
def also_good(self):
pass

如果是类、函数或方法,我应该为_target_使用什么类型的注释?当我使用Any时,我得到了

omegaconf.errors.UnsupportedValueType: Value 'function' is not a supported primitive type
full_key: _target_

_target_类型应为str。下面是一个使用具有结构化配置的instantiateAPI的示例:

# example.py
from dataclasses import dataclass
from hydra.utils import instantiate

def trgt(arg1: int, arg2: float):
print(f"trgt function: got {arg1}, {arg2}")
return "foobar"

@dataclass
class Config:
_target_: str = "__main__.trgt"  # dotpath describing location of callable
arg1: int = 123
arg2: float = 10.1

val = instantiate(Config)
print(f"Returned value was {val}.")

运行脚本:

$ python example.py
trgt function: got 123, 10.1
Returned value was foobar.

注:

  • CCD_ 5字段必须是描述";点路径";用于查找可调用项(上例中为__main__.trgt(。其他典型的点路径是例如my_module.my_functionbuiltins.rangenumpy.random.randn等。instantiate函数使用此点路径来查找将被实例化的可调用对象(在本例中为trgt函数(
  • 结构化配置的字段(除了_target_字段和其他特殊保留字段,如_recursive__convert__args_(将作为关键字参数传递给查找的可调用项。在本例中,使用关键字参数arg1=123arg2=10.1调用函数trgt。这相当于python代码trgt(arg1=123, arg2=10.1)
  • 如果定义结构化配置(使用@dataclass@attr.s(,则可以为每个字段指定默认值。例如,上面字段arg1的默认值为123。如果config有任何字段的值丢失,则调用instantiate(config)将导致异常。通常,结构化配置的缺失值将在Hydra的配置组合过程中填充

参考文献:

  • 关于结构化配置的OmegaConf文档
  • 使用具有结构化配置的_target_的Hydra示例

相关内容

  • 没有找到相关文章

最新更新