如何配置指标收集器
本指南描述了 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
概述
有两种收集指标的方法
拉取式:使用一个 sidecar 容器收集指标。Sidecar 是一个支持 Kubernetes Pod 中主容器的辅助容器。
推送式:用户在训练脚本中直接将指标推送到 Katib DB。
在 Experiment YAML 配置文件中的 metricsCollectorSpec
部分,您可以定义 Katib 应如何从每个 Trial 收集指标,例如 accuracy 和 loss 指标。
拉取式指标收集器
您的训练代码可以将指标记录到 StdOut
或任意输出文件中。
为 Experiment 定义拉取式指标收集器
在
.collector.kind
字段中指定收集器类型。Katib 的指标收集器支持以下收集器类型StdOut
:Katib 从操作系统的默认输出位置(标准输出)收集指标。这是默认的指标收集器。File
:Katib 从任意文件中收集指标,您可以在.source.fileSystemPath.path
字段中指定该文件。训练容器应以TEXT
或JSON
格式将指标记录到此文件中。如果您选择JSON
格式,指标必须按epoch
或step
分行,如下所示,并且时间戳的键必须是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"}
查看文件指标收集器示例,了解
TEXT
和JSON
格式。此外,默认文件路径是/var/log/katib/metrics.log
,默认文件格式是TEXT
。TensorFlowEvent
:Katib 从包含 tf.Event 的目录路径中收集指标。这些通常由 tensorflow.summary 写入。从 Katib 0.18 开始,torch.utils.tensorboard 或 tensorboardX 也可用于写入指标。您应该在.source.fileSystemPath.path
字段中指定路径。查看 TFJob 示例。默认目录路径是/var/log/katib/tfevent/
。Custom
:如果您需要使用自定义方式收集指标,请指定此值。您必须在.collector.customCollector
字段中定义您的自定义指标收集器容器。查看 自定义指标收集器示例。
在您的训练容器中编写代码,以
.source.filter.metricsFormat
字段指定的格式打印或保存指标到文件。默认的指标格式值为([\w|-]+)\s*=\s*([+-]?\d*(\.\d+)?([Ee][+-]?\d+)?)
每个元素都是一个具有两个子表达式的正则表达式。第一个匹配的表达式作为指标名称。第二个匹配的表达式作为指标值。
例如,使用默认指标格式和
StdOut
指标收集器,如果您的目标指标名称是loss
,附加指标是recall
和precision
,您的训练代码应打印以下输出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 文件
在
.collector.kind
字段中指定收集器类型Push
。在您的训练容器中编写代码,调用
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"], )