是否可以使用结构化配置定义目标以避免重新定义所有参数?
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
。下面是一个使用具有结构化配置的instantiate
API的示例:
# 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_function
、builtins.range
、numpy.random.randn
等。instantiate
函数使用此点路径来查找将被实例化的可调用对象(在本例中为trgt
函数( - 结构化配置的字段(除了
_target_
字段和其他特殊保留字段,如_recursive_
、_convert_
和_args_
(将作为关键字参数传递给查找的可调用项。在本例中,使用关键字参数arg1=123
和arg2=10.1
调用函数trgt
。这相当于python代码trgt(arg1=123, arg2=10.1)
- 如果定义结构化配置(使用
@dataclass
或@attr.s
(,则可以为每个字段指定默认值。例如,上面字段arg1
的默认值为123
。如果config
有任何字段的值丢失,则调用instantiate(config)
将导致异常。通常,结构化配置的缺失值将在Hydra的配置组合过程中填充
参考文献:
- 关于结构化配置的OmegaConf文档
- 使用具有结构化配置的
_target_
的Hydra示例