Skip to main content

cherenkov/qwen4_exp/gpu/prefill/
stats.rs

1//! Cumulative completed prefill chunks. Sequence rollback does not undo work.
2
3use super::ChunkStats;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize)]
7pub struct PrefillStats {
8    pub chunks: u64,
9    pub tokens: u64,
10    pub min_chunk_tokens: usize,
11    pub max_chunk_tokens: usize,
12    pub seconds: f64,
13    pub ring_wait_seconds: f64,
14    pub gpu_delta_seconds: f64,
15    pub gpu_attention_seconds: f64,
16    pub gpu_expert_seconds: f64,
17    pub gpu_mtp_seconds: f64,
18    pub ngram_seconds: f64,
19}
20
21impl PrefillStats {
22    pub(super) fn record(&mut self, chunk: ChunkStats) {
23        self.min_chunk_tokens = if self.chunks == 0 {
24            chunk.tokens
25        } else {
26            self.min_chunk_tokens.min(chunk.tokens)
27        };
28        self.max_chunk_tokens = self.max_chunk_tokens.max(chunk.tokens);
29        self.chunks += 1;
30        self.tokens += chunk.tokens as u64;
31        self.seconds += chunk.secs;
32        self.ring_wait_seconds += chunk.wait_s;
33        self.gpu_delta_seconds += chunk.gpu_delta_s;
34        self.gpu_attention_seconds += chunk.gpu_attn_s;
35        self.gpu_expert_seconds += chunk.gpu_experts_s;
36        self.gpu_mtp_seconds += chunk.gpu_mtp_s;
37        self.ngram_seconds += chunk.ngram_s;
38    }
39}
40
41#[cfg(test)]
42#[path = "../../../../tests/unit/qwen4_exp/gpu/prefill_stats.rs"]
43mod tests;