如何在Kubeflow Pipelines中拼接OutputPathPlaceholder与字符串
方案1:在组件函数内部直接拼接(推荐,适合用装饰器定义组件的场景)
你在组件函数中拿到Output对象的path属性后,直接用os.path.join拼接子路径即可,示例代码如下:
import kfp from kfp.dsl import component, Output, Model import os @component( base_image="python:3.9", output_component_file="train_component.yaml" ) def train_task( drt_model: Output[Model], # 其他输入参数略 ): # 直接拼接子目录路径 model_save_dir = os.path.join(drt_model.path, "model") checkpoint_save_dir = os.path.join(drt_model.path, "checkpoints") tensorboard_log_dir = os.path.join(drt_model.path, "tensorboard") # 手动创建子目录(基础路径KFP会自动创建,子目录需要自行创建) os.makedirs(model_save_dir, exist_ok=True) os.makedirs(checkpoint_save_dir, exist_ok=True) os.makedirs(tensorboard_log_dir, exist_ok=True) # 后续业务逻辑,将对应工件写入对应目录即可
方案2:在组件命令定义阶段拼接
如果你是通过命令数组的方式定义组件执行逻辑,直接将OutputPathPlaceholder和子路径字符串做普通字符串拼接即可,KFP编译时会自动识别占位符,运行时会正确生成拼接后的完整路径,示例如下:
from kfp.dsl import OutputSpec, OutputPathPlaceholder from kfp.components import create_component_from_func # 定义组件输出 outputs = [OutputSpec(name='drt_model', type='Model')] # 组件命令定义,直接拼接占位符和子路径 train_component = kfp.components.create_component_from_func( func=your_train_func, base_image="your-custom-image:tag", outputs=outputs, command=[ "python", "train.py", "--model-dir", f"{OutputPathPlaceholder('drt_model')}/model", "--checkpoint-dir", f"{OutputPathPlaceholder('drt_model')}/checkpoints", "--tensorboard-dir", f"{OutputPathPlaceholder('drt_model')}/tensorboard", ] )
注意事项
- 无需为子路径单独定义Output参数,所有子目录内容都会归属到你定义的
drt_model模型工件下,下游组件需要使用对应子路径时,同样直接拼接train_task.outputs['drt_model']和子路径字符串传入即可 - 如果是写入GCS路径,部分框架支持直接写GCS路径不需要提前创建目录,本地路径则需要手动调用
os.makedirs创建子目录
内容的提问来源于stack exchange,提问作者Dr. Fabien Tarrade
相关产品推荐
相关产品推荐

