如何配置指标收集器

Katib 指标收集器概述及其配置方法

本指南描述了 Katib 指标收集器的工作原理。

前提条件

在使用 Python SDK 运行超参数调优 Katib Experiment 之前,确保存在 namespace 标签 katib.kubeflow.org/metrics-collector-injection: enabled。此标签启用拉取式指标收集器的 sidecar 容器注入,以便在 Experiment 期间收集指标。

您可以通过添加以下标签 katib.kubeflow.org/metrics-collector-injection: enabled 来配置 namespace,如示例代码所示

apiVersion: v1
kind: Namespace
metadata:
  name: <your-namespace>
  labels:
    katib.kubeflow.org/metrics-collector-injection: enabled

或者您可以使用以下命令将标签添加到现有 namespace

kubectl label namespace <your-namespace> katib.kubeflow.org/metrics-collector-injection=enabled

概述

有两种收集指标的方法

  1. 拉取式:使用一个 sidecar 容器收集指标。Sidecar 是一个支持 Kubernetes Pod 中主容器的辅助容器。

  2. 推送式:用户在训练脚本中直接将指标推送到 Katib DB。

在 Experiment YAML 配置文件中的 metricsCollectorSpec 部分,您可以定义 Katib 应如何从每个 Trial 收集指标,例如 accuracy 和 loss 指标。

拉取式指标收集器

您的训练代码可以将指标记录到 StdOut 或任意输出文件中。

为 Experiment 定义拉取式指标收集器

  1. .collector.kind 字段中指定收集器类型。Katib 的指标收集器支持以下收集器类型

    • StdOut:Katib 从操作系统的默认输出位置(标准输出)收集指标。这是默认的指标收集器。

    • File:Katib 从任意文件中收集指标,您可以在 .source.fileSystemPath.path 字段中指定该文件。训练容器应以 TEXTJSON 格式将指标记录到此文件中。如果您选择 JSON 格式,指标必须按 epochstep 分行,如下所示,并且时间戳的键必须是 timestamp

      {"epoch": 0, "foo": "bar", "fizz": "buzz", "timestamp": "2021-12-02T14:27:51"}
      {"epoch": 1, "foo": "bar", "fizz": "buzz", "timestamp": "2021-12-02T14:27:52"}
      {"epoch": 2, "foo": "bar", "fizz": "buzz", "timestamp": "2021-12-02T14:27:53"}
      {"epoch": 3, "foo": "bar", "fizz": "buzz", "timestamp": "2021-12-02T14:27:54"}
      

      查看文件指标收集器示例,了解 TEXTJSON 格式。此外,默认文件路径是 /var/log/katib/metrics.log,默认文件格式是 TEXT

    • TensorFlowEvent:Katib 从包含 tf.Event 的目录路径中收集指标。这些通常由 tensorflow.summary 写入。从 Katib 0.18 开始,torch.utils.tensorboardtensorboardX 也可用于写入指标。您应该在 .source.fileSystemPath.path 字段中指定路径。查看 TFJob 示例。默认目录路径是 /var/log/katib/tfevent/

    • Custom:如果您需要使用自定义方式收集指标,请指定此值。您必须在 .collector.customCollector 字段中定义您的自定义指标收集器容器。查看 自定义指标收集器示例

  2. 在您的训练容器中编写代码,以 .source.filter.metricsFormat 字段指定的格式打印或保存指标到文件。默认的指标格式值为

    ([\w|-]+)\s*=\s*([+-]?\d*(\.\d+)?([Ee][+-]?\d+)?)
    

    每个元素都是一个具有两个子表达式的正则表达式。第一个匹配的表达式作为指标名称。第二个匹配的表达式作为指标值。

    例如,使用默认指标格式和 StdOut 指标收集器,如果您的目标指标名称是 loss,附加指标是 recallprecision,您的训练代码应打印以下输出

    epoch 1:
    loss=3.0e-02
    recall=0.5
    precision=.4
    
    epoch 2:
    loss=1.3e-02
    recall=0.55
    precision=.5
    

推送式指标收集器

您的训练代码需要在 Python SDK 中调用 report_metrics() 函数来记录指标。report_metrics() 函数通过解析 metrics 字段中的指标到 gRPC 请求,自动为用户添加当前时间戳,并将请求发送到 Katib DB Manager 来工作。

但在此之前,kubeflow-katib 包应安装在您的训练容器中。

为您的 Experiment 定义推送式指标收集器,您有两种选择

  • YAML 文件

    1. .collector.kind 字段中指定收集器类型 Push

    2. 在您的训练容器中编写代码,调用 report_metrics() 来报告指标。

  • tune 函数

    使用 tune 函数并指定 metrics_collector_config 字段。您可以参考以下示例

    import kubeflow.katib as katib
    
    def objective(parameters):
      import time
      import kubeflow.katib as katib
      time.sleep(5)
      result = 4 * int(parameters["a"])
      # Push metrics to Katib DB.
      katib.report_metrics({"result": result})
    
    katib.KatibClient(namespace="kubeflow").tune(
      name="push-metrics-exp",
      objective=objective,
      parameters= {"a": katib.search.int(min=10, max=20)}
      objective_metric_name="result",
      max_trial_count=2,
      metrics_collector_config={"kind": "Push"},
      # When SDK is released, replace it with packages_to_install=["kubeflow-katib==0.18.0"].
      # Currently, the training container should have `git` package to install this SDK.
      packages_to_install=["git+https://github.com/kubeflow/katib.git@master#subdirectory=sdk/python/v1beta1"],
    )
    

反馈

此页面是否有帮助?