我想用hydra和dvc控制实验配置文件的版本,而不需要将原始配置文件上传到git。Hydra控制配置,dvc控制版本。但Hydra并没有说明复制实验所需的“代码版本”。我不想在每次实验中都添加“git哈希日志代码”。在默认情况下,有没有方法将git哈希记录到hydra日志中?提前感谢
mepcadol1#
好时机!DVC Hydra集成正在开发中。您可以在https://github.com/iterative/dvc/discussions/7044#discussioncomment-3271855和https://github.com/iterative/dvc/pull/8093中的开发进度。这将允许您进行Hydra配置,通过dvc exp run --set-param=<hydra_overrides>传递Hydra覆盖,并使用DVC捕获输出。
dvc exp run --set-param=<hydra_overrides>
qpgpyjmq2#
Hydra的callbacks API涵盖了这个用例。使用GitPython等库,可以在Hydra回调中获取当前的git sha。以下示例使用了Hydra的标准logging mechanism:
GitPython
# hydra_git_callback.py import logging from typing import Any import git # installed with `pip install gitpython` from hydra.experimental.callback import Callback from omegaconf import DictConfig log = logging.getLogger(__name__) def get_git_sha(): repo = git.Repo(search_parent_directories=True) sha = repo.head.object.hexsha return sha class MyCallback(Callback): def on_run_start(self, config: DictConfig,**kwargs: Any) -> None: sha = get_git_sha() log.info(f"Git sha: {sha}") def on_multirun_start(self, config: DictConfig,**kwargs: Any) -> None: sha = get_git_sha() log.info(f"Git sha: {sha}")
然后,您可以在Hydra配置中确定此回调的目标:
# config.yaml hydra: callbacks: git_logging: _target_: hydra_git_callback.MyCallback foo: bar
# my_app.py import hydra from omegaconf import DictConfig, OmegaConf @hydra.main(version_base="1.2", config_path=".", config_name="config") def my_app(cfg: DictConfig) -> None: print(OmegaConf.to_yaml(cfg)) if __name__ == "__main__": my_app()
运行应用程序:
$ python my_app.py [2022-10-19 18:52:04,152][HYDRA] Git sha: 8bde1327f0e0ba7b1147b4338c53882aaeb0cf9f foo: bar
2条答案
按热度按时间mepcadol1#
好时机!DVC Hydra集成正在开发中。您可以在https://github.com/iterative/dvc/discussions/7044#discussioncomment-3271855和https://github.com/iterative/dvc/pull/8093中的开发进度。这将允许您进行Hydra配置,通过
dvc exp run --set-param=<hydra_overrides>
传递Hydra覆盖,并使用DVC捕获输出。qpgpyjmq2#
Hydra的callbacks API涵盖了这个用例。
使用
GitPython
等库,可以在Hydra回调中获取当前的git sha。以下示例使用了Hydra的标准logging mechanism:然后,您可以在Hydra配置中确定此回调的目标:
运行应用程序: