1

我有一个由 3 个容器化组件组成的管道。在最后一个组件中,我将我想要的指标写入一个名为 的文件/mlpipeline-metrics.json,就像这里解释的那样。这是我使用的 Python 代码。

metrics = {
    'metrics': [
        {
            'name': 'accuracy',
            'numberValue':  accuracy,
            'format': 'PERCENTAGE',
        },
        {
            'name': 'average-f1-score',
            'numberValue': average_f1_score,
            'format': 'PERCENTAGE'
        },
    ]
}

with open('/mlpipeline-metrics.json', 'w') as f:
    json.dump(metrics, f)

我还尝试使用以下代码编写文件,就像上面链接的示例一样。

with file_io.FileIO('/mlpipeline-metrics.json', 'w') as f:
    json.dump(metrics, f)

管道运行良好,没有任何错误。但它不会在前端 UI 中显示指标。

我认为这与以下代码块有关。

def metric_op(accuracy, f1_scores):
    return dsl.ContainerOp(
        name='visualize_metrics',
        image='gcr.io/mgcp-1190085-asml-lpd-dev/kfp/jonas/container_tests/image_metric_comp',
        arguments=[
            '--accuracy', accuracy,
            '--f1_scores', f1_scores,
        ]
    )

这是我用来ContainerOp从容器化组件创建的代码。请注意,我没有指定任何file_outputs. 在其他ContainerOp方面,我必须指定file_outputs能够将变量传递给管道中的下一步。我应该在这里做类似的事情来将它映射/mlpipeline-metrics.json到某个东西上,以便 kubeflow 管道检测到它吗?

我正在使用运行 Kubeflow Pipelines 0.2.5 和 Python 3.6.8 的托管 AI 平台管道部署。

任何帮助表示赞赏。

4

2 回答 2

2

因此,经过反复试验,我终于找到了解决方案。我很高兴地说我的直觉是正确的。它确实与file_outputs我没有指定的有关。为了能够导出您的指标,您必须进行file_outputs如下设置。

def metric_op(accuracy, f1_scores):
    return dsl.ContainerOp(
        name='visualize_metrics',
        image='gcr.io/mgcp-1190085-asml-lpd-dev/kfp/jonas/container_tests/image_metric_comp',
        arguments=[
            '--accuracy', accuracy,
            '--f1_scores', f1_scores,
        ],
        file_outputs={
            'mlpipeline-metrics': '/mlpipeline-metrics.json'
        }
    )
于 2020-03-18T15:01:33.620 回答
0

这是在编写基于 Python 函数的方法时显示指标的另一种方式:

# Define your components code as standalone python functions:======================
    def add(a: float, b: float) -> NamedTuple(
        'AddOutput',
        [
            ('sum', float),
            ('mlpipeline_metrics', 'Metrics')
        ]
    ):
        '''Calculates sum of two arguments'''
        sum = a+b

        metrics = {
            'add_metrics': [
                {
                    'name': 'sum',
                    'numberValue': float(sum),
                }
            ]
        }
        print("Add Result: ", sum) # this will print it online in the 'main-logs' of each task


        from collections import namedtuple
        addOutput = namedtuple(
            'AddOutput',
        ['sum', 'mlpipeline_metrics'])
        return addOutput(sum, metrics)  # the metrics will be uploaded to the cloud

注意:我在这里使用 basci 函数。我没有使用你的功能。

于 2021-01-12T09:51:35.973 回答