metrale_model_layers/layers/
glm_vit.rs1use metrale_gpu_runtime::gpu::{DevicePtr, KernelHandle};
20
21pub struct GlmVitBlock {
23 pub norm1_w: DevicePtr,
24 pub qkv_w: DevicePtr,
25 pub qkv_b: DevicePtr,
26 pub q_norm_w: DevicePtr,
29 pub k_norm_w: DevicePtr,
30 pub proj_w: DevicePtr,
31 pub proj_b: DevicePtr,
32 pub norm2_w: DevicePtr,
33 pub gate_w: DevicePtr,
34 pub gate_b: DevicePtr,
35 pub up_w: DevicePtr,
36 pub up_b: DevicePtr,
37 pub down_w: DevicePtr,
38 pub down_b: DevicePtr,
39}
40
41pub struct GlmVitMerger {
44 pub post_layernorm_w: DevicePtr,
46 pub downsample_w: DevicePtr,
49 pub downsample_b: DevicePtr,
50 pub proj_w: DevicePtr,
51 pub norm_w: DevicePtr,
54 pub norm_b: DevicePtr,
55 pub gate_w: DevicePtr,
56 pub up_w: DevicePtr,
57 pub down_w: DevicePtr,
58}
59
60pub struct GlmVitScratch {
63 pub(crate) buf_f32: DevicePtr,
64 pub(crate) buf_h1: DevicePtr,
65 pub(crate) buf_h2: DevicePtr,
66 pub(crate) buf_gate: DevicePtr,
67 pub(crate) buf_up: DevicePtr,
68 pub(crate) buf_qr: DevicePtr,
69 pub(crate) buf_kr: DevicePtr,
70 pub(crate) buf_vt: DevicePtr,
71 pub(crate) buf_scores: DevicePtr,
72 pub(crate) buf_probs: DevicePtr,
73 pub(crate) buf_o_stage: DevicePtr,
74 pub(crate) buf_rope_cos: DevicePtr,
75 pub(crate) buf_rope_sin: DevicePtr,
76 pub(crate) buf_merge_a: DevicePtr,
77 pub(crate) buf_merge_b: DevicePtr,
78 pub(crate) buf_merge_g: DevicePtr,
79 pub(crate) buf_merge_u: DevicePtr,
80 pub buf_out: DevicePtr,
81}
82
83pub struct GlmVit {
84 pub(crate) patch_embed_w: DevicePtr,
85 pub(crate) patch_embed_b: DevicePtr,
86 pub(crate) blocks: Vec<GlmVitBlock>,
87 pub(crate) merger: GlmVitMerger,
88
89 pub(crate) k_gemm: KernelHandle,
90 pub(crate) k_gemm_f32: KernelHandle,
91 pub(crate) k_add_bias: KernelHandle,
92 pub(crate) k_rmsnorm: KernelHandle,
93 pub(crate) k_layernorm: KernelHandle,
94 pub(crate) k_gelu: KernelHandle,
95 pub(crate) k_swiglu: KernelHandle,
96 pub(crate) k_qknorm_rope: KernelHandle,
97 pub(crate) k_softmax: KernelHandle,
98 pub(crate) k_scatter_head: KernelHandle,
99 pub(crate) k_im2col: KernelHandle,
100 pub(crate) k_copy: KernelHandle,
101 pub(crate) k_add: KernelHandle,
102 pub(crate) k_f32_bf16: KernelHandle,
103
104 pub(crate) hidden_size: usize,
105 pub(crate) num_heads: usize,
106 pub(crate) head_dim: usize,
107 pub(crate) intermediate_size: usize,
108 pub(crate) spatial_merge_size: usize,
109 pub out_hidden_size: usize,
110 pub(crate) projection_intermediate_size: usize,
111 pub(crate) patch_dim: usize,
114 pub(crate) rms_norm_eps: f32,
115 pub(crate) swiglu_limit: f32,
116 pub(crate) p_max: usize,
119 pub(crate) rope_inv_freq: Vec<f32>,
123
124 pub(crate) scratch: std::sync::OnceLock<GlmVitScratch>,
125}
126
127mod block;
128mod forward;
129pub mod init;
130mod merge;
131mod rope;
132
133pub use init::GlmVitGeometry;
134pub use rope::{block_major_position_ids, build_axial_rope_tables};