1

我正在使用 KUBEFLOW 管道来训练带有 TF 的 KERAS 模型,并且我从一个非常简单的管道开始。

模型训练良好,管道正常工作,但我无法正确使用 TENSOBOARD 的输出查看器。从文档中阅读,似乎只需在训练容器的根路径中添加一个正确的 json 文件/mlpipeline-ui-metadata.json(没看错)。

这是我的配置方式:

mlpipeline-ui-metadata.json (直接从 DOCKERFILE 添加)

{
    "version": 1,
    "outputs": [
    {
        "type": "tensorboard",
        "source": "/tf-logs"  #Just a placeholder at the moment
    }
    ]
}

管道

import kfp
from kfp import dsl

from kubernetes.client.models import V1EnvVar

def train_op(epochs,batch_size,dropout,first_layer_size,second_layer_size):
    dsl.ContainerOp(
        image='MY-IMAGE',
        name='my-train',
        container_kwargs={"image_pull_policy": "Always", 'env': [
            V1EnvVar('TRAIN_EPOCHS', epochs),
            V1EnvVar('TRAIN_BATCH_SIZE', batch_size),
            V1EnvVar('TRAIN_DROPOUT', dropout),
            V1EnvVar('TRAIN_FIRST_LAYER_SIZE', first_layer_size),
            V1EnvVar('TRAIN_SECOND_LAYER_SIZE', second_layer_size),
            ]},
        command=['sh', '-c', '/src/init_script.sh'],
    ).set_memory_request('2G').set_cpu_request('2')

@dsl.pipeline(
    name='My model pipeline',
    description='Pipeline for model training'
)
def my_model_pipeline(epochs,batch_size,dropout,first_layer_size,second_layer_size):

    train_task = train_op(epochs,batch_size,dropout,first_layer_size,second_layer_size)

if __name__ == '__main__':
    kfp.compiler.Compiler().compile(my_model_pipeline, 'my_model.zip')

我已经尝试访问正在运行的 POD ( kubectl exec ..) 并且我验证了该文件实际上是在正确的位置。

顺便说一句,我使用的是 KUBEFLOW v0.5

4

1 回答 1

1

TL;DR:该source部分应指向共享存储上的位置,而不是 pod 的本地文件系统路径

中的source部分mlpipeline-ui-metadata.json应该指向 pipelines-ui pod 稍后可以引用它的位置,即它应该在共享存储、s3(如果在 AWS 上)、已安装的 Kubernetes 卷(如果在本地)上。

Kubeflow 的工作方式是,在运行结束时,它只是mlpipeline-ui-metadata.json压缩并将其存储在 minio 存储中。当您单击 Artifacts 部分时,UIsource会在压缩的 json 中查找此部分并尝试读取 tf 事件文件。如果 tf 事件文件没有从 pod 移动到共享存储,它们将不会被读取,因为它仅在临时 pods 文件系统上。

于 2019-10-06T16:49:41.667 回答