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

Например, я пытаюсь сохранить путь к каталогу непосредственно в 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
4
Baenka 18 Окт 2019 в 07:03

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 в одиночку, Kedro пытается прочитать набор данных model_path из памяти, которой там нет.

Итак, TLDR :

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

А) сохраните 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 отдельно.

3
Dmitry Deryabin 21 Окт 2019 в 15:40