如何在 kubeflow 中跨多个组件使用 OutputPath

How to use OutputPath across multiple components in kubeflow

我们正在使用 @dsl.containerop.

在 kubeflow 管道中定义多个组件

需求中涉及两个步骤。

  1. 首先我们需要运行一个下载任务,它需要一个输入url并下载容器内的文件。

  2. 我们需要使用第一步生成的文件和运行一个python程序——这将在几秒钟内完成containerop。

示例代码如下

@dsl.component
    def download(url: str, output_file: OutputPath(str)):
        return dsl.ContainerOp(
            name='Download',
            image='busybox:latest',
            command=["sh", "-c"],
            arguments=["wget %s " % url, output_file)],
        )

上面提到的代码将使用

调用
download_task = download(url=<URL>")

根据组件规范 https://www.kubeflow.org/docs/components/pipelines/reference/component-spec/ - 无需提及输出路径。

https://github.com/kubeflow/pipelines/blob/d106a6533bf4e1cbda4364560bc7526cb67d4eb2/samples/tutorials/Data%20passing%20in%20python%20components/Data%20passing%20in%20python%20components%20-%20Files.py#L69 - @func_to_container_op - 我们可以看到一种使用 OutputPath 类型获取输出的方法。

dsl.containerop 中有什么方法可以做到这一点吗?我们不想使用 file_outputs.

硬编码输出路径

您不能在 ContainerOp 中执行此操作,这是 ContainerOp 已被弃用的原因之一,请参阅 https://github.com/kubeflow/pipelines/pull/4166

建议:

  1. 按照 https://www.kubeflow.org/docs/components/pipelines/reference/component-spec/ 构建您的可重用组件 yaml。
  2. 如果你更喜欢一次性组件内联组件yaml,你可以通过kfp.components.load_component_from_text方法加载它参考this example pipeline.

shell and Python请查看以下两个教程。

以下是编写下载器组件的方法: (将其保存为 component.yaml)然后执行 download_op = load_component_from_file('component.yaml')

name: Download data
inputs:
- {name: Url, type: URI}
options given to the curl bprogram. See https://curl.haxx.se/docs/manpage.html'}
outputs:
- {name: Data}
implementation:
  container:
    image: curlimages/curl
    command:
    - sh
    - -exc
    - |
      url="[=10=]"
      output_path=""
      mkdir -p "$(dirname "$output_path")"
      curl --get "$url" --output "$output_path"
    - inputValue: Url
    - outputPath: Data

还有一个使用 curl 下载数据然后在该数据上进行训练的管道示例:XGBoost pipeline

P.S。已经存在一个从网络下载数据的组件: download_op = load_component_from_url('https://raw.githubusercontent.com/kubeflow/pipelines/master/components/web/Download/component.yaml')