use serde::{Deserialize, Serialize};
use crate::AicError;
pub const FPM_VERSION: u32 = 1;
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub struct ScheduledRequestMetrics {
#[serde(default)]
pub num_prefill_requests: u32,
#[serde(default)]
pub sum_prefill_tokens: u32,
#[serde(default)]
pub var_prefill_length: f64,
#[serde(default)]
pub sum_prefill_kv_tokens: u32,
#[serde(default)]
pub num_decode_requests: u32,
#[serde(default)]
pub sum_decode_kv_tokens: u32,
#[serde(default)]
pub var_decode_kv_tokens: f64,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
pub struct QueuedRequestMetrics {
#[serde(default)]
pub num_prefill_requests: u32,
#[serde(default)]
pub sum_prefill_tokens: u32,
#[serde(default)]
pub var_prefill_length: f64,
#[serde(default)]
pub num_decode_requests: u32,
#[serde(default)]
pub sum_decode_kv_tokens: u32,
#[serde(default)]
pub var_decode_kv_tokens: f64,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
pub struct ForwardPassMetrics {
#[serde(default = "default_fpm_version")]
pub version: u32,
#[serde(default)]
pub worker_id: String,
#[serde(default)]
pub dp_rank: u32,
#[serde(default)]
pub counter_id: u64,
#[serde(default)]
pub wall_time: f64,
#[serde(default)]
pub scheduled_requests: ScheduledRequestMetrics,
#[serde(default)]
pub queued_requests: QueuedRequestMetrics,
}
impl Default for ForwardPassMetrics {
fn default() -> Self {
Self {
version: FPM_VERSION,
worker_id: String::new(),
dp_rank: 0,
counter_id: 0,
wall_time: 0.0,
scheduled_requests: ScheduledRequestMetrics::default(),
queued_requests: QueuedRequestMetrics::default(),
}
}
}
pub(crate) fn validate_forward_pass_metrics(metrics: &ForwardPassMetrics) -> Result<(), AicError> {
if metrics.version != FPM_VERSION {
return Err(AicError::UnsupportedSchemaVersion {
kind: "ForwardPassMetrics",
got: metrics.version,
expected: FPM_VERSION,
});
}
let scheduled = &metrics.scheduled_requests;
if scheduled.num_prefill_requests == 0
&& (scheduled.sum_prefill_tokens > 0 || scheduled.sum_prefill_kv_tokens > 0)
{
return Err(AicError::InvalidForwardPassMetrics(
"prefill token sums require num_prefill_requests > 0".to_string(),
));
}
if scheduled.num_decode_requests == 0 && scheduled.sum_decode_kv_tokens > 0 {
return Err(AicError::InvalidForwardPassMetrics(
"decode KV token sum requires num_decode_requests > 0".to_string(),
));
}
Ok(())
}
fn default_fpm_version() -> u32 {
FPM_VERSION
}