参数

Kedro中的项目参数定义在conf文件夹内,文件名以parameters开头的文件中,或位于名称以parameters开头的文件夹内。 默认情况下,在新创建的Kedro项目中,参数定义在项目conf/base目录下的parameters.yml文件中。该文件包含键值对字典,其中每个键是参数名称,每个值是对应的参数值。 这些参数可以作为节点的输入,并在运行管道时使用。通过使用参数,您可以使Kedro管道更加灵活且易于配置,因为您可以通过修改parameters.yml文件来更改节点的行为。

如何使用参数

如果您有一组决定模型超参数的参数,可以在单一位置(例如conf/base/parameters.yml)中定义它们。这样,您可以将所有修改集中在统一位置,避免在代码的多个部分进行更改。

step_size: 1
learning_rate: 0.01

现在你可以在node节点定义中使用params:前缀来引用这些参数:

def increase_volume(volume, step):
    return volume + step


# in pipeline definition
node(
    func=increase_volume,
    inputs=["input_volume", "params:step_size"],
    outputs="output_volume",
)

您还可以将参数分组为嵌套结构,并使用上述相同方法,按顶级键加载它们:

step_size: 1
model_params:
    learning_rate: 0.01
    test_data_ratio: 0.2
    number_of_train_iterations: 10000
def train_model(data, model):
    lr = model["learning_rate"]
    test_data_ratio = model["test_data_ratio"]
    iterations = model["number_of_train_iterations"]
    ...


# in pipeline definition
node(
    func=train_model,
    inputs=["input_data", "params:model_params"],
    outputs="output_data",
)

或者,你也可以将parameters传递给节点输入,从而在节点函数内部访问完整的参数值集合。

def increase_volume(volume, params):
    step = params["step_size"]
    return volume + step


# in pipeline definition
node(
    func=increase_volume, inputs=["input_volume", "parameters"], outputs="output_volume"
)

在这两种情况下,底层参数都是通过DataCatalog中的add_feed_dict()方法添加到数据目录中的,这些参数以MemoryDataset的形式存在。该方法也是KedroContext类在实例化目录时所使用的。

注意

您可以根据用例使用add_feed_dict()将任何其他条目注入到您的DataCatalog中。

如何在代码中加载参数

项目配置参数可以通过配置加载器类加载,默认情况下是OmegaConfigLoader

from kedro.config import OmegaConfigLoader
from kedro.framework.project import settings

conf_path = str(project_path / settings.CONF_SOURCE)
conf_loader = OmegaConfigLoader(conf_source=conf_path)
parameters = conf_loader["parameters"]

这会从conf目录下的任何子目录中加载配置文件,这些文件的文件名需以parameters开头,或者位于名称以parameters开头的文件夹内。

在上面的示例中,如果没有任何配置文件匹配给定的键,调用conf_loader[key]将会抛出MissingConfigException错误。但如果这对您的应用程序来说是一个有效的工作流程,您可以按以下方式处理:

from kedro.config import OmegaConfigLoader, MissingConfigException
from kedro.framework.project import settings

conf_path = str(project_path / settings.CONF_SOURCE)
conf_loader = OmegaConfigLoader(conf_source=conf_path)

try:
    parameters = conf_loader["parameters"]
except MissingConfigException:
    parameters = {}

注意

kedro.framework.context.KedroContext 类采用上述方法来加载项目参数。

参数可以单独使用,也可以作为函数输入

如何在运行时指定参数

Kedro还允许您为kedro run CLI命令指定运行时参数。使用--params命令行选项并指定以逗号分隔的键值对列表,这些键值对将被添加到KedroContext参数中,并可供管道节点使用。

每个键值对在第一个等号处进行分割。以下示例是一个有效的命令:

kedro run --params=param_key1=value1,param_key2=2.0

在命令行界面(CLI)中提供的值具有最高优先级,会覆盖配置文件中指定的参数。默认情况下,运行时参数会以破坏性方式合并,这意味着除了运行时参数中给定的配置外,该键的所有其他配置都将被丢弃。 本节介绍如何更改合并策略

例如,如果您在baselocal环境中设置了以下参数:

# base/parameters.yml
model_options:
  model_params:
    learning_date: "2023-11-01"
    training_date: "2023-11-01"
    data_ratio: 14

data_options:
  step_size: 123123
# local/parameters.yml
features:
    rate: 123

并且在运行时提供以下参数:

kedro run --params="model_options.model_params.training_date=2011-11-11"

最终合并的结果将是:

model_options:
  model_params:
    training_date: "2011-11-11"

data_options:
  step_size: 123123

features:
    rate: 123
  • 参数键始终被视为字符串。

  • 如果相应的转换成功,参数值将被转换为浮点数或整数;否则,它们也将被视为字符串。

如果任何额外的参数键或值包含空格,请将整个选项内容用引号括起来:

kedro run --params="key1=value with spaces,key2=value"

由于键值对是在第一个等号处分割的,因此值可以包含等号,但键不能。

不仅覆盖参数还包括其他配置项,比如目录条目或文件路径,或者预先指定某些参数必须在运行时设置,可以使用$runtime_params配合OmegaConfigLoader。该功能在Kedro0.18.14版本引入,允许通过--params命令行选项动态覆盖多种配置类型。这在切换数据源或微调运行时设置等场景中特别有用。了解更多关于$runtime_params的信息。