Metrics¶
Metrics API。
概述:
torchelastic 中的 metrics API 用於發布遙測指標。它旨在供 torchelastic 的內部模組使用,以向最終使用者發布指標,從而提高可見性並協助偵錯。 但是,您可以在您的 jobs 中使用相同的 API,將指標發布到相同的 metrics sink
。
一個 metric
可以被認為是時間序列資料,並由字串值元組 (metric_group, metric_name)
唯一標識。
torchelastic 不假設 metric_group
是什麼,以及它與 metric_name
有什麼關係。 完全由使用者決定使用這兩個欄位來唯一標識一個指標。
注意
度量群組 torchelastic
由 torchelastic 保留,用於它產生的平台層級度量。例如,torchelastic 可能會將代理程式重新協商操作的延遲(以毫秒為單位)輸出為 (torchelastic, agent.rendezvous.duration.ms)
使用度量群組的合理方式是將它們映射到您作業中的階段或模組。您也可以對作業的某些高階屬性進行編碼,例如區域或階段(開發 vs 生產)。
發布度量:
使用 torchelastic 的度量 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
配置度量處理器:
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")
編寫自定義度量處理器:
如果您希望將您的度量發送到自定義位置,請實作 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>
度量處理器¶
以下是 torchelastic 包含的度量處理器。