快捷方式

TorchServe 指标

目录

简介

Torchserve 指标可以大致分为前端指标和后端指标。

前端指标:

  • API 请求状态指标

  • 推理请求指标

  • 系统利用率指标

注意: 系统利用率指标是定期收集的(默认:每分钟一次)

后端指标:

  • 默认模型指标

  • 自定义模型指标

注意: Torchserve 提供了一个 API 来收集自定义模型指标。

默认前端和后端指标显示在 默认指标 部分。

指标模式

支持三种指标模式,即 logprometheuslegacy,默认模式为 log。可以使用 config.properties 中的 metrics_mode 配置选项或 TS_METRICS_MODE 环境变量配置指标模式。有关 config.properties 和基于环境变量的配置的更多详细信息,请参阅 Torchserve 配置 文档。

日志模式

log 模式下,指标会被记录,并且可以由指标代理聚合。默认情况下,指标会在 log 模式下的以下位置收集

  • 前端指标 - log_directory/ts_metrics.log

  • 后端指标 - log_directory/model_metrics.log

日志文件和指标文件的位置可以在 log4j2.xml 文件中配置

Prometheus 模式

prometheus 模式下,指标以 prometheus 格式通过 指标 API 端点 提供。

传统模式

legacy 模式启用与 Torchserve 版本 <= 0.7.1 的向后兼容性,其中

  • ts_inference_requests_totalts_inference_latency_microsecondsts_queue_latency_microseconds 仅通过 prometheus 格式的 指标 API 端点 提供。

  • 前端指标记录到 log_directory/ts_metrics.log

  • 后端指标记录到 log_directory/model_metrics.log

注意: 要启用与版本 <= 0.7.1 的完全向后兼容性,请使用传统指标模式并启用 模型指标自动检测

入门指南

使用 演示自定义指标的示例 作为参考

  1. 创建自定义 指标配置 文件 使用默认 metrics.yaml 文件。

  2. 在使用的 config.properties 中,将 metrics_config 参数设置为 yaml 文件路径

    metrics_config=/<path>/<to>/<metrics>/<config>/<file>/metrics.yaml
    

    如果未指定 metrics_config 参数,则将使用默认的 metrics.yaml 配置文件。

  3. 使用 config.properties 中的 metrics_mode 配置选项或 TS_METRICS_MODE 环境变量设置您想要的指标模式。如果未设置,则默认使用 log 模式。

  4. 如果在 处理程序 中有任何自定义指标,请使用 自定义指标 API 发出这些指标。

  5. 运行 torchserve 并指定 ts-config 标志后的 config.properties 文件路径

    torchserve --ncs --start --model-store model_store --models my_model=model.mar --ts-config /<path>/<to>/<config>/<file>/config.properties

  6. 根据选择的模式收集指标

    如果是 log 模式,请检查

    • 前端指标 - log_directory/ts_metrics.log

    • 后端指标 - log_directory/model_metrics.log

    否则,如果使用 prometheus 模式,请使用 指标 API 端点

指标配置

TorchServe 在 yaml 文件中定义指标配置,包括前端指标(即 ts_metrics)和后端指标(即 model_metrics)。当 TorchServe 启动时,指标定义会被加载,并根据 metrics_mode 配置,将相应的指标作为日志或通过 指标 API 端点 提供。

不支持对指标配置文件进行动态更新。为了考虑对指标配置文件进行的更新,需要重启 Torchserve。

模型指标自动检测

默认情况下,未在指标配置文件中定义的指标不会记录在指标日志文件中,也不会通过 指标 API 端点 提供。可以通过在 config.properties 中将 model_metrics_auto_detect 设置为 true 或使用 TS_MODEL_METRICS_AUTO_DETECT 环境变量来 自动检测 后端模型指标。默认情况下,模型指标自动检测处于禁用状态。

警告: 使用后端指标的自动检测 会对性能产生影响, 表现为延迟开销, 通常在模型加载时 以及给定模型的首次推理时。 这种冷启动行为 是因为, 通常在模型加载时 和首次推理时, 后端会发出新的指标, 并且前端会检测并注册这些指标。 如果首次更新新指标, 后续推理也可能会受到性能影响。 对于经常加载/卸载多个模型的用例, 可以通过提前在指标配置文件中 指定已知指标来缓解延迟开销。

指标配置格式

指标配置 yaml 文件使用 Prometheus 指标类型 术语进行格式化

dimensions: # dimension aliases
  - &model_name "ModelName"
  - &level "Level"

ts_metrics:  # frontend metrics
  counter:  # metric type
    - name: NameOfCounterMetric  # name of metric
      unit: ms  # unit of metric
      dimensions: [*model_name, *level]  # dimension names of metric (referenced from the above dimensions dict)
  gauge:
    - name: NameOfGaugeMetric
      unit: ms
      dimensions: [*model_name, *level]
  histogram:
    - name: NameOfHistogramMetric
      unit: ms
      dimensions: [*model_name, *level]

model_metrics:  # backend metrics
  counter:  # metric type
    - name: InferenceTimeInMS  # name of metric
      unit: ms  # unit of metric
      dimensions: [*model_name, *level]  # dimension names of metric (referenced from the above dimensions dict)
    - name: NumberOfMetrics
      unit: count
      dimensions: [*model_name]
  gauge:
    - name: GaugeModelMetricNameExample
      unit: ms
      dimensions: [*model_name, *level]
  histogram:
    - name: HistogramModelMetricNameExample
      unit: ms
      dimensions: [*model_name, *level]

注意: 在指标配置文件中添加自定义 model_metrics 时,请确保将 ModelNameLevel 维度名称放在维度列表的末尾,因为以下自定义指标 API 默认包含它们:add_metricadd_counteradd_timeadd_sizeadd_percent

默认指标配置

默认指标在默认指标配置文件 metrics.yaml 中提供。

指标类型

TorchServe 指标使用与 Prometheus 指标类型 一致的 指标类型

指标类型是 Metric 对象的属性。用户在添加自定义指标时将受限于现有的指标类型。

class MetricTypes(enum.Enum):
    COUNTER = "counter"
    GAUGE = "gauge"
    HISTOGRAM = "histogram"

默认指标

默认前端指标

指标名称 类型 单位 维度 语义
Requests2XX 计数器 计数 级别、主机名 响应状态代码在 200-300 范围内的请求总数
Requests4XX 计数器 计数 级别、主机名 响应状态代码在 400-500 范围内的请求总数
Requests5XX 计数器 计数 级别、主机名 响应状态代码高于 500 的请求总数
ts_inference_requests_total 计数器 计数 模型名称、模型版本、主机名 收到的推理请求总数
ts_inference_latency_microseconds 计数器 微秒 模型名称、模型版本、主机名 总推理延迟,以微秒为单位
ts_queue_latency_microseconds 计数器 微秒 模型名称、模型版本、主机名 总队列延迟,以微秒为单位
QueueTime 仪表 毫秒 级别、主机名 作业在请求队列中花费的时间,以毫秒为单位
WorkerThreadTime 仪表 毫秒 级别、主机名 在工作线程中花费的时间,不包括后端响应时间,以毫秒为单位
WorkerLoadTime 仪表 毫秒 工作线程名称、级别、主机名 工作线程加载模型所用的时间,以毫秒为单位
CPUUtilization 仪表 百分比 级别、主机名 主机上的 CPU 利用率
MemoryUsed 仪表 兆字节 级别、主机名 主机上已用内存
MemoryAvailable 仪表 兆字节 级别、主机名 主机上可用内存
MemoryUtilization 仪表 百分比 级别、主机名 主机上的内存利用率
DiskUsage 仪表 千兆字节 级别、主机名 主机上已用磁盘空间
DiskUtilization 仪表 百分比 级别、主机名 主机上已用磁盘空间
DiskAvailable 仪表 千兆字节 级别、主机名 主机上可用磁盘空间
GPUMemoryUtilization 仪表 百分比 级别、设备 ID、主机名 主机上 GPU 内存利用率,设备 ID
GPUMemoryUsed 仪表 兆字节 级别、设备 ID、主机名 主机上已用 GPU 内存,设备 ID
GPUUtilization 仪表 百分比 级别、设备 ID、主机名 主机上的 GPU 利用率,设备 ID

默认后端指标

指标名称 类型 单位 维度 语义
HandlerTime 仪表 毫秒 模型名称、级别、主机名 后端处理程序中花费的时间
PredictionTime 仪表 毫秒 模型名称、级别、主机名 后端预测时间

自定义指标 API

TorchServe 使 处理程序 能够发出自定义指标,然后根据配置的 metrics_mode 提供这些指标。

带有自定义处理程序的示例,显示了 自定义指标 API 的用法.

自定义处理程序 代码配备了当前请求的 上下文,该上下文由 metrics 对象组成

# Access metrics object in context as follows
def initialize(self, context):
    metrics = context.metrics

注意: 自定义指标 API 不要与 指标 API 端点 混淆,后者是一个 HTTP API,用于以 prometheus 格式获取指标。

默认维度

如果未指定指标,则指标将具有几个默认维度

  • 模型名称: {模型名称}

  • 级别: 模型

创建维度对象

指标的维度可以定义为对象

from ts.metrics.dimension import Dimension

# Dimensions are name value pairs
dim1 = Dimension(name, value)
dim2 = Dimension(some_name, some_value)
.
.
.
dimN= Dimension(name_n, value_n)

添加通用指标

通用指标默认为 COUNTER 指标类型

用于添加不带默认维度的通用指标的函数 API

    def add_metric_to_cache(
        self,
        metric_name: str,
        unit: str,
        dimension_names: list = [],
        metric_type: MetricTypes = MetricTypes.COUNTER,
    ) -> CachingMetric:
        """
        Create a new metric and add into cache. Override existing metric if already present.

        Parameters
        ----------
        metric_name str
            Name of metric
        unit str
            unit can be one of ms, percent, count, MB, GB or a generic string
        dimension_names list
            list of dimension name strings for the metric
        metric_type MetricTypes
            Type of metric Counter, Gauge, Histogram
        Returns
        -------
        newly created Metrics object
        """

CachingMetric API 用于更新指标

    def add_or_update(
        self,
        value: int or float,
        dimension_values: list = [],
        request_id: str = "",
):
    """
    Update metric value, request id and dimensions

    Parameters
    ----------
    value : int, float
        metric to be updated
    dimension_values : list
        list of dimension value strings
    request_id : str
        request id to be associated with the metric
    """
    def update(
        self,
        value: int or float,
        request_id: str = "",
        dimensions: list = [],
):
    """
    BACKWARDS COMPATIBILITY: Update metric value

    Parameters
    ----------
    value : int, float
        metric to be updated
    request_id : str
        request id to be associated with the metric
    dimensions : list
        list of Dimension objects
    """
# Example usage
metrics = context.metrics
# Add metric
distance_metric = metrics.add_metric_to_cache(name='DistanceInKM', unit='km', dimension_names=[...])
# Update metric
distance_metric.add_or_update(value=distance, dimension_values=[...], request_id=context.get_request_id())
# OR
distance_metric.update(value=distance, request_id=context.get_request_id(), dimensions=[...])

注意: 调用 add_metric_to_cache 不会发出指标,需要对指标对象调用 add_or_update,如上所示。

用于添加带默认维度的通用指标的函数 API

    def add_metric(
        self,
        name: str,
        value: int or float,
        unit: str,
        idx: str = None,
        dimensions: list = [],
        metric_type: MetricTypes = MetricTypes.COUNTER,
    ):
        """
        Add a generic metric
            Default metric type is counter

        Parameters
        ----------
        name : str
            metric name
        value: int or float
            value of the metric
        unit: str
            unit of metric
        idx: str
            request id to be associated with the metric
        dimensions: list
            list of Dimension objects for the metric
        metric_type MetricTypes
            Type of metric Counter, Gauge, Histogram
        """
# Example usage
metrics = context.metrics
metric = metrics.add_metric(name='DistanceInKM', value=10, unit='km', dimensions=[...])

添加基于时间的指标

基于时间的指标默认为 GAUGE 指标类型

    def add_time(self, name: str, value: int or float, idx=None, unit: str = 'ms', dimensions: list = None,
                 metric_type: MetricTypes = MetricTypes.GAUGE):
        """
        Add a time based metric like latency, default unit is 'ms'
            Default metric type is gauge

        Parameters
        ----------
        name : str
            metric name
        value: int
            value of metric
        idx: int
            request_id index in batch
        unit: str
            unit of metric,  default here is ms, s is also accepted
        dimensions: list
            list of Dimension objects for the metric
        metric_type: MetricTypes
           type for defining different operations, defaulted to gauge metric type for Time metrics
        """

注意: 默认单位为 ms

支持的单位['ms', 's']

# Example usage
metrics = context.metrics
metrics.add_time(name='InferenceTime', value=end_time-start_time, idx=None, unit='ms', dimensions=[...])

添加基于大小的指标

基于大小的指标默认为 GAUGE 指标类型

    def add_size(self, name: str, value: int or float, idx=None, unit: str = 'MB', dimensions: list = None,
                 metric_type: MetricTypes = MetricTypes.GAUGE):
        """
        Add a size based metric
            Default metric type is gauge

        Parameters
        ----------
        name : str
            metric name
        value: int, float
            value of metric
        idx: int
            request_id index in batch
        unit: str
            unit of metric, default here is 'MB', 'kB', 'GB' also supported
        dimensions: list
            list of Dimension objects for the metric
        metric_type: MetricTypes
           type for defining different operations, defaulted to gauge metric type for Size metrics
        """

注意: 默认单位为 MB

支持的单位['MB', 'kB', 'GB', 'B']

# Example usage
metrics = context.metrics
metrics.add_size(name='SizeOfImage', value=img_size, idx=None, unit='MB', dimensions=[...])

添加基于百分比的指标

基于百分比的指标默认为 GAUGE 指标类型

    def add_percent(self, name: str, value: int or float, idx=None, dimensions: list = None,
                    metric_type: MetricTypes = MetricTypes.GAUGE):
        """
        Add a percentage based metric
            Default metric type is gauge

        Parameters
        ----------
        name : str
            metric name
        value: int, float
            value of metric
        idx: int
            request_id index in batch
        dimensions: list
            list of Dimension objects for the metric
        metric_type: MetricTypes
           type for defining different operations, defaulted to gauge metric type for Percent metrics
        """

推断单位percent

# Example usage
metrics = context.metrics
metrics.add_percent(name='MemoryUtilization', value=utilization_percent, idx=None, dimensions=[...])

添加基于计数器的指标

基于计数器的指标默认为 COUNTER 指标类型

    def add_counter(self, name: str, value: int or float, idx=None, dimensions: list = None):
        """
        Add a counter metric or increment an existing counter metric
            Default metric type is counter
        Parameters
        ----------
        name : str
            metric name
        value: int or float
            value of metric
        idx: int
            request_id index in batch
        dimensions: list
            list of Dimension objects for the metric
        """
# Example usage
metrics = context.metrics
metrics.add_counter(name='CallCount', value=call_count, idx=None, dimensions=[...])

推断单位count

获取指标

用户可以从缓存中获取指标。将返回 CachingMetric 对象,以便用户可以访问 CachingMetric 的方法来更新指标:(即 CachingMetric.add_or_update(value, dimension_values)CachingMetric.update(value, dimensions)

    def get_metric(
        self,
        metric_name: str,
        metric_type: MetricTypes = MetricTypes.COUNTER,
) -> CachingMetric:
    """
    Create a new metric and add into cache

    Parameters
    ----------
    metric_name str
        Name of metric

    metric_type MetricTypes
        Type of metric Counter, Gauge, Histogram

    Returns
    -------
    Metrics object or MetricsCacheKeyError if not found
    """
# Example usage
metrics = context.metrics
# Get metric
gauge_metric = metrics.get_metric(metric_name = "GaugeMetricName", metric_type = MetricTypes.GAUGE)
# Update metric
gauge_metric.add_or_update(value=gauge_metric_value, dimension_values=[...], request_id=context.get_request_id())
# OR
gauge_metric.update(value=gauge_metric_value, request_id=context.get_request_id(), dimensions=[...])

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深度教程

查看教程

资源

查找开发资源并获得问题解答

查看资源