Где выполнить сохранение вывода узла в Кедро?

В Kedro мы можем конвейерно разные узлы и частично запускать некоторые узлы. Когда мы частично запускаем некоторые узлы, нам нужно где-то сохранить некоторые входные данные от узлов, чтобы при запуске другого узла он мог получить доступ к данным, сгенерированным предыдущим узлом. Однако в каком файле мы записываем для этого код - pipeline.py, run.py или nodes.py?

Например, я пытаюсь сохранить путь к каталогу непосредственно в DataCatalog под именем переменной model_path.

Фрагмент из 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 ответ

Решение

Входные данные узла автоматически загружаются Kedro из DataCatalogперед передачей в функцию узла. Следовательно, выходные данные узла сохраняются в DataCatalog после того, как узел успешно производит некоторые данные. Конфигурация DataCatalog по умолчанию берется изconf/base/catalog.yml.

В вашем примере model_path производится Create Dataset, Train and Save Model узел, а затем потребляется Validate Model. Если требуемое определение набора данных не найдено вconf/base/catalog.yml, Kedro попытается сохранить этот набор данных в памяти, используя MemoryDataSet. Это будет работать, если вы запустите конвейер, содержащий обаCreate Dataset... а также Validate Modelузлов (при отсутствии других проблем). Однако, когда вы пытаетесь запуститьValidate Model только узел, Кедро пытается прочитать model_path набор данных из памяти, которого там нет.

Итак, TL; DR:

Чтобы смягчить это, вам необходимо:

а) сохраняться model_path добавив что-то вроде следующего в свой conf/base/catalog.yml:

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

б) беги Create Dataset, Train and Save Model узел (и его зависимости) хотя бы один раз

После выполнения а) и б) вы сможете начать бег. Validate Model раздельно.

Другие вопросы по тегам