如何使用“_target_”字段将Hydra配置转储为YAML

3
我从一个Python数据类中实例化了一个Hydra配置。例如:

我从一个Python数据类中实例化了一个Hydra配置。例如:

from dataclasses import dataclass
from typing import Any
from hydra.utils import instantiate

class Model():
    def __init__(self, x=1):
        self.x = x

@dataclass
class MyConfig:
    model: Any
    param: int

static_config = MyConfig(model=Model(x=2), param='whatever')
instantiated_config = instantiate(static_config)


现在,我想将此配置转储为yaml格式,包括Hydra用于重新实例化配置内指向对象的_target_字段。我希望避免编写自己的逻辑来编写这些_target_字段,并且我想象中一定有一些Hydra工具可以做到这一点,但我似乎在文档中找不到它。

你的示例static_config没有_target_字段。 - Jasha
@Jasha 没错,这就是我希望有一个实用程序的原因。我不想手动编写带有_target_字段的yaml文件。相反,我希望从加载了已经实例化了内部Python对象的数据类中加载配置,并将其转储到yaml中,根据对象初始化的位置适当地输入_target_字段。我可以尝试自己设计这个功能,但是配置内部的对象可以任意嵌套,我希望Hydra开发人员已经解决了这个问题。 - Mike
1个回答

2

请参考OmegaConf.to_yamlOmegaConf.save

from omegaconf import OmegaConf

# dumps to yaml string
yaml_data: str = OmegaConf.to_yaml(my_config)

# dumps to file:
with open("config.yaml", "w") as f:
    OmegaConf.save(my_config, f)

# OmegaConf.save can also accept a `str` or `pathlib.Path` instance:
OmegaConf.save(my_config, "config.yaml")

另请参阅Hydra-Zen项目,该项目提供了OmegaConf对象的自动生成(可以保存为yaml文件)。


谢谢您的回答。当我运行以下给出的示例代码时OmegaConf.to_yaml(instantiated_config)我得到了以下字符串'model: !!python/object:__main__.Model\n x: 2\nparam: 2\n'我还没有深入研究OmegaConf以及它用于引用Python对象的语法/约定,看起来Hydra团队已经使用!!python/object ...语法来构建他们的_target_功能。我希望实际输出一个使用_target_字段而不是这种!!python/object符号的yaml。 - Mike
1
如果我理解正确,您希望_target_根据对象类型自动生成。 OmegaConf.to_yaml并不是为序列化任意Python对象而设计的;它是为序列化OmegaConf对象(如DictConfigListConfig)而设计的。您可能想查看Hydra-Zen项目,该项目提供了OmegaConf对象的自动生成(可以保存为yaml)。 - Jasha
哇,Hydra-Zen文档的第一页就准确地回答了我的问题,如何在Hydra中实现,并且他们还试图简化这个过程。谢谢!从技术上讲,那个链接就是答案,但如果你觉得可以重新编写一个带有该链接的一行代码,以便其他人更快地注意到它,我也会接受你的答案。 - Mike
很高兴你找到了需要的东西!我已经在上面的答案中添加了链接。 - Jasha
为什么这是一个被接受的答案?它并没有回答问题。to_yaml不会生成_target_字段。 - ubadub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接