Configure hyperparameters from the CLI (Advanced)

Customize arguments by subcommand

To customize arguments by subcommand, pass the config before the subcommand:

$ python [before] [subcommand] [after]
$ python  ...         fit       ...

For example, here we set the Trainer argument [max_steps = 100] for the full training routine and [max_steps = 10] for testing:

# config.yaml
        max_steps: 100
        max_epochs: 10

now you can toggle this behavior by subcommand:

# full routine with max_steps = 100
$ python --config config.yaml fit

# test only with max_epochs = 10
$ python --config config.yaml test

Run from cloud yaml configs

For certain enterprise workloads, Lightning CLI supports running from hosted configs:

$ python [subcommand] --config s3://bucket/config.yaml

For more options, refer to Remote filesystems.

Use a config via environment variables

For certain CI/CD systems, it’s useful to pass in raw yaml config as environment variables:

$ python fit --trainer "$TRAINER_CONFIG" --model "$MODEL_CONFIG" [...]

Run from environment variables directly

The Lightning CLI can convert every possible CLI flag into an environment variable. To enable this, add to parser_kwargs the default_env argument:

cli = LightningCLI(..., parser_kwargs={"default_env": True})

now use the --help CLI flag with any subcommand:

$ python fit --help

which will show you ALL possible environment variables that can be set:

usage: [options] fit [-h] [-c CONFIG]

optional arguments:
ARG:   --model.out_dim OUT_DIM
                        (type: int, default: 10)
ARG:   --model.learning_rate LEARNING_RATE
                        (type: float, default: 0.02)

now you can customize the behavior via environment variables:

# set the options via env vars
$ export PL_FIT__MODEL__OUT_DIM=5

$ python fit

Set default config files

To set a path to a config file of defaults, use the default_config_files argument:

cli = LightningCLI(MyModel, MyDataModule, parser_kwargs={"default_config_files": ["my_cli_defaults.yaml"]})

or if you want defaults per subcommand:

cli = LightningCLI(MyModel, MyDataModule, parser_kwargs={"fit": {"default_config_files": ["my_fit_defaults.yaml"]}})

Enable variable interpolation

In certain cases where multiple settings need to share a value, consider using variable interpolation. For instance:

  encoder_layers: 12
  - ${model.encoder_layers}
  - 4

To enable variable interpolation, first install omegaconf:

pip install omegaconf

Then set omegaconf when instantiating the LightningCLI class:

cli = LightningCLI(MyModel, parser_kwargs={"parser_mode": "omegaconf"})

After this, the CLI will automatically perform interpolation in yaml files:

python --model.encoder_layers=12

For more details about the interpolation support and its limitations, have a look at the jsonargparse and the omegaconf documentations.


There are many use cases in which variable interpolation is not the correct approach. When a parameter must always be derived from other settings, it shouldn’t be up to the CLI user to do this in a config file. For example, if the data and model both require batch_size and must be the same value, then Argument linking should be used instead of interpolation.