5

我知道我可以通过hydra.run.dir=XXX从命令行设置来更改配置中的工作目录。但是如何在不使用 CLI 参数的情况下从脚本中正确地做到这一点,即使日志也保存在我设置的目录中?

此代码不起作用,因为:

  1. 当我尝试更改目录和
  2. 没有这样的属性cfg.hydra

UPD:我在评论中得到了一个指针。我可以在调用 hydra 之前更改块中的 hydra 参数if __name__ == 'main':hydra.run.dir但是如何从脚本中获取和修改呢?

    @hydra.main(config_path="conf", config_name="config")
    def main(cfg):
        cfg.hydra.run.dir = "./c_out/cached_loss"  # no such attribute
        logger.info('I log something')

我的 hydra 配置如下所示:

defaults:                     
  - hydra/job_logging: custom_logging 
# hydra/custom_logging.yaml
# python logging configuration for tasks                           
version: 1                                                         
formatters:                                                        
  simple:                                                          
    format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' 
handlers:                                                          
  console:                                                         
    class: logging.StreamHandler                                   
    formatter: simple                                              
    stream: ext://sys.stdout                                       
  file:                                                            
    class: logging.FileHandler                                     
    formatter: simple                                              
    # relative to the job log directory                            
    filename: ${hydra.job.name}.log                                
root:                                                              
  level: INFO                                                      
  handlers: [console, file]                                        
                                                                   
disable_existing_loggers: false                                    
4

3 回答 3

5

这可以通过omegaconf 插值
来实现 例如,当我创建以 uuid 命名的目录时,我的用例
首先我们使用我们需要的函数而不是 lambda 注册解析器

from omegaconf import OmegaConf

OmegaConf.register_resolver("uuid", lambda : "fdjsfas-3213-kjfdsf")

在 hydra 配置中

hydra:
  run:
    dir: ./outputs/training/${uuid:}

这仍然不是真正从脚本访问,但它允许 python 代码生成配置变量。我真的不认为有一种正常的方法可以在初始化 hydra 配置后对其进行更改。

PS我使用结构化配置并且不得不更改代码所以它可能实际上不起作用但我希望你明白了

于 2020-11-10T08:33:52.383 回答
3

在执行装饰函数之前,装饰@hydra.main器从命令行参数读取sys.argv并创建输出目录并根据参数设置日志记录。在进入函数之前您没有配置,但是您可以在hydra.run.dir=XXX使用这种 hack 调用函数之前添加命令行参数:

@hydra.main(config_path="conf", config_name="config")
def main(cfg):
    logger.info('I log something')

if __name__ == 'main':
    sys.argv.append('hydra.run.dir=c_out/cached_loss')
    main()
于 2021-05-27T10:38:12.957 回答
0

您可以在脚本开始之前通过覆盖该参数来更改它。

python foo.py hydra.run.dir=something

您也可以在配置中更改它:config.yaml

hydra:
  run:
    dir: whatever

这也可以使用OmegaConf env resolver在配置中使用环境变量。

hydra:
  run:
    dir: ${env:HYDRA_OUTPUT_DIR,default_output_dir}

如果您只想在运行时更改工作目录,可以使用os.chdir()

于 2020-11-01T18:31:50.717 回答