TorchServe 指标¶
内容¶
简介¶
Torchserve 指标可以大致分为前端指标和后端指标。
前端指标:¶
API 请求状态指标
推理请求指标
系统利用率指标
注意:系统利用率指标定期收集(默认:每分钟一次)
后端指标:¶
默认模型指标
自定义模型指标
注意:Torchserve 提供了一个API 来收集自定义模型指标。
默认前端和后端指标显示在默认指标部分。
指标模式¶
支持三种指标模式,即log
、prometheus
和legacy
,默认模式为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_total
、ts_inference_latency_microseconds
和ts_queue_latency_microseconds
仅可通过指标 API 端点以 Prometheus 格式获得。前端指标记录到
log_directory/ts_metrics.log
后端指标记录到
log_directory/model_metrics.log
注意:要启用与版本<= 0.7.1
的完全向后兼容性,请使用传统指标模式并启用模型指标自动检测。
入门¶
以演示自定义指标的示例为参考
创建一个自定义指标配置文件或利用默认的metrics.yaml文件。
在使用的
config.properties
中,将metrics_config
参数设置为 yaml 文件路径metrics_config=/<path>/<to>/<metrics>/<config>/<file>/metrics.yaml
如果未指定
metrics_config
参数,则将使用默认的metrics.yaml配置文件。使用
config.properties
中的metrics_mode
配置选项或TS_METRICS_MODE
环境变量设置所需的指标模式。如果未设置,则默认使用log
模式。运行 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
根据所选模式收集指标
如果为
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
时,请确保在维度列表的末尾包含 ModelName
和 Level
维度名称,因为以下自定义指标 API 默认包含它们:add_metric、add_counter、add_time、add_size 和 add_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=[...])