use crate::{try_unsafe, util::Result};
use openvino_genai_sys::{
self, ov_genai_perf_metrics, ov_genai_perf_metrics_get_generate_duration,
ov_genai_perf_metrics_get_load_time, ov_genai_perf_metrics_get_num_generation_tokens,
ov_genai_perf_metrics_get_num_input_tokens, ov_genai_perf_metrics_get_throughput,
ov_genai_perf_metrics_get_tpot, ov_genai_perf_metrics_get_ttft,
};
#[derive(Debug, Clone, Copy)]
enum MetricsSource {
Llm,
Vlm,
Whisper,
}
pub struct PerfMetrics {
ptr: *mut ov_genai_perf_metrics,
source: MetricsSource,
}
impl Drop for PerfMetrics {
fn drop(&mut self) {
unsafe {
match self.source {
MetricsSource::Llm => {
openvino_genai_sys::ov_genai_decoded_results_perf_metrics_free(self.ptr);
}
MetricsSource::Vlm => {
openvino_genai_sys::ov_genai_vlm_decoded_results_perf_metrics_free(self.ptr);
}
MetricsSource::Whisper => {
}
}
}
}
}
impl PerfMetrics {
pub fn get_load_time(&self) -> Result<f32> {
let mut value: f32 = 0.0;
try_unsafe!(ov_genai_perf_metrics_get_load_time(self.ptr, &mut value))?;
Ok(value)
}
pub fn get_num_generation_tokens(&self) -> Result<usize> {
let mut value: usize = 0;
try_unsafe!(ov_genai_perf_metrics_get_num_generation_tokens(
self.ptr, &mut value
))?;
Ok(value)
}
pub fn get_num_input_tokens(&self) -> Result<usize> {
let mut value: usize = 0;
try_unsafe!(ov_genai_perf_metrics_get_num_input_tokens(
self.ptr, &mut value
))?;
Ok(value)
}
pub fn get_ttft(&self) -> Result<(f32, f32)> {
let mut mean: f32 = 0.0;
let mut std: f32 = 0.0;
try_unsafe!(ov_genai_perf_metrics_get_ttft(
self.ptr, &mut mean, &mut std
))?;
Ok((mean, std))
}
pub fn get_tpot(&self) -> Result<(f32, f32)> {
let mut mean: f32 = 0.0;
let mut std: f32 = 0.0;
try_unsafe!(ov_genai_perf_metrics_get_tpot(
self.ptr, &mut mean, &mut std
))?;
Ok((mean, std))
}
pub fn get_throughput(&self) -> Result<(f32, f32)> {
let mut mean: f32 = 0.0;
let mut std: f32 = 0.0;
try_unsafe!(ov_genai_perf_metrics_get_throughput(
self.ptr, &mut mean, &mut std
))?;
Ok((mean, std))
}
pub fn get_generate_duration(&self) -> Result<(f32, f32)> {
let mut mean: f32 = 0.0;
let mut std: f32 = 0.0;
try_unsafe!(ov_genai_perf_metrics_get_generate_duration(
self.ptr, &mut mean, &mut std
))?;
Ok((mean, std))
}
pub(crate) fn from_decoded_results(ptr: *mut ov_genai_perf_metrics) -> Self {
Self {
ptr,
source: MetricsSource::Llm,
}
}
pub(crate) fn from_vlm_decoded_results(ptr: *mut ov_genai_perf_metrics) -> Self {
Self {
ptr,
source: MetricsSource::Vlm,
}
}
pub(crate) fn from_whisper_decoded_results(ptr: *mut ov_genai_perf_metrics) -> Self {
Self {
ptr,
source: MetricsSource::Whisper,
}
}
}