我知道我可以通过在命令行中设置hydra.run.dir=XXX
来更改配置中的工作dir。但是,如何使用CLI参数从脚本w/o正确地执行此操作,以便即使日志也保存在我设置的dir中?
此代码无法工作,因为:
cfg.hydra
。UPD:我在注释中得到了一个指针。在调用hydra之前,我可以更改块if __name__ == 'main':
中的hydra参数。但是如何从脚本中获得访问和修改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')
我的水电配置如下所示:
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
发布于 2021-05-27 10:38:12
@hydra.main
装饰器从sys.argv
读取命令行参数,并在执行修饰函数之前创建输出目录并根据参数设置日志记录。输入函数之前没有配置,但是可以在使用这种黑客调用函数之前添加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()
发布于 2020-11-10 08:33:52
这可以通过omegaconf插值来实现。
例如,当我创建用uuid命名的目录时,我的用例
首先,我们用我们需要的函数来注册解析器,而不是lambda。
from omegaconf import OmegaConf
OmegaConf.register_resolver("uuid", lambda : "fdjsfas-3213-kjfdsf")
在水龙头配置中
hydra:
run:
dir: ./outputs/training/${uuid:}
这仍然不是真正从脚本中访问,但它允许python代码生成配置变量。我真的不认为有一种正常的方式来改变水龙头配置后,它被初始化。
我使用结构化的吐露,并且不得不修改代码,所以它可能实际上不起作用,但我希望你有了这个想法。
发布于 2020-11-01 18:31:50
可以在脚本开始之前通过重写该参数来更改它。
python foo.py hydra.run.dir=something
您也可以在您的配置中更改它: config.yaml
hydra:
run:
dir: whatever
这还可以使用OmegaConf env解析器在配置中使用环境变量。
hydra:
run:
dir: ${env:HYDRA_OUTPUT_DIR,default_output_dir}
如果您只想在运行时更改工作目录,可以使用os.chdir()进行更改。
https://stackoverflow.com/questions/64633342
复制相似问题