Где выполнить сохранение выходного узла в Kedro? - PullRequest
3 голосов
/ 18 октября 2019

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

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

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

2 голосов
/ 21 октября 2019

Входные данные узла автоматически загружаются 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, 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 узел (и его зависимости) хотя бы один раз

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

...