Shortcuts

指标

Metrics API。

概述:

torchelastic 中的 metrics API 用于发布遥测指标。 它旨在供 torchelastic 的内部模块使用,以发布指标给最终用户,目的是提高可见性并帮助调试。然而,您也可以在您的作业中使用相同的 API 将指标发布到相同的指标 sink

一个 metric 可以被认为是时间序列数据,并且通过字符串值的元组 (metric_group, metric_name) 唯一标识。

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

注意

指标组 torchelastic 由 torchelastic 保留,用于其生成的平台级指标。 例如,torchelastic 可能会输出从代理进行的重新协调操作的延迟(以毫秒为单位),如 (torchelastic, agent.rendezvous.duration.ms)

使用指标组的一个明智方法是将其映射到作业中的一个阶段或模块。您还可以编码作业的某些高级属性,例如区域或阶段(开发与生产)。

发布指标

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

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

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

# 使所有指标(除了来自“my_module”的指标)都输出到/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` 装饰器来方便简洁地分析函数

# -- 在模块 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 如果 函数 成功完成
<leaf_module or classname>.failure - 1 如果 函数 抛出异常
<leaf_module or classname>.duration.ms - 函数 持续时间 以毫秒为单位

配置指标处理器

torch.distributed.elastic.metrics.MetricHandler 负责将添加的指标值发送到特定的目的地。可以为不同的指标组配置不同的指标处理器。

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

import torch.distributed.elastic.metrics as metrics

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

编写自定义指标处理器

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

下面是一个打印指标到 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")

现在组 my_app 中的所有指标将打印到标准输出,如下所示:

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

指标处理器

以下是torchelastic附带的指标处理器。

class torch.distributed.elastic.metrics.api.MetricHandler[源代码]
class torch.distributed.elastic.metrics.api.ConsoleMetricHandler[源代码]
class torch.distributed.elastic.metrics.api.NullMetricHandler[源代码]

方法

torch.distributed.elastic.metrics.configure(handler, group=None)[源代码]
torch.distributed.elastic.metrics.prof(fn=None, group='torchelastic')[源代码]

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

指标名称默认为函数的限定名称(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')[源代码]

发布一个指标数据点。

用法

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