I am using nested parameters in my parameters.yml and would like to override these using runtime parameters for the kedro run CLI command:
train:
batch_size: 32
train_ratio: 0.9
epochs: 5
The following doesn't seem to work:
kedro run --params train.batch_size:64,train.epochs:50
the values for epoch and batch_size are those from the parameters.yml. How can I override these parameters with the cli command?
The additional parameters get passed into the KedroContext object via load_context(Path.cwd(), env=env, extra_params=params) in kedro_cli.py. Here you can see that there's a callback (protected) function called _split_params which splits the key-value pairs on :.
This _split_params first splits string on commas (to get multiple params) and then on colons. Actually adding a print/logging statement of what gets passed into extra_params will show you something like:
{'train.batch_size': 64, 'train.epochs': 50}
I think you have a couple options:
_split_params in kedro_cli.py to create a nested dictionary on . characters which gets passed into the func mentioned above. I think you can reuse a lot of the existing logic.NB: This was tested on kedro==0.16.2.
NB2: The way kedro splits out nested params is using the _get_feed_dict and _add_param_to_feed_dict functions in context.py. Specifically, _add_param_to_feed_dict is a recursive function that unpacks a dictionary and formats as "{}.{}".format(key, value). IMO you can use the logic from here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With