评价此页

Metrics#

创建于:2021年5月4日 | 最后更新:2021年5月4日

Metrics API。

概述:

torchelastic 中的 metrics API 用于发布遥测指标。它被设计用于 torchelastic 的内部模块,以便为最终用户发布指标,目的是增加可见性并帮助调试。但是,您也可以在作业中使用相同的 API 来将指标发布到相同的 metrics sink

一个 metric 可以被看作是时间序列数据,并由字符串值元组 (metric_group, metric_name) 唯一标识。

torchelastic 不对 metric_group 是什么以及它与 metric_name 的关系做任何假设。完全由用户来使用这两个字段来唯一标识一个 metric。

注意

metric group torchelastic 被 torchelastic 保留用于其产生的平台级指标。例如,torchelastic 可能会将代理的 re-rendezvous 操作的延迟(以毫秒为单位)输出为 (torchelastic, agent.rendezvous.duration.ms)

使用 metric group 的一种明智方法是将它们映射到作业中的某个阶段或模块。您也可以对作业的某些高级属性进行编码,例如区域或阶段(dev vs prod)。

发布 Metrics:

使用 torchelastic 的 metrics API 类似于使用 python 的 logging 框架。在尝试添加 metric 数据之前,您必须先配置一个 metrics handler。

下面的示例测量了 calculate() 函数的延迟。

import time
import torch.distributed.elastic.metrics as metrics

# makes all metrics other than the one from "my_module" to go /dev/null
metrics.configure(metrics.NullMetricsHandler())
metrics.configure(metrics.ConsoleMetricsHandler(), "my_module")


def my_method():
    start = time.time()
    calculate()
    end = time.time()
    metrics.put_metric("calculate_latency", int(end - start), "my_module")

您也可以使用 torch.distributed.elastic.metrics.prof` 装饰器来方便且简洁地剖析函数

# -- in module examples.foobar --

import torch.distributed.elastic.metrics as metrics

metrics.configure(metrics.ConsoleMetricsHandler(), "foobar")
metrics.configure(metrics.ConsoleMetricsHandler(), "Bar")


@metrics.prof
def foo():
    pass


class Bar:
    @metrics.prof
    def baz():
        pass

@metrics.prof 将发布以下指标

<leaf_module or classname>.success - 1 if the function finished successfully
<leaf_module or classname>.failure - 1 if the function threw an exception
<leaf_module or classname>.duration.ms - function duration in milliseconds

配置 Metrics Handler:

torch.distributed.elastic.metrics.MetricHandler 负责将添加的 metric 值发送到特定的目标。Metric group 可以配置不同的 metric handler。

默认情况下,torchelastic 将所有指标发送到 /dev/null。通过添加以下配置指标,torchelasticmy_app metric group 将打印到控制台。

import torch.distributed.elastic.metrics as metrics

metrics.configure(metrics.ConsoleMetricHandler(), group="torchelastic")
metrics.configure(metrics.ConsoleMetricHandler(), group="my_app")

编写自定义 Metric Handler:

如果您希望您的指标被发送到自定义位置,请实现 torch.distributed.elastic.metrics.MetricHandler 接口,并配置您的作业使用您的自定义 metric handler。

下面是一个玩具示例,它将指标打印到 stdout

import torch.distributed.elastic.metrics as metrics


class StdoutMetricHandler(metrics.MetricHandler):
    def emit(self, metric_data):
        ts = metric_data.timestamp
        group = metric_data.group_name
        name = metric_data.name
        value = metric_data.value
        print(f"[{ts}][{group}]: {name}={value}")


metrics.configure(StdoutMetricHandler(), group="my_app")

现在,group my_app 中的所有指标将作为以下内容打印到 stdout:

[1574213883.4182858][my_app]: my_metric=<value>
[1574213940.5237644][my_app]: my_metric=<value>

Metric Handlers#

以下是 torchelastic 中包含的 metric handlers。

class torch.distributed.elastic.metrics.api.MetricHandler[source]#
class torch.distributed.elastic.metrics.api.ConsoleMetricHandler[source]#
class torch.distributed.elastic.metrics.api.NullMetricHandler[source]#

Methods#

torch.distributed.elastic.metrics.configure(handler, group=None)[source]#
torch.distributed.elastic.metrics.prof(fn=None, group='torchelastic')[source]#

@profile 装饰器发布其装饰的函数的 duration.ms、count、success、failure 指标。

metric 名称默认为函数的限定名称(class_name.def_name)。如果函数不属于类,它将使用叶模块名称。

用法

@metrics.prof
def x():
    pass


@metrics.prof(group="agent")
def y():
    pass
torch.distributed.elastic.metrics.put_metric(metric_name, metric_value, metric_group='torchelastic')[source]#

发布一个 metric 数据点。

用法

put_metric("metric_name", 1)
put_metric("metric_name", 1, "metric_group_name")