在Kedro Notebook中能否临时覆盖parameters.yaml中的参数?
在Kedro Notebook中动态覆盖参数的方法
当然可以在Kedro Notebook里动态覆盖parameters.yaml的参数——你遇到的问题是因为直接修改context.params不会自动同步到已经初始化的流水线和节点上,毕竟Kedro在启动时就已经把参数绑定到各个组件了。下面给你两种靠谱的方法,都能在Notebook生命周期内生效,完全不用碰原yaml文件:
方法一:修改参数后重新构建流水线
这种方法适合需要完全自定义上下文和Catalog的场景,步骤清晰可控:
- 首先加载你的Kedro项目和会话:
from kedro.framework.startup import bootstrap_project from kedro.framework.session import KedroSession from pathlib import Path # 指向你的项目根目录(如果Notebook在项目里,用Path.cwd()就行) project_path = Path.cwd() bootstrap_project(project_path) # 创建会话并加载上下文 with KedroSession.create(project_path=project_path) as session: context = session.load_context()
- 复制并修改参数(别直接改原
context.params,避免污染上下文):
custom_params = context.params.copy() custom_params["test_param"] = 2 # 替换成你的自定义参数值
- 用新参数重新创建Catalog和流水线:
from kedro.framework.project import _get_catalog, _get_pipeline from kedro.runner import SequentialRunner # 基于自定义参数生成新的Catalog catalog = _get_catalog( context.project_path, context.config_loader, custom_params, context.hooks ) # 基于自定义参数生成新的流水线 pipeline = _get_pipeline(context.package_name, custom_params) # 运行修改后的流水线 runner = SequentialRunner() runner.run(pipeline, catalog)
方法二:直接用session.run()覆盖参数(更简洁)
Kedro的session.run()方法本身就支持params参数,这是最直接的方式,不需要重建流水线:
在加载会话后,直接调用run方法并传入要覆盖的参数:
from kedro.framework.startup import bootstrap_project from kedro.framework.session import KedroSession from pathlib import Path project_path = Path.cwd() bootstrap_project(project_path) with KedroSession.create(project_path=project_path) as session: # 直接运行默认流水线,覆盖指定参数 session.run( pipeline_name="__default__", params={"test_param": 2} )
如果你的参数是嵌套结构,也可以精准修改:
session.run( pipeline_name="__default__", params={"data_processing": {"batch_size": 64, "train_ratio": 0.8}} )
注意事项
- 两种方法都只会在当前Notebook会话中生效,不会修改
parameters.yaml文件,完全符合你的需求; - 所有依赖该参数的节点都会使用新值,不用担心局部生效的问题;
- 如果你的流水线有多个子流水线,可以通过
pipeline_name指定要运行的目标流水线。
内容的提问来源于stack exchange,提问作者DHollett
相关产品推荐
相关产品推荐

