Metrics#
創建於:2021年5月4日 | 最後更新:2021年5月4日
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)。
使用指標組的一個合理方法是將它們對映到作業中的某個階段或模組。您也可以對作業的某些高階屬性進行編碼,例如區域或階段(開發 vs. 生產)。
釋出指標:
使用 torchelastic 的 metrics API 類似於使用 Python 的 logging 框架。在嘗試新增指標資料之前,您必須先配置一個指標處理器。
下面的示例測量了 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 負責將新增的指標值傳送到特定的目的地。不同的指標組可以配置不同的指標處理器。
預設情況下,torchelastic 將所有指標傳送到 /dev/null。透過新增以下配置,`torchelastic` 和 `my_app` 指標組將被列印到控制檯。
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 介面,並配置您的作業使用您的自定義指標處理器。
下面是一個列印指標到 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 中的所有指標都將作為以下格式列印到 stdout:
[1574213883.4182858][my_app]: my_metric=<value>
[1574213940.5237644][my_app]: my_metric=<value>
Metric Handlers#
以下是 torchelastic 內建的指標處理器: