Hydra主配置文件和模块化配置管理
在 Hydra 中,我们可以使用 defaults
关键字 在主配置文件 config.yaml
中加载多个子配置文件,从而实现 模块化配置管理。这在深度学习、超参数优化、数据预处理等场景下非常有用。
1️⃣ 配置文件目录结构
假设我们有一个深度学习训练项目,包含数据集、模型和训练超参数的配置。我们的配置目录结构如下:
project/
│── main.py # 入口 Python 脚本
│── config/ # 配置文件目录
│ ├── config.yaml # 主配置文件
│ ├── dataset/ # 数据集配置
│ │ ├── cifar10.yaml
│ │ ├── imagenet.yaml
│ ├── model/ # 模型配置
│ │ ├── resnet.yaml
│ │ ├── transformer.yaml
│ ├── trainer/ # 训练相关配置
│ │ ├── default.yaml
│ │ ├── gpu.yaml
2️⃣ 具体的配置文件内容
🔹 (1) 主配置文件 config.yaml
defaults:
- dataset: cifar10 # 默认加载 dataset/cifar10.yaml
- model: resnet # 默认加载 model/resnet.yaml
- trainer: default # 默认加载 trainer/default.yaml
experiment_name: "test_run" # 额外的全局参数
🔹 (2) 数据集配置
📌 dataset/cifar10.yaml
dataset:
name: "CIFAR10"
batch_size: 64
num_workers: 4
📌 dataset/imagenet.yaml
dataset:
name: "ImageNet"
batch_size: 256
num_workers: 8
🔹 (3) 模型配置
📌 model/resnet.yaml
model:
name: "ResNet50"
num_layers: 50
pretrained: true
📌 model/transformer.yaml
model:
name: "Transformer"
num_heads: 8
hidden_dim: 512
🔹 (4) 训练配置
📌 trainer/default.yaml
trainer:
epochs: 10
learning_rate: 0.001
optimizer: "adam"
📌 trainer/gpu.yaml
trainer:
epochs: 20
learning_rate: 0.0005
optimizer: "adamw"
gpus: 2
📌 3️⃣ Python 代码示例
import hydra
from omegaconf import DictConfig
@hydra.main(config_path="config", config_name="config.yaml")
def main(cfg: DictConfig) -> None:
print("Experiment Name:", cfg.experiment_name)
print("Dataset:", cfg.dataset.name)
print("Batch Size:", cfg.dataset.batch_size)
print("Model:", cfg.model.name)
print("Training Epochs:", cfg.trainer.epochs)
print("Learning Rate:", cfg.trainer.learning_rate)
if __name__ == "__main__":
main()
📌 4️⃣ 通过命令行覆盖配置
Hydra 允许你在命令行运行时覆盖配置项。例如:
python main.py dataset=imagenet model=transformer trainer=gpu
🔹 覆盖后输出:
Experiment Name: test_run
Dataset: ImageNet
Batch Size: 256
Model: Transformer
Training Epochs: 20
Learning Rate: 0.0005
📌 5️⃣ 额外的 Hydra 特性
🟢 5.1 +
号新增配置项
如果你想 在运行时添加新的配置项(而不是覆盖现有项),可以使用 +
号:
python main.py +extra_param=new_value
这会在 cfg
中新增:
extra_param: new_value
🟢 5.2 hydra.run.dir
指定运行目录
Hydra 默认会在运行时创建新的目录存储日志和输出结果。你可以修改 hydra.run.dir
让所有运行结果存放在 outputs/
目录:
hydra:
run:
dir: outputs/${now:%Y-%m-%d}/${now:%H-%M-%S}
这样,每次运行时,日志会存放到:
outputs/2025-02-13/14-30-12/
🎯 总结
功能 | 作用 |
---|---|
defaults | 指定要加载的默认配置文件 |
dataset: cifar10 | 选择 dataset/cifar10.yaml |
model: resnet | 选择 model/resnet.yaml |
trainer: default | 选择 trainer/default.yaml |
命令行覆盖 | python main.py dataset=imagenet model=transformer trainer=gpu |
+param=value | 运行时添加新的参数 |
hydra.run.dir | 指定 Hydra 运行时的输出目录 |
Hydra 让 配置管理更加灵活,尤其适用于 机器学习实验、超参数优化和大规模模型训练 🚀