缓存
旧版本
本页介绍的是 Kubeflow Pipelines V1,请参阅 V2 文档 获取最新信息。
注意,虽然 V2 后端能够运行由 V1 SDK 提交的 pipelines,但我们强烈建议迁移到 V2 SDK。作为参考,V1 SDK 的最终版本是 kfp==1.8.22
,其参考文档可在此处获取。
开始之前
本指南介绍了 Kubeflow Pipelines 步骤缓存的基本概念以及如何使用它。本指南假设您已经安装了 Kubeflow Pipelines,或者希望使用Kubeflow Pipelines 部署指南中的选项来部署 Kubeflow Pipelines。
什么是步骤缓存?
Kubeflow Pipelines 缓存提供了步骤级别的输出缓存。通过 KFP 后端和 UI 提交的所有 pipelines 默认启用缓存。例外情况是使用 TFX SDK 编写的 pipelines,TFX SDK 有自己的缓存机制。缓存键的计算基于组件(基础镜像、命令行、代码)、传递给组件的参数(值或 artifacts)以及任何附加自定义项。如果组件与某个先前执行中的完全相同,且参数也完全相同,则可以跳过该任务并使用旧步骤的输出。缓存复用行为可以控制,pipeline 作者可以指定用于复用的缓存数据的最大陈旧度。启用缓存后,系统可以跳过已经执行过的步骤,从而节省时间和金钱。
禁用/启用缓存
从 Kubeflow Pipelines 0.4 版本后,缓存默认启用。以下是关于禁用和启用缓存服务的说明。
配置对 Kubeflow 集群的访问
使用以下说明配置 kubectl
以访问您的 Kubeflow 集群。
要检查是否安装了
kubectl
,请运行以下命令which kubectl
响应应类似于此
/usr/bin/kubectl
如果您未安装
kubectl
,请按照安装和设置 kubectl 指南中的说明进行操作。按照配置 Kubernetes 集群访问指南进行操作。
在 Kubeflow Pipelines 部署中禁用缓存
确保集群中存在
mutatingwebhookconfiguration
export NAMESPACE=<Namespace where KFP is installed> kubectl get mutatingwebhookconfiguration cache-webhook-${NAMESPACE}
更改
mutatingwebhookconfiguration
规则kubectl patch mutatingwebhookconfiguration cache-webhook-${NAMESPACE} --type='json' -p='[{"op":"replace", "path": "/webhooks/0/rules/0/operations/0", "value": "DELETE"}]'
启用缓存
确保集群中存在
mutatingwebhookconfiguration
export NAMESPACE=<Namespace where KFP is installed> kubectl get mutatingwebhookconfiguration cache-webhook-${NAMESPACE}
更改回
mutatingwebhookconfiguration
规则kubectl patch mutatingwebhookconfiguration cache-webhook-${NAMESPACE} --type='json' -p='[{"op":"replace", "path": "/webhooks/0/rules/0/operations/0", "value": "CREATE"}]'
管理缓存陈旧度
缓存默认启用,如果您使用相同的参数执行过相同的组件,则该组件的任何新执行都将被跳过,其输出将从缓存中获取。在某些场景下,某些组件的缓存输出数据可能会在一段时间后变得过于陈旧而无法使用。要控制用于复用的缓存数据的最大陈旧度,您可以设置步骤的 max_cache_staleness
参数。max_cache_staleness
使用 RFC3339 Duration 格式(例如,30 天 = “P30D”)。默认情况下,max_cache_staleness
设置为无穷大,因此任何旧的缓存数据都将被复用。
将步骤的 max_cache_staleness
设置为 30 天
def some_pipeline():
# task is a target step in a pipeline
task = some_op()
task.execution_options.caching_strategy.max_cache_staleness = "P30D"
理想情况下,组件代码应该是纯粹且确定性的,即对于相同的输入产生相同的输出。如果您的组件不是确定性的(例如,每次调用时返回不同的随机数),您可能需要通过将 max_cache_staleness
设置为 0 来禁用对此组件创建的任务的缓存。
def some_pipeline():
# task is a target step in a pipeline
task_never_use_cache = some_op()
task_never_use_cache.execution_options.caching_strategy.max_cache_staleness = "P0D"
一个更好的解决方案是使组件成为确定性的。如果组件使用了随机数生成,您可以将 RNG 种子作为组件输入暴露出来。如果组件获取了不断变化的数据,您可以添加一个时间戳或日期输入。