快捷方式

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模式下,指标可以通过指标 API 端点以 Prometheus 格式提供。

传统模式

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

  • ts_inference_requests_totalts_inference_latency_microsecondsts_queue_latency_microseconds仅可通过指标 API 端点以 Prometheus 格式获得。

  • 前端指标记录到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 并指定config.properties文件的路径,位于ts-config标志之后

    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 指标类型一致。

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

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

默认指标

默认前端指标

指标名称 类型 单位 维度 语义
Requests2XX 计数器 计数 Level,Hostname 响应状态码在 200-300 范围内的请求总数
Requests4XX 计数器 计数 Level,Hostname 响应状态码在 400-500 范围内的请求总数
Requests5XX 计数器 计数 Level,Hostname 响应状态码大于 500 的请求总数
ts_inference_requests_total 计数器 计数 model_name,model_version,hostname 接收到的推理请求总数
ts_inference_latency_microseconds 计数器 微秒 model_name,model_version,hostname 推理总延迟(微秒)
ts_queue_latency_microseconds 计数器 微秒 model_name,model_version,hostname 队列总延迟(微秒)
QueueTime 规格 毫秒 Level,Hostname 作业在请求队列中花费的时间(毫秒)
WorkerThreadTime 规格 毫秒 Level,Hostname 工作线程中花费的时间(不包括后端响应时间,单位毫秒)
WorkerLoadTime 规格 毫秒 WorkerName,Level,Hostname 工作线程加载模型花费的时间(毫秒)
CPUUtilization 规格 百分比 Level,Hostname 主机上的 CPU 利用率
MemoryUsed 规格 兆字节 Level,Hostname 主机上使用的内存
MemoryAvailable 规格 兆字节 Level,Hostname 主机上可用的内存
MemoryUtilization 规格 百分比 Level,Hostname 主机上的内存利用率
DiskUsage 规格 千兆字节 Level,Hostname 主机上使用的磁盘
DiskUtilization 规格 百分比 Level,Hostname 主机上使用的磁盘
DiskAvailable 规格 千兆字节 Level,Hostname 主机上可用的磁盘
GPUMemoryUtilization 规格 百分比 Level,DeviceId,Hostname 主机上 GPU 内存利用率,DeviceId
GPUMemoryUsed 规格 兆字节 Level,DeviceId,Hostname 主机上 GPU 内存使用量,DeviceId
GPUUtilization 规格 百分比 Level,DeviceId,Hostname 主机上 GPU 利用率,DeviceId

默认后端指标

指标名称 类型 单位 维度 语义
HandlerTime 规格 毫秒 ModelName,Level,Hostname 后端处理程序中花费的时间
PredictionTime 规格 毫秒 ModelName,Level,Hostname 后端预测时间

自定义指标 API

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

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

提供给自定义处理程序代码的当前请求上下文包含一个 metrics 对象。

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

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

默认维度

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

  • ModelName: {name_of_model}

  • Level: Model

创建维度对象

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

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 的全面开发人员文档

查看文档

教程

获取初学者和高级开发人员的深入教程

查看教程

资源

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

查看资源