Где выполнить сохранение вывода узла в Кедро?
В 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
раздельно.