我正在使用KUBEFLOW管道用TF训练KERAS模型,我从一个非常简单的开始。
模型训练正常,管道工作正常,但我无法正确使用TENSORBOARD的输出查看器。从留档读取似乎只需在训练容器的根路径中添加一个适当的json文件(/mlpieline-用户界面-metadata. json
)就足够了,但即使我这样做,我的实验运行的工件部分也不会出现任何内容(而KERAS日志可以正确查看)。
这是我如何配置它:
MLPipieline-用户界面-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
太长别读:source
部分应该指向共享存储上的位置,而不是pod的本地文件系统路径
mlpieline-用户界面-metadata. json中的source
部分应该指向Pipieline-用户界面pod稍后可以引用它的位置,即它应该在共享存储s3(如果在AWS)上,安装库伯内特斯卷(如果在本地)。
Kubeflow的工作方式是,在运行结束时,它只是压缩mlpieline-用户界面-metadata. json
并将其存储在一个小型存储中。当您单击神器部分时,UI会在压缩的json中查找这个source
部分并尝试读取tf事件文件。如果tf事件文件没有从pod移动到共享存储,它们将不会被读取,因为它单独在临时pods文件系统上。