Hydra在Python中配置键查找逻辑及nuPlan配置映射疑问
问题背景
我在使用nuPlan devkit的nuplan_framework教程时,运行代码遇到以下错误:
MissingConfigException: In 'default_training': Could not find 'training/vector_model'
Available options in 'training':
training_raster_model
training_simple_vector_model
training_urban_driver_open_loop_model
training_vector_model
Config search path:
provider=hydra, path=pkg://hydra.conf
provider=main, path=file:///home/ross/nuplan-devkit/nuplan/planning/script/config/training
provider=hydra.searchpath in main, path=pkg://nuplan.planning.script.config.common
provider=hydra.searchpath in main, path=pkg://nuplan.planning.script.experiments
provider=schema, path=structured://
通过修改教程中的代码解决了问题:原代码片段:
cfg = hydra.compose(config_name=CONFIG_NAME, overrides=[ f'group={str(SAVE_DIR)}', f'cache.cache_path={str(SAVE_DIR)}/cache', f'experiment_name={EXPERIMENT}', f'job_name={JOB_NAME}', 'py_func=train', '+training=vector_model', 'scenario_builder=nuplan', #nuplan_mini', # use nuplan mini database 'scenario_filter.limit_total_scenarios=500', # Choose 500 scenarios to train with 'lightning.trainer.params.accelerator=ddp_spawn', # ddp is not allowed in interactive environment, using ddp_spawn instead - this can bottleneck the data pipeline, it is recommended to run training outside the notebook 'lightning.trainer.params.max_epochs=30', 'data_loader.params.batch_size=8', 'data_loader.params.num_workers=8', ])
将其中的+training=vector_model改为+training=training_vector_model即可解决。
但有两个疑惑:
- Hydra在Python中从何处查找配置键?
- 文件系统中只有
vector_model.yaml文件,却没有training_vector_model.yaml,Hydra是从哪里获取可用选项列表,以及如何将training_vector_model关联到vector_model.yaml的?
解答
1. Hydra查找配置键的路径
Hydra会从错误信息里列出的Config search path中按顺序查找配置:
pkg://hydra.conf:Hydra自身的默认配置路径file:///home/ross/nuplan-devkit/nuplan/planning/script/config/training:项目指定的本地训练配置根目录pkg://nuplan.planning.script.config.common、pkg://nuplan.planning.script.config.experiments:nuPlan devkit通过hydra.searchpath配置注册的Python包内的配置路径structured://:代码中定义的结构化配置(配置类)的路径
Hydra会优先匹配路径靠前的配置,找不到就会抛出你遇到的缺失配置异常。
2. training_vector_model与vector_model.yaml的关联逻辑
这是nuPlan devkit利用了Hydra的配置分组+别名映射机制:
- 在训练配置目录(
.../config/training)下的根配置文件(比如config.yaml)中,会定义training配置组的可用选项,其中training_vector_model是一个别名,指向实际的vector_model.yaml文件。 - 举个例子,
training/config.yaml里可能有类似这样的配置:
通过这种方式,Hydra会把defaults: - _self_ - vector_model: training_vector_model training_vector_model: _target_: nuplan.planning.script.config.training.vector_modeltraining_vector_model这个选项和vector_model.yaml的配置内容关联起来。 - 错误信息里的可用选项列表,是Hydra从配置组的定义(包括根配置文件、结构化配置)中解析出来的,并非直接对应文件系统的文件名。
内容的提问来源于stack exchange,提问作者ROS

