如何在 kubeflow 中跨多个组件使用 OutputPath
How to use OutputPath across multiple components in kubeflow
我们正在使用 @dsl.containerop
.
在 kubeflow 管道中定义多个组件
需求中涉及两个步骤。
首先我们需要运行一个下载任务,它需要一个输入url
并下载容器内的文件。
我们需要使用第一步生成的文件和运行一个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。
建议:
- 按照 https://www.kubeflow.org/docs/components/pipelines/reference/component-spec/ 构建您的可重用组件 yaml。
- 如果你更喜欢一次性组件内联组件yaml,你可以通过
kfp.components.load_component_from_text
方法加载它参考this example pipeline.
以下是编写下载器组件的方法:
(将其保存为 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')
我们正在使用 @dsl.containerop
.
需求中涉及两个步骤。
首先我们需要运行一个下载任务,它需要一个输入
url
并下载容器内的文件。我们需要使用第一步生成的文件和运行一个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。
建议:
- 按照 https://www.kubeflow.org/docs/components/pipelines/reference/component-spec/ 构建您的可重用组件 yaml。
- 如果你更喜欢一次性组件内联组件yaml,你可以通过
kfp.components.load_component_from_text
方法加载它参考this example pipeline.
以下是编写下载器组件的方法:
(将其保存为 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')