Introduction to Hydra-Core
Hydra-core is an innovative framework designed to empower your Python projects with flexible and efficient configurations. The library is highly praised for its ability to manage complex parameter configurations, enabling developers to write clean and maintainable code. Here, we dive deep into hydra-core functionalities, APIs, and provide useful examples to help you leverage its full potential.
Getting Started
To get started with Hydra, you need to install it:
pip install hydra-core --upgrade
Core APIs and Examples
Basic Initialization
You can initialize Hydra in your main function to handle configurations:
from omegaconf import DictConfig
import hydra
@hydra.main(config_path=None, config_name="config")
def my_app(cfg: DictConfig):
print(cfg.pretty())
if __name__ == "__main__":
my_app()
Default Configuration File
Create a configuration file named config.yaml
:
database:
host: localhost
port: 3306
Accessing Configuration
You can access configuration parameters like this:
@hydra.main(config_path=".", config_name="config")
def my_app(cfg: DictConfig):
print(f"Connecting to database {cfg.database.host}:{cfg.database.port}")
if __name__ == "__main__":
my_app()
Overriding Configuration
Override configuration from the command line:
python my_app.py database.port=1234
Composable Configurations
Use multiple configuration files with composition:
# structure of config directory
# config/
# config.yaml
# db/mysql.yaml
# config/config.yaml
defaults:
- db: mysql
# config/db/mysql.yaml
database:
driver: mysql
host: localhost
port: 3306
Configuration Groups
Manage configuration groups and override them as needed:
@hydra.main(config_path="config", config_name="config")
def my_app(cfg: DictConfig):
print(f"Database driver: {cfg.database.driver}")
if __name__ == "__main__":
my_app()
Using Structured Configs
Define structured configuration with classes:
from dataclasses import dataclass
from omegaconf import MISSING
import hydra
@dataclass
class DatabaseConfig:
driver: str = MISSING
host: str = MISSING
port: int = MISSING
@dataclass
class Config:
database: DatabaseConfig = DatabaseConfig()
@hydra.main(config_path=None, config_name="config")
def my_app(cfg: Config):
print(cfg.database)
if __name__ == "__main__":
my_app()
Integrating with Other Libraries
Hydra can be easily integrated with optuna for hyperparameter optimization:
import optuna
from hydra import initialize, compose
def objective(trial):
lr = trial.suggest_float("lr", 1e-4, 1e-1, log=True)
# Your model training with `lr`
with initialize(config_path="conf"):
cfg = compose(config_name="config")
study = optuna.create_study(direction="minimize")
study.optimize(objective, n_trials=100)
Example Application
Here is a more complete example that demonstrates different Hydra capabilities:
# config/config.yaml
defaults:
- db: mysql
database:
driver: mysql
host: localhost
port: 3306
server:
host: 127.0.0.1
port: 8080
# config/db/mysql.yaml
database:
driver: mysql
host: mysql.local
port: 3306
# Run Application
import hydra
from omegaconf import DictConfig
from flask import Flask
app = Flask(__name__)
@hydra.main(config_path="config", config_name="config")
def run(cfg: DictConfig):
app.run(host=cfg.server.host, port=cfg.server.port)
if __name__ == "__main__":
run()
Hydra-core simplifies the management of configuration complexities in your Python projects. With these insights and examples, you can make your applications more flexible, maintainable, and scalable.
Hash: b66371a4bd5cf200cc3b7f23556c6fcb4f9761f313136e260c5f19a53b634f69