【发布时间】:2021-02-14 09:20:52
【问题描述】:
我知道我可以通过在命令行中设置hydra.run.dir=XXX 来更改配置中的工作目录。
但是如何在不使用 CLI 参数的情况下从脚本中正确执行此操作,甚至将日志保存在我设置的目录中?
此代码不起作用,因为:
- 当我尝试更改目录时,hydra 及其记录器已经初始化,并且
- 没有这样的属性
cfg.hydra。
UPD:我在 cmets 中有一个指针。我可以在调用 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')
我的 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
【问题讨论】:
-
我不认识九头蛇。主要的 Python 入口点是在您的代码中还是在 Hydra 库中?如果它在您的代码中,那么您必须能够在 Hydra 初始化之前进行更改。如果不是,那么您是在谈论让 Hydra 根据新位置重新初始化自身,对吗?这似乎是一个长镜头。我很好奇为什么您需要动态地执行此操作。如果你真的这样做,那么使用命令行参数的包装启动脚本怎么样,但对你隐藏它并根据你将在主程序中使用的任何方法设置目录。
-
谢谢,@史蒂夫。这就说得通了。如果
if __name__ == 'main':阻塞,我的入口点,我假设它在 hydra 之前被调用。我可以尝试在那里更改参数,但是没有明显的方法,因为 hydra 在脚本启动后对用户隐藏其内部配置。
标签: python fb-hydra hydra-python