cherenkov/qwen4_exp/gpu/prefill/
stats.rs1use 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;