微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从脚本中覆盖hydra工作目录?

如何解决如何从脚本中覆盖hydra工作目录?

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

代码不起作用,因为:

  1. 当我尝试更改目录和时,hydra及其记录器已经初始化
  2. 没有这样的属性cfg.hydra

UPD :我在注释中有一个指针。我可以在调用hydra之前在块if __name__ == 'main':中更改hydra paeramerters。但是如何从脚本获取访问权限并修改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                                    

解决方法

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

from omegaconf import OmegaConf

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

在hydra配置中

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

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

P.S。我使用结构化配置,并且不得不更改代码,因此它可能实际上不起作用,但是希望您能理解

,

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

@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()
,

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

python foo.py hydra.run.dir=something

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

hydra:
  run:
    dir: whatever

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。