首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从脚本中重写hydra工作域?

如何从脚本中重写hydra工作域?
EN

Stack Overflow用户
提问于 2020-11-01 15:05:16
回答 3查看 5.6K关注 0票数 8

我知道我可以通过在命令行中设置hydra.run.dir=XXX来更改配置中的工作dir。但是,如何使用CLI参数从脚本w/o正确地执行此操作,以便即使日志也保存在我设置的dir中?

此代码无法工作,因为:

  1. 当我试图更改dir和
  2. 没有这样的属性cfg.hydra

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

代码语言:javascript
运行
复制
    @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')

我的水电配置如下所示:

代码语言:javascript
运行
复制
defaults:                     
  - hydra/job_logging: custom_logging 
代码语言:javascript
运行
复制
# 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                                    
EN

回答 3

Stack Overflow用户

发布于 2021-05-27 10:38:12

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

代码语言:javascript
运行
复制
@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()
票数 7
EN

Stack Overflow用户

发布于 2020-11-10 08:33:52

这可以通过omegaconf插值来实现。

例如,当我创建用uuid命名的目录时,我的用例

首先,我们用我们需要的函数来注册解析器,而不是lambda。

代码语言:javascript
运行
复制
from omegaconf import OmegaConf

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

在水龙头配置中

代码语言:javascript
运行
复制
hydra:
  run:
    dir: ./outputs/training/${uuid:}

这仍然不是真正从脚本中访问,但它允许python代码生成配置变量。我真的不认为有一种正常的方式来改变水龙头配置后,它被初始化。

我使用结构化的吐露,并且不得不修改代码,所以它可能实际上不起作用,但我希望你有了这个想法。

票数 5
EN

Stack Overflow用户

发布于 2020-11-01 18:31:50

可以在脚本开始之前通过重写该参数来更改它。

代码语言:javascript
运行
复制
python foo.py hydra.run.dir=something

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

代码语言:javascript
运行
复制
hydra:
  run:
    dir: whatever

这还可以使用OmegaConf env解析器在配置中使用环境变量。

代码语言:javascript
运行
复制
hydra:
  run:
    dir: ${env:HYDRA_OUTPUT_DIR,default_output_dir}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64633342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档