有没有办法在hydra中记录“git hash”?

42fyovps  于 2022-10-23  发布在  Git
关注(0)|答案(2)|浏览(204)

我想用hydra和dvc控制实验配置文件的版本,而不需要将原始配置文件上传到git。
Hydra控制配置,dvc控制版本。但Hydra并没有说明复制实验所需的“代码版本”。我不想在每次实验中都添加“git哈希日志代码”。
在默认情况下,有没有方法将git哈希记录到hydra日志中?提前感谢

mepcadol

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捕获输出。

qpgpyjmq

qpgpyjmq2#

Hydra的callbacks API涵盖了这个用例。
使用GitPython等库,可以在Hydra回调中获取当前的git sha。以下示例使用了Hydra的标准logging mechanism


# 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

相关问题