如何在Python中的Kubeflow容器化组件之间传递数据或文件

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然后可以根据路径读取数据集。