Str*_*ter 10 kubeflow kubeflow-pipelines
我正在探索 Kubeflow 作为部署和连接典型机器学习管道的各种组件的选项。我使用 docker 容器作为 Kubeflow 组件,到目前为止我无法成功使用ContainerOp.file_outputs对象在组件之间传递结果。
根据我对该功能的理解,创建并保存到声明为file_outputs组件之一的文件应该会导致它持续存在并可供以下组件读取。
这就是我尝试在管道 python 代码中声明这一点的方式:
import kfp.dsl as dsl
import kfp.gcp as gcp
@dsl.pipeline(name='kubeflow demo')
def pipeline(project_id='kubeflow-demo-254012'):
data_collector = dsl.ContainerOp(
name='data collector',
image='eu.gcr.io/kubeflow-demo-254012/data-collector',
arguments=[ "--project_id", project_id ],
file_outputs={ "output": '/output.txt' }
)
data_preprocessor = dsl.ContainerOp(
name='data preprocessor',
image='eu.gcr.io/kubeflow-demo-254012/data-preprocessor',
arguments=[ "--project_id", project_id ]
)
data_preprocessor.after(data_collector)
#TODO: add other components
if __name__ == '__main__':
import kfp.compiler as compiler
compiler.Compiler().compile(pipeline, __file__ + '.tar.gz')
Run Code Online (Sandbox Code Playgroud)
在组件的 python 代码中,data-collector.py我获取数据集,然后将其写入output.txt. 我可以从同一组件内的文件中读取内容,但不能在data-preprocessor.py我获得FileNotFoundError.
对于基于容器的 Kubeflow 组件,使用是否file_outputs无效,或者我是否在代码中错误地使用了它?如果在我的情况下这不是一个选项,是否可以在管道声明 python 代码中以编程方式创建 Kubernetes 卷并使用它们而不是file_outputs?
小智 8
在一个 Kubeflow 管道组件中创建的文件对于容器来说是本地的。要在后续步骤中引用它,您需要将其传递为:
data_preprocessor = dsl.ContainerOp(
name='data preprocessor',
image='eu.gcr.io/kubeflow-demo-254012/data-preprocessor',
arguments=["--fetched_dataset", data_collector.outputs['output'],
"--project_id", project_id,
]
Run Code Online (Sandbox Code Playgroud)
注意: data_collector.outputs['output']将包含文件的实际字符串内容/output.txt(而不是文件的路径)。如果您希望它包含文件的路径,则需要将数据集写入共享存储(例如 s3 或已安装的 PVC 卷),并将共享存储的路径/链接写入 /output.txt. data_preprocessor然后可以根据路径读取数据集。
| 归档时间: |
|
| 查看次数: |
11961 次 |
| 最近记录: |