在Kedro中哪里执行保存节点输出的操作?

时间:2019-10-18 04:03:49

标签: python tensorflow kedro

在Kedro中,我们可以流水线化不同的节点并部分运行某些节点。当部分运行某些节点时,我们需要将某些节点的输入保存在某个位置,以便在运行另一个节点时,它可以访问前一个节点已生成的数据。但是,我们在哪个文件中编写此代码-pipeline.py,run.py或nodes.py?

例如,我正在尝试直接将目录路径保存到变量名“ model_path”下的DataCatalog。

pipeline.py的片段:

    # A mapping from a pipeline name to a ``Pipeline`` object.
def create_pipelines(**kwargs) -> Dict[str, Pipeline]:
io = DataCatalog(dict(
    model_path=MemoryDataSet()
))

io.save('model_path', "data/06_models/model_test")
print('****', io.exists('model_path'))

pipeline = Pipeline([
    node(
        split_files,
        ["data_csv", "parameters"],
        ["train_filenames", "val_filenames", "train_labels", "val_labels"],
        name="splitting filenames"
    ),
    # node(
    #     create_and_train,
    #     ["train_filenames", "val_filenames", "train_labels", "val_labels", "parameters"],
    #     "model_path",
    #     name="Create Dataset, Train and Save Model"
    # ),
    node(
        validate_model,
        ["val_filenames", "val_labels", "model_path"],
        None,
        name="Validate Model",
    )

]).decorate(decorators.log_time, decorators.mem_profile)

return {
    "__default__": pipeline
}

但是,当我运行Kedro时,出现以下错误:

ValueError: Pipeline input(s) {'model_path'} not found in the DataCatalog

1 个答案:

答案 0 :(得分:2)

节点输入由Kedro从DataCatalog自动加载,然后传递给节点功能。因此,在节点成功生成一些数据之后,节点输出将保存到DataCatalog中。默认情况下,DataCatalog配置取自conf/base/catalog.yml

在您的示例中,model_pathCreate Dataset, Train and Save Model节点产生,然后由Validate Model消耗。如果在conf/base/catalog.yml中找不到所需的数据集定义,则Kedro将尝试使用MemoryDataSet将此数据集存储在内存中。如果您运行同时包含Create Dataset...Validate Model节点的管道,这将起作用(假设没有其他问题出现)。但是,当您尝试单独运行Validate Model节点时,Kedro尝试从内存中读取model_path数据集,而该内存中不存在该数据集。

因此, TLDR

为减轻这种情况,您需要:

a)通过在您的model_path中添加以下内容来坚持conf/base/catalog.yml

model_path:
  type: TextLocalDataSet
  filepath: data/02_intermediate/model_path.txt

b)至少运行一次Create Dataset, Train and Save Model节点(及其依赖项)

完成a)和b)之后,您应该可以分别开始运行Validate Model