metrale_model_layers/layers/ple/
dump.rs1use metrale_gpu_runtime::gpu::{DevicePtr, GpuBackend};
15
16fn dump_dir() -> Option<&'static str> {
19 static DIR: std::sync::OnceLock<Option<String>> = std::sync::OnceLock::new();
20 DIR.get_or_init(|| {
21 let d = std::env::var("METRALE_QWEN4EXP_DUMP")
22 .ok()
23 .filter(|s| !s.is_empty());
24 if let Some(ref path) = d {
25 let _ = std::fs::create_dir_all(path);
26 tracing::warn!(
27 "METRALE_QWEN4EXP_DUMP={path}: taping the mHC highway to disk. \
28 This SYNCHRONIZES and copies D2H at every tap — a debug aid, \
29 not a serving mode."
30 );
31 }
32 d
33 })
34 .as_deref()
35}
36
37fn claim(path: &str) -> bool {
43 !std::path::Path::new(path).exists()
44}
45
46pub fn tap_highway(
51 gpu: &dyn GpuBackend,
52 streams: DevicePtr,
53 layer: usize,
54 tag: &str,
55 num_tokens: usize,
56 hc_dim: usize,
57 stream: u64,
58) {
59 let Some(dir) = dump_dir() else {
60 return;
61 };
62 let path = format!("{dir}/L{layer:02}_{tag}.bin");
63 if !claim(&path) {
64 return;
65 }
66 if gpu.synchronize(stream).is_err() {
67 return;
68 }
69 let mut raw = vec![0u8; num_tokens * hc_dim * 4];
70 if gpu.copy_d2h(streams, &mut raw).is_err() {
71 return;
72 }
73 let path = format!("{dir}/L{layer:02}_{tag}.bin");
74 if let Err(e) = std::fs::write(&path, &raw) {
75 tracing::warn!("highway tap {path}: {e}");
76 }
77}
78
79pub fn tap_bf16(
81 gpu: &dyn GpuBackend,
82 ptr: DevicePtr,
83 layer: usize,
84 tag: &str,
85 n_elements: usize,
86 stream: u64,
87) {
88 let Some(dir) = dump_dir() else {
89 return;
90 };
91 let path = format!("{dir}/L{layer:02}_{tag}.bf16.bin");
92 if !claim(&path) {
93 return;
94 }
95 if gpu.synchronize(stream).is_err() {
96 return;
97 }
98 let mut raw = vec![0u8; n_elements * 2];
99 if gpu.copy_d2h(ptr, &mut raw).is_err() {
100 return;
101 }
102 if let Err(e) = std::fs::write(&path, &raw) {
103 tracing::warn!("highway tap {path}: {e}");
104 }
105}
106
107pub fn tap_f32(
109 gpu: &dyn GpuBackend,
110 ptr: DevicePtr,
111 layer: usize,
112 tag: &str,
113 n_elements: usize,
114 stream: u64,
115) {
116 let Some(dir) = dump_dir() else {
117 return;
118 };
119 let path = format!("{dir}/L{layer:02}_{tag}.bin");
120 if !claim(&path) {
121 return;
122 }
123 if gpu.synchronize(stream).is_err() {
124 return;
125 }
126 let mut raw = vec![0u8; n_elements * 4];
127 if gpu.copy_d2h(ptr, &mut raw).is_err() {
128 return;
129 }
130 if let Err(e) = std::fs::write(&path, &raw) {
131 tracing::warn!("highway tap {path}: {e}");
132 }
133}