Using Typer and Hydra together Link to heading

What is Typer? Link to heading

Typer is a library for building CLI applications and is a wrapper on top the package click. Unlike click, there is no need to add decorators to the function to make the function arguments show up in help.

What is Hydra? Link to heading

Hydra is a python framework to create complex configurations in an elegant and composable manner.

Using Typer and Hyrda in the same program Link to heading

The way I normally structure my machine learning project is to have a cli program that has separate commands to run a training experiment, evaluate a dataset etc. And I use typer to create those commands. Each of those commands in turn will use a config file to get the parameters. And for configuration, my go to framework is hydra. Since both Typer and Hydra uses the input arguments from sys module, we need a workaround to use them together. A workaround would be a wrong word to use. What I really mean is default way of using hydra and typer involves decorating your command function. So in order to use hydra and typer together, instead of using the @hydra.main decorator, one should use the composable API’s of hyper. Below is a code snippet, that has typer command for training and evaluation and the configuration files for each of those are under the folder, conf/task/training.yaml and conf/task/evaluate.yaml.

##!/usr/bin/env python

import typer
import hydra
from omegaconf import OmegaConf, DictConfig

app = typer.Typer()

def get_config(task:str):
    hydra_init = hydra.initialize(version_base=None, config_path="conf")

    # Compose the config
    with hydra_init:
        # This is similar to what @hydra.main would do
        cfg = hydra.compose(config_name="config", overrides=[f"task={task}"])
        return cfg

@app.command()
def train():
    print(get_config("training"))

@app.command()
def evaluate():
    print(get_config("evaluate"))

if __name__ == "__main__":
    app()

I hope this is useful!