如何按S3 URI对数据集和模型进行编目,但保留本地副本?



我正在尝试弄清楚如何在本地和 S3 上存储中间 Kedro 管道对象。特别是,假设我在 S3 上有一个数据集:

my_big_dataset.hdf5:
type: kedro.extras.datasets.pandas.HDFDataSet
filepath: "s3://my_bucket/data/04_feature/my_big_dataset.hdf5"

我想通过它们的 S3 URI 引用目录中的这些对象,以便我的团队可以使用它们。但是,我希望避免每次运行管道时重新下载数据集、模型权重等,除了 S3 副本之外,我还保留一个本地副本。如何使用凯德罗镜像文件?

这是一个很好的问题,KedroCachedDataSet在同一运行中缓存数据集,当在同一运行中多次使用/加载数据集时,它会处理在内存中缓存数据集。实际上,在运行过程中持续存在的东西并不相同,一般来说,Kedro 不会做太多持久的事情。

也就是说,在我的脑海中,我可以想到两个(大部分)复制或提供此功能的选项:

  1. 在同一配置环境中使用相同的catalog,但目录数据集的文件路径如下所示TemplatedConfigLoader
my_dataset:
filepath: ${base_data}/01_raw/blah.csv

并且,您将base_data设置为在"生产"模式下运行时和本地local_filepath/datas3://bucket/blah。您可以决定如何在重写的context方法中执行此操作(是使用local/globals.yml(请参阅上面的链接文档)还是环境变量或其他什么。

  1. 使用单独的环境,可能是local(这就是它的用途!),您可以在其中保留目录的单独副本,其中文件路径替换为本地文件路径。

否则,下一个最佳选择是编写一个类似于CachedDataSetPersistentCachedDataSet,该拦截包装数据集的加载/保存,并在首次加载时在确定性位置加载时创建本地副本,并在后续加载时查找该位置。

最新更新