metrale_model_engine/model/trait_impl/
mod.rs1#![allow(unused_imports, dead_code, clippy::too_many_arguments)]
15
16use anyhow::Result;
17use metrale_cache::kv_cache::PagedKvCache;
18use metrale_gpu_runtime::gpu::DevicePtr;
19
20use super::types::{PinnedMetaStaging, TransformerModel};
21use crate::traits::{
22 ChunkedPrefillPageMetadata, FeedSource, Model, PrefillSlice, RowMask, SequenceState,
23};
24use metrale_model_layers::layer::{AttnMetadataDev, LayerState};
25use metrale_model_layers::speculative::DraftProposer;
26use metrale_model_layers::weight_map::{DenseWeight, MtpWeights};
27
28mod async_chkpt;
29mod borrow_streak;
30mod decode_a;
31mod decode_a2;
32mod decode_a3;
33mod decode_a_diag;
34mod decode_b;
35mod decode_b2;
36pub(in crate::model) mod decode_checkpoint;
37mod decode_graph_key;
38mod slot_graph_key;
39pub(crate) use slot_graph_key::SlotGraphKey;
40mod decode_multi_seq_gate;
41mod drafter_prefill;
42mod ep_misc;
43mod feed;
44mod gdn_woa;
45mod graph_borrow;
46mod impl_adapters;
47mod impl_circuit;
48mod impl_circuit_run;
49mod impl_circuit_verify_batch;
50mod impl_device_feed;
51mod impl_draft;
52mod impl_ep;
53mod impl_forward;
54mod impl_lifecycle;
55mod impl_logits;
56mod impl_ssm_state;
57mod impl_streams;
58mod impl_verify;
59mod impl_vision;
60mod lm_head_batched;
61mod mamba2_state_guard;
62mod meta;
63mod meta_argmax;
64mod prefill_a;
65mod prefill_b;
66mod prefill_c;
67mod prefill_d;
68mod prefix_reuse;
69mod sequence;
70mod sequence_compact;
71mod speculative;
72mod speculative_mtp;
73pub(in crate::model) mod ssm_fault_in;
74mod verify_a;
75mod verify_a_ssm;
76mod verify_b;
77mod verify_c;
78mod verify_c2;
79mod verify_d;
80mod verify_e;
81pub(in crate::model) mod verify_e2;
82mod verify_fused;
83
84impl Model for TransformerModel {}
85
86impl TransformerModel {
87 fn release_verify_capture_on_err<T>(&self, r: Result<T>) -> Result<T> {
94 if r.is_err() {
95 self.gpu.abort_capture_if_active(self.gpu.default_stream());
96 }
97 r
98 }
99
100 pub(in crate::model) fn collect_aux_states(
104 &self,
105 seq: &SequenceState,
106 stream: u64,
107 ) -> Result<Vec<(u32, Vec<u8>)>> {
108 let mut out = Vec::new();
109 for (i, l) in self.layers.iter().enumerate() {
110 if let Some(blob) =
111 l.snapshot_aux(seq.layer_states[i].as_ref(), self.gpu.as_ref(), stream)?
112 {
113 out.push((i as u32, blob));
114 }
115 }
116 Ok(out)
117 }
118
119 pub(in crate::model) fn requires_aux_state(&self) -> bool {
122 self.layers.iter().any(|l| l.has_aux_state())
123 }
124
125 pub(in crate::model) fn apply_aux_states(
128 &self,
129 seq: &mut SequenceState,
130 blobs: &[(u32, Vec<u8>)],
131 stream: u64,
132 ) -> Result<()> {
133 for (i, blob) in blobs {
134 self.layers[*i as usize].restore_aux(
135 seq.layer_states[*i as usize].as_mut(),
136 blob,
137 self.gpu.as_ref(),
138 stream,
139 )?;
140 }
141 Ok(())
142 }
143}
144
145#[cfg(test)]
146mod gdn_woa_folded_slots_tests {
147 fn record_old(list: &mut Vec<usize>, any: bool, slots: &[usize]) {
155 if any {
156 list.clear();
157 list.extend_from_slice(slots);
158 }
159 }
160 fn record_new(list: &mut Vec<usize>, any: bool, slots: &[usize]) {
161 list.clear();
162 if any {
163 list.extend_from_slice(slots);
164 }
165 }
166 fn consume(list: &mut Vec<usize>, slot: usize) -> bool {
169 match list.iter().position(|&s| s == slot) {
170 Some(p) => {
171 list.swap_remove(p);
172 true
173 }
174 None => false,
175 }
176 }
177
178 #[test]
182 fn a_no_op_fold_does_not_leave_a_stale_claim() {
183 let mut new = vec![];
184 record_new(&mut new, true, &[1, 2, 3, 4]);
185 for s in [1, 2, 3, 4] {
186 assert!(consume(&mut new, s), "batch A's own slots are folded");
187 }
188 record_new(&mut new, false, &[7]);
189 assert!(
190 !consume(&mut new, 7),
191 "slot 7 was NOT folded and must restore h"
192 );
193
194 let mut old = vec![];
197 record_old(&mut old, true, &[1, 2, 3, 4]);
198 record_old(&mut old, false, &[7]);
199 assert!(
200 consume(&mut old, 3),
201 "the shipped behaviour leaves slot 3 claimed — this assertion \
202 documents the bug, and its inverse is the fix above"
203 );
204 }
205}