#[inline]
pub fn is_vision_tensor_pattern(tensor_name: &str) -> bool {
tensor_name.contains("model.visual.")
|| tensor_name.contains("vision_tower.")
|| tensor_name.contains("vision_model.")
|| tensor_name.contains("vit.")
|| tensor_name.starts_with("visual.")
|| tensor_name.contains(".visual.")
|| tensor_name.contains("embed_vision")
|| tensor_name.starts_with("v.")
|| tensor_name.starts_with("mm.")
}
#[inline]
pub fn is_audio_tensor_pattern(tensor_name: &str) -> bool {
tensor_name.contains("audio_tower")
|| tensor_name.contains("audio_model.")
|| tensor_name.contains("whisper.")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn vision_matches_model_visual_dot() {
assert!(is_vision_tensor_pattern("model.visual.patch_embd.weight"));
assert!(is_vision_tensor_pattern(
"model.visual.blocks.0.attn_q.weight"
));
}
#[test]
fn vision_matches_vision_tower_dot() {
assert!(is_vision_tensor_pattern(
"vision_tower.vision_model.embeddings"
));
assert!(is_vision_tensor_pattern(
"language_model.vision_tower.patch_embd"
));
}
#[test]
fn vision_matches_vision_model_dot() {
assert!(is_vision_tensor_pattern(
"vision_model.encoder.layers.0.attn.q"
));
}
#[test]
fn vision_matches_vit_dot() {
assert!(is_vision_tensor_pattern("vit.patch_embd.weight"));
assert!(is_vision_tensor_pattern("model.vit.blocks.0.norm1.weight"));
}
#[test]
fn vision_matches_visual_prefix() {
assert!(is_vision_tensor_pattern("visual.patch_embed.weight"));
assert!(is_vision_tensor_pattern("visual.blocks.0.attn.q.weight"));
}
#[test]
fn vision_matches_dot_visual_dot() {
assert!(is_vision_tensor_pattern("qwen3vl.visual.norm.weight"));
assert!(is_vision_tensor_pattern("clip.visual.embeddings"));
}
#[test]
fn vision_does_not_match_text_paths() {
assert!(!is_vision_tensor_pattern("blk.0.attn_q.weight"));
assert!(!is_vision_tensor_pattern("token_embd.weight"));
assert!(!is_vision_tensor_pattern("output_norm.weight"));
assert!(!is_vision_tensor_pattern("visualization_weight"));
assert!(!is_vision_tensor_pattern("blk.0.vitamin.weight"));
}
#[test]
fn vision_matches_embed_vision_codex_0d28ae3f() {
assert!(is_vision_tensor_pattern("model.embed_vision.weight"));
assert!(is_vision_tensor_pattern("model.embed_vision.norm.weight"));
}
#[test]
fn audio_matches_audio_tower_dot() {
assert!(is_audio_tensor_pattern("audio_tower.encoder.layers.0.attn"));
assert!(is_audio_tensor_pattern("model.audio_tower.proj.weight"));
}
#[test]
fn audio_matches_audio_tower_no_dot_codex_0d28ae3f() {
assert!(is_audio_tensor_pattern("model.audio_tower_proj.weight"));
assert!(is_audio_tensor_pattern("audio_tower_v2.encoder"));
}
#[test]
fn audio_matches_audio_model_dot() {
assert!(is_audio_tensor_pattern("audio_model.embeddings.weight"));
}
#[test]
fn audio_matches_whisper_dot() {
assert!(is_audio_tensor_pattern("whisper.encoder.layers.0.attn"));
assert!(is_audio_tensor_pattern("model.audio_tower.whisper.proj"));
}
#[test]
fn audio_does_not_match_text_paths() {
assert!(!is_audio_tensor_pattern("blk.0.attn_q.weight"));
assert!(!is_audio_tensor_pattern("token_embd.weight"));
assert!(!is_audio_tensor_pattern("blk.0.audio_weight"));
assert!(!is_audio_tensor_pattern("blk.0.whispering.weight"));
}
#[test]
fn combined_gate_for_dispatcher() {
let go_through_policy =
|name: &str| !(is_vision_tensor_pattern(name) || is_audio_tensor_pattern(name));
assert!(go_through_policy("blk.0.attn_q.weight"));
assert!(!go_through_policy("vision_tower.encoder.q"));
assert!(!go_through_policy("audio_tower.encoder.q"));
assert!(!go_through_policy("whisper.encoder.q"));
assert!(!go_through_policy("model.visual.patch_embd"));
}
}