char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
7798007a2
char/aliceai-t5-moe
1#pragma once 2 3#include "ggml.h" 4#include "clip.h" 5#include "clip-impl.h" 6 7#include <algorithm> 8#include <array> 9#include <vector> 10#include <unordered_set> 11#include <cstdint> 12#include <cmath> 13 14enum ffn_op_type { 15FFN_GELU , 16FFN_GELU_ERF , 17FFN_SILU , 18FFN_GELU_QUICK , 19FFN_RELU_SQR , 20}; 21 22enum norm_type { 23NORM_TYPE_NORMAL , 24NORM_TYPE_RMS , 25}; 26 27enum patch_merge_type { 28PATCH_MERGE_FLAT , 29PATCH_MERGE_SPATIAL_UNPAD , 30}; 31 32// all algos are Pillow-compatible (matching PIL.Image.resize output) 33enum resize_algo { 34RESIZE_ALGO_BILINEAR , 35RESIZE_ALGO_BICUBIC , 36RESIZE_ALGO_LANCZOS , 37}; 38 39// Padding style for img_tool::resize 40// PAD_NONE - no padding; direct resize to target dimensions 41// PAD_CEIL - aspect-preserving pad (default) 42// PAD_NEAREST - aspect-preserving pad with nearest-integer rounding (Pillow byte-parity) 43enum pad_style { 44PAD_NONE , 45PAD_CEIL , 46PAD_NEAREST , 47}; 48 49struct clip_hparams { 50int32_t image_size = 0 ; 51int32_t patch_size = 0 ; 52int32_t n_embd = 0 ; 53int32_t n_ff = 0 ; 54int32_t projection_dim = 0 ; 55int32_t n_head = 0 ; 56int32_t n_head_kv = 0 ; 57// 0 = derive from n_embd; set when qkv width != n_embd 58int32_t n_embd_head = 0 ; 59int32_t n_layer = 0 ; 60int32_t n_merge = 1 ;// number of patch merges **per-side** 61 62// for preprocessor 63int32_t image_longest_edge = 0 ; 64int32_t image_min_pixels = -1 ; 65int32_t image_max_pixels = -1 ; 66resize_algo image_resize_algo = RESIZE_ALGO_BICUBIC ; 67pad_style image_resize_pad = PAD_CEIL ;// padding style when resizing 68std ::array < uint8_t ,3 > image_pad_color = {0 ,0 ,0 }; 69 70// (preprocessor) for llava-uhd style models 71std ::vector < clip_image_size > image_res_candidates ; 72int32_t preproc_min_tiles = 0 ; 73int32_t preproc_max_tiles = 0 ; 74int32_t preproc_tile_size = 0 ;// local tile size (deepseek-ocr) 75resize_algo image_resize_algo_rf = RESIZE_ALGO_BICUBIC ; 76resize_algo image_resize_algo_ov = RESIZE_ALGO_BICUBIC ; 77pad_style image_pad_rf = PAD_CEIL ;// padding style for the refined image (e.g. llava-1.6) 78pad_style image_pad_ov = PAD_NONE ;// padding style for the overview image (e.g. llava-1.6) 79std ::array < uint8_t ,3 > image_pad_color_rf = {0 ,0 ,0 };// padding color for refined image 80std ::array < uint8_t ,3 > image_pad_color_ov = {0 ,0 ,0 };// padding color for overview image 81 82float image_mean [3 ]; 83float image_std [3 ]; 84 85// for models using dynamic image size, we need to have a smaller image size to warmup 86// otherwise, user will get OOM every time they load the model 87int32_t warmup_image_size = 0 ; 88int32_t warmup_audio_size = 3000 ; 89 90ffn_op_type ffn_op = FFN_GELU ; 91 92patch_merge_type mm_patch_merge_type = PATCH_MERGE_FLAT ; 93 94float eps = 1e-6 ; 95float rope_theta = 0.0 ; 96int32_t n_expert_used = 0 ; 97std ::vector < int32_t > feature_layers ; 98int32_t attn_window_size = 0 ; 99int32_t n_wa_pattern = 0 ; 100std ::unordered_set < int32_t > wa_layer_indexes ;// explicit layer indexes that use full attention (for irregular patterns like YoutuVL) 101std ::vector < int32_t > wa_pattern_mode ;// mimovl: per-layer window-attention mode 102 103// deepseek4v: resize solver caps the LLM token count of the aligner grid 104int32_t dsv4_max_n_token = 0 ; 105int32_t dsv4_max_wh_ratio = 0 ; 106 107// deepseek-ocr (sam) 108int32_t sam_n_layer = 0 ; 109int32_t sam_n_head = 0 ; 110int32_t sam_n_embd = 0 ; 111 112// Granite4 Vision 113std ::vector < int32_t > proj_spatial_offsets ; 114int32_t downsample_query_side ; 115int32_t downsample_window_side ; 116 117// Muse Glimmer vision (per-block sparse-window pattern, learned pos-emb, patch-temporal) 118// NOTE: these perhaps shouldn't have the architecture prefix 119int32_t muse_glimmer_patch_temporal = 0 ; 120int32_t muse_glimmer_sparse_factor = 0 ; 121 122// audio 123int32_t n_mel_bins = 0 ;// whisper preprocessor 124int32_t proj_stack_factor = 0 ;// ultravox 125int32_t subsampling_factor = 0 ;// parakeet 126 127int32_t audio_chunk_size = 0 ; 128int32_t audio_conv_kernel_size = 0 ; 129int32_t audio_max_pos_emb = 0 ; 130int32_t audio_proj_window_size = 0 ; 131int32_t audio_proj_downsample_rate = 0 ; 132int32_t audio_proj_head_count = 0 ; 133 134// audio-to-mel preprocessor params 135int32_t audio_chunk_len = -1 ;// in seconds 136int32_t audio_sample_rate = -1 ; 137int32_t audio_n_fft = -1 ; 138int32_t audio_window_len = -1 ; 139int32_t audio_hop_len = -1 ; 140 141// parakeet 142std ::vector < float > mel_filters ; 143std ::vector < float > window ; 144 145// mimo-audio-tokenizer: residual vector quantizer 146int32_t rvq_num_quantizers = 0 ; 147std ::vector < int32_t > rvq_codebook_size ;// per-quantizer bin count (ragged, e.g. 1024/1024/256/128x17) 148 149// threshold for the "out_eos_score" graph output 150float gen_eos_threshold = 0.0f ; 151 152// name of the weight variant, some pipelines tune themselves on it 153std ::string gen_model_variant ; 154 155// pocket-tts 156static constexprint32_t pockettts_max_spk_seconds = 30 ; 157int32_t seanet_n_stage = 0 ; 158std ::vector < int32_t > seanet_ratios ;// encoder order (reversed compared to the config) 159int32_t mimi_downsample = 0 ;// encoder frame rate / model frame rate 160int32_t mimi_tfm_context = 0 ;// attention window of the mimi transformers, in frames 161int32_t flow_n_step = 1 ;// lsd_decode steps 162 163// qwen3tts code2wav 164int32_t wav_tfm_n_layer = 0 ; 165int32_t wav_tfm_n_embd = 0 ; 166int32_t wav_tfm_n_ff = 0 ; 167int32_t wav_tfm_n_head = 0 ; 168int32_t wav_tfm_n_head_kv = 0 ; 169float wav_tfm_eps = 1e-5f ; 170float wav_tfm_rope_theta = 10000.0f ; 171int32_t wav_upsample_n_block = 0 ; 172int32_t wav_dac_n_block = 0 ; 173int32_t wav_dac_n_res = 0 ; 174int32_t wav_tfm_swa = 0 ;// pre_transformer's KV cache size, in frames 175 176// mimo-v2.5: LLM-side connector (input_local_transformer) 177int32_t audio_local_n_layer = 0 ; 178int32_t audio_local_group_size = 0 ; 179 180// legacy 181bool has_llava_projector = false; 182int minicpmv_version = 0 ; 183int32_t minicpmv_query_num = 0 ;// MiniCPM-V query number 184int32_t insert_layer_id = 0 ;// MiniCPM-V 4.6 ViT merger insertion layer 185 186// custom value provided by user, can be undefined if not set 187int32_t custom_image_min_tokens = -1 ; 188int32_t custom_image_max_tokens = -1 ; 189 190void set_limit_image_tokens (int n_tokens_min ,int n_tokens_max ) { 191const int patch_area = patch_size * patch_size * n_merge * n_merge ; 192image_min_pixels = (custom_image_min_tokens > 0 ?custom_image_min_tokens :n_tokens_min )* patch_area ; 193image_max_pixels = (custom_image_max_tokens > 0 ?custom_image_max_tokens :n_tokens_max )* patch_area ; 194warmup_image_size = static_cast < int > (std ::sqrt (image_max_pixels )); 195 } 196 197// used by longest_edge preprocessor (no model-specific value for min/max tokens) 198void set_limit_image_tokens () { 199const int patch_area = patch_size * patch_size * n_merge * n_merge ; 200if (custom_image_min_tokens > 0 ) { 201image_min_pixels = custom_image_min_tokens * patch_area ; 202 } 203if (custom_image_max_tokens > 0 ) { 204image_max_pixels = custom_image_max_tokens * patch_area ; 205 } 206 } 207 208void set_warmup_n_tokens (int n_tokens ) { 209int n_tok_per_side = static_cast < int > (std ::sqrt (n_tokens )); 210GGML_ASSERT (n_tok_per_side * n_tok_per_side == n_tokens && "n_tokens must be n*n" ); 211warmup_image_size = n_tok_per_side * patch_size * n_merge ; 212// TODO: support warmup size for custom token numbers 213 } 214// sam vit deepseek-ocr 215std ::vector < int32_t > global_attn_indices ()const { 216return {2 ,5 ,8 ,11 }; 217 } 218bool is_global_attn (int32_t layer )const { 219const autoindices = global_attn_indices (); 220 221for (const auto& idx :indices ) { 222if (layer == idx ) { 223return true; 224 } 225 } 226 227return false; 228 } 229 230bool is_feature_layer (int32_t layer )const { 231return std ::find (feature_layers .begin (),feature_layers .end (),layer )!= feature_layers .end (); 232 } 233}; 234 235struct clip_layer { 236// layernorm 1 (or layer input norm, or pre-attention norm) 237ggml_tensor * ln_1_w = nullptr; 238ggml_tensor * ln_1_b = nullptr; 239 240// attention 241ggml_tensor * k_w = nullptr; 242ggml_tensor * k_b = nullptr; 243ggml_tensor * q_w = nullptr; 244ggml_tensor * q_b = nullptr; 245ggml_tensor * v_w = nullptr; 246ggml_tensor * v_b = nullptr; 247ggml_tensor * qkv_w = nullptr; 248ggml_tensor * qkv_b = nullptr; 249 250ggml_tensor * o_w = nullptr; 251ggml_tensor * o_b = nullptr; 252 253ggml_tensor * attn_sinks = nullptr; 254 255ggml_tensor * k_norm = nullptr; 256ggml_tensor * q_norm = nullptr; 257 258ggml_tensor * attn_post_norm_w = nullptr; 259 260ggml_tensor * ff_up_w = nullptr; 261ggml_tensor * ff_up_b = nullptr; 262ggml_tensor * ff_gate_w = nullptr; 263ggml_tensor * ff_gate_b = nullptr; 264ggml_tensor * ff_down_w = nullptr; 265ggml_tensor * ff_down_b = nullptr; 266 267// MoE FFN (dots3note vision pyramid blocks) 268ggml_tensor * ff_gate_inp_w = nullptr; 269ggml_tensor * ff_gate_exps_w = nullptr; 270ggml_tensor * ff_up_exps_w = nullptr; 271ggml_tensor * ff_down_exps_w = nullptr; 272ggml_tensor * ff_exp_probs_b = nullptr; 273 274// layernorm 2 (or pre-FFN norm) 275ggml_tensor * ln_2_w = nullptr; 276ggml_tensor * ln_2_b = nullptr; 277 278ggml_tensor * ff_post_norm_w = nullptr; 279 280// layer scale (no bias) 281ggml_tensor * ls_1_w = nullptr; 282ggml_tensor * ls_2_w = nullptr; 283ggml_tensor * ls_out_w = nullptr;// gemma4 284 285// qwen3vl deepstack merger 286ggml_tensor * deepstack_norm_w = nullptr; 287ggml_tensor * deepstack_norm_b = nullptr; 288ggml_tensor * deepstack_fc1_w = nullptr; 289ggml_tensor * deepstack_fc1_b = nullptr; 290ggml_tensor * deepstack_fc2_w = nullptr; 291ggml_tensor * deepstack_fc2_b = nullptr; 292 293// sam rel_pos 294ggml_tensor * rel_pos_w = nullptr; 295ggml_tensor * rel_pos_h = nullptr; 296// lfm2 297ggml_tensor * ff_norm_w = nullptr; 298ggml_tensor * ff_norm_b = nullptr; 299ggml_tensor * ff_norm_1_w = nullptr; 300ggml_tensor * ff_norm_1_b = nullptr; 301ggml_tensor * ff_up_1_w = nullptr; 302ggml_tensor * ff_up_1_b = nullptr; 303ggml_tensor * ff_down_1_w = nullptr; 304ggml_tensor * ff_down_1_b = nullptr; 305ggml_tensor * pos_bias_u = nullptr; 306ggml_tensor * pos_bias_v = nullptr; 307ggml_tensor * norm_conv_w = nullptr; 308ggml_tensor * norm_conv_b = nullptr; 309ggml_tensor * linear_pos_w = nullptr; 310 311ggml_tensor * conv_norm_w = nullptr; 312ggml_tensor * conv_norm_b = nullptr; 313ggml_tensor * conv_norm_mean = nullptr;// parakeet 314ggml_tensor * conv_norm_var = nullptr;// parakeet 315ggml_tensor * conv_dw_w = nullptr; 316ggml_tensor * conv_dw_b = nullptr; 317ggml_tensor * conv_pw1_w = nullptr; 318ggml_tensor * conv_pw1_b = nullptr; 319ggml_tensor * conv_pw2_w = nullptr; 320ggml_tensor * conv_pw2_b = nullptr; 321 322// gemma4 audio conformer per-layer 323ggml_tensor * attn_pre_norm_w = nullptr; 324ggml_tensor * attn_k_rel_w = nullptr; 325ggml_tensor * per_dim_scale_w = nullptr; 326ggml_tensor * per_dim_k_scale_w = nullptr; 327ggml_tensor * ff_post_norm_1_w = nullptr; 328 329// granite_speech conformer per-layer 330ggml_tensor * attn_rel_pos_emb = nullptr; 331 332// granite_speech qformer cross-attention 333ggml_tensor * cross_attn_q_w = nullptr; 334ggml_tensor * cross_attn_q_b = nullptr; 335ggml_tensor * cross_attn_k_w = nullptr; 336ggml_tensor * cross_attn_k_b = nullptr; 337ggml_tensor * cross_attn_v_w = nullptr; 338ggml_tensor * cross_attn_v_b = nullptr; 339ggml_tensor * cross_attn_o_w = nullptr; 340ggml_tensor * cross_attn_o_b = nullptr; 341ggml_tensor * cross_attn_norm_w = nullptr; 342ggml_tensor * cross_attn_norm_b = nullptr; 343 344// qwen3tts speaker encoder: SE-Res2Net block, tdnn1/tdnn2 reuse conv_pw1_w/b and conv_pw2_w/b above 345ggml_tensor * se_conv1_w = nullptr; 346ggml_tensor * se_conv1_b = nullptr; 347ggml_tensor * se_conv2_w = nullptr; 348ggml_tensor * se_conv2_b = nullptr; 349std ::vector < ggml_tensor *> res2_conv_w ;// Res2Net hierarchical branches 350std ::vector < ggml_tensor *> res2_conv_b ; 351 352bool has_deepstack ()const { 353return deepstack_fc1_w != nullptr; 354 } 355}; 356 357// Expanded MobileNetV5 block structure for Gemma3n vision encoder 358struct mobilenetv5_block { 359// Stage 0 (Edge Residual) 360ggml_tensor * s0_conv_exp_w = nullptr; 361ggml_tensor * s0_bn1_w = nullptr; 362ggml_tensor * s0_conv_pwl_w = nullptr; 363ggml_tensor * s0_bn2_w = nullptr; 364 365// Stage 1+ (Universal Inverted Residual) 366ggml_tensor * dw_start_w = nullptr; 367ggml_tensor * dw_start_bn_w = nullptr; 368 369ggml_tensor * pw_exp_w = nullptr; 370ggml_tensor * pw_exp_bn_w = nullptr; 371 372ggml_tensor * dw_mid_w = nullptr; 373ggml_tensor * dw_mid_bn_w = nullptr; 374 375ggml_tensor * pw_proj_w = nullptr; 376ggml_tensor * pw_proj_bn_w = nullptr; 377 378ggml_tensor * layer_scale_w = nullptr; 379 380// Attention (MQA) components 381ggml_tensor * attn_q_w = nullptr; 382ggml_tensor * attn_k_w = nullptr; 383ggml_tensor * attn_v_w = nullptr; 384ggml_tensor * attn_o_w = nullptr; 385 386// Optional downsampling/norm in attention 387ggml_tensor * attn_k_dw_w = nullptr; 388ggml_tensor * attn_k_norm_w = nullptr; 389ggml_tensor * attn_v_dw_w = nullptr; 390ggml_tensor * attn_v_norm_w = nullptr; 391 392// Block norm (often present in attention blocks) 393ggml_tensor * attn_norm_w = nullptr; 394}; 395 396struct yasa2_block { 397ggml_tensor * dw_w = nullptr; 398ggml_tensor * dw_b = nullptr; 399ggml_tensor * ln_w = nullptr; 400ggml_tensor * ln_b = nullptr; 401ggml_tensor * pw1_w = nullptr; 402ggml_tensor * pw1_b = nullptr; 403ggml_tensor * grn_w = nullptr; 404ggml_tensor * grn_b = nullptr; 405ggml_tensor * pw2_w = nullptr; 406ggml_tensor * pw2_b = nullptr; 407}; 408 409struct yasa2_stage { 410ggml_tensor * down_ln_w = nullptr; 411ggml_tensor * down_ln_b = nullptr; 412ggml_tensor * down_conv_w = nullptr; 413ggml_tensor * down_conv_b = nullptr; 414std ::vector < yasa2_block > blocks ; 415}; 416 417// QFormer projector block for models with 1 (or more) QFormer projectors 418// Granite Speech, Granite4 Vision 419struct qf_block { 420ggml_tensor * qf_proj_query = nullptr; 421ggml_tensor * qf_proj_norm_w = nullptr; 422ggml_tensor * qf_proj_norm_b = nullptr; 423ggml_tensor * qf_proj_linear_w = nullptr; 424ggml_tensor * qf_proj_linear_b = nullptr; 425ggml_tensor * qf_proj_post_norm_w = nullptr; 426ggml_tensor * qf_proj_post_norm_b = nullptr; 427ggml_tensor * qf_proj_img_pos = nullptr;// Vision only 428std ::vector < clip_layer > qf_proj_layers ; 429}; 430 431// pocket-tts SEANet stack, used in both directions: 432// encoder = conv_in -> per stage (residual unit, strided conv) -> conv_out 433// decoder = conv_in -> per stage (strided convtr, residual unit) -> conv_out 434struct clip_seanet { 435// one residual unit: ELU -> dilated conv -> ELU -> pointwise conv, added to the input 436struct stage { 437ggml_tensor * res_conv1_w = nullptr; 438ggml_tensor * res_conv1_b = nullptr; 439ggml_tensor * res_conv2_w = nullptr; 440ggml_tensor * res_conv2_b = nullptr; 441ggml_tensor * scale_conv_w = nullptr;// strided conv (encoder) or convtr (decoder) 442ggml_tensor * scale_conv_b = nullptr; 443 }; 444 445ggml_tensor * conv_in_w = nullptr; 446ggml_tensor * conv_in_b = nullptr; 447ggml_tensor * conv_out_w = nullptr; 448ggml_tensor * conv_out_b = nullptr; 449std ::vector < stage > stages ; 450}; 451 452// pocket-tts flow-matching decoder (SimpleMLPAdaLN) 453struct clip_flow_net { 454// AdaLN res block: in_ln -> modulate -> Linear -> SiLU -> Linear, gated residual 455struct block { 456ggml_tensor * norm_w = nullptr; 457ggml_tensor * norm_b = nullptr; 458ggml_tensor * up_w = nullptr; 459ggml_tensor * up_b = nullptr; 460ggml_tensor * down_w = nullptr; 461ggml_tensor * down_b = nullptr; 462ggml_tensor * ada_w = nullptr;// -> shift, scale, gate 463ggml_tensor * ada_b = nullptr; 464 }; 465 466// timestep embedder: cos/sin(t * freqs) -> Linear -> SiLU -> Linear -> RMSNorm 467struct time_embd { 468ggml_tensor * freqs = nullptr; 469ggml_tensor * up_w = nullptr; 470ggml_tensor * up_b = nullptr; 471ggml_tensor * down_w = nullptr; 472ggml_tensor * down_b = nullptr; 473ggml_tensor * norm = nullptr;// RMSNorm alpha 474 }; 475 476ggml_tensor * input_proj_w = nullptr; 477ggml_tensor * input_proj_b = nullptr; 478ggml_tensor * cond_embd_w = nullptr; 479ggml_tensor * cond_embd_b = nullptr; 480ggml_tensor * final_ada_w = nullptr;// -> shift, scale 481ggml_tensor * final_ada_b = nullptr; 482ggml_tensor * final_proj_w = nullptr; 483ggml_tensor * final_proj_b = nullptr; 484std ::vector < time_embd > time ; 485std ::vector < block > blocks ; 486}; 487 488// qwen3tts code2wav: RVQ codes -> raw PCM 489struct clip_code2wav { 490// "upsample" stage: one ConvNeXt block plus the causal ConvTranspose1d before it 491struct upsample_block { 492ggml_tensor * conv_w = nullptr;// causal ConvTranspose1d, 2x 493ggml_tensor * conv_b = nullptr; 494ggml_tensor * dwconv_w = nullptr;// depthwise causal conv, k=7 495ggml_tensor * dwconv_b = nullptr; 496ggml_tensor * norm_w = nullptr;// LayerNorm 497ggml_tensor * norm_b = nullptr; 498ggml_tensor * pw1_w = nullptr;// pointwise expand 499ggml_tensor * pw1_b = nullptr; 500ggml_tensor * pw2_w = nullptr;// pointwise project 501ggml_tensor * pw2_b = nullptr; 502ggml_tensor * gamma = nullptr;// layer scale 503 }; 504 505// one DAC residual unit: SnakeBeta -> dilated causal conv -> SnakeBeta -> pointwise causal conv 506struct dac_res { 507ggml_tensor * act1_alpha = nullptr; 508ggml_tensor * act1_beta = nullptr; 509ggml_tensor * conv1_w = nullptr; 510ggml_tensor * conv1_b = nullptr; 511ggml_tensor * act2_alpha = nullptr; 512ggml_tensor * act2_beta = nullptr; 513ggml_tensor * conv2_w = nullptr; 514ggml_tensor * conv2_b = nullptr; 515 }; 516 517// one DAC upsample block (SnakeBeta -> causal ConvTranspose1d -> 3 residual units) 518struct dac_block { 519ggml_tensor * snake_alpha = nullptr; 520ggml_tensor * snake_beta = nullptr; 521ggml_tensor * conv_w = nullptr;// causal ConvTranspose1d 522ggml_tensor * conv_b = nullptr; 523std ::vector < dac_res > res ; 524 }; 525 526// quantizer: RVQ codebook decode 527ggml_tensor * quant_first_in_w = nullptr;// semantic RVQ, in_proj (1x1 conv, loaded as 2D) 528ggml_tensor * quant_first_out_w = nullptr; 529ggml_tensor * quant_first_cb_w = nullptr;// codebook (1 layer) 530ggml_tensor * quant_rest_in_w = nullptr;// acoustic RVQ 531ggml_tensor * quant_rest_out_w = nullptr; 532ggml_tensor * quant_rest_cb_w = nullptr;// codebooks, merged 3D [15, vocab, dim] 533 534ggml_tensor * pre_conv_w = nullptr; 535ggml_tensor * pre_conv_b = nullptr; 536 537ggml_tensor * tfm_in_proj_w = nullptr; 538ggml_tensor * tfm_in_proj_b = nullptr; 539ggml_tensor * tfm_out_proj_w = nullptr; 540ggml_tensor * tfm_out_proj_b = nullptr; 541ggml_tensor * tfm_output_norm_w = nullptr; 542std ::vector < clip_layer > tfm_layers ;// reuses the generic block fields (ln_1/attn/ln_2/ffn/ls_1/ls_2) 543 544std ::vector < upsample_block > upsample ; 545 546ggml_tensor * dac_entry_w = nullptr; 547ggml_tensor * dac_entry_b = nullptr; 548std ::vector < dac_block > dac ; 549ggml_tensor * dac_post_snake_alpha = nullptr; 550ggml_tensor * dac_post_snake_beta = nullptr; 551ggml_tensor * dac_post_conv_w = nullptr; 552ggml_tensor * dac_post_conv_b = nullptr; 553}; 554 555struct clip_model { 556clip_modality modality = CLIP_MODALITY_VISION ; 557projector_type proj_type = PROJECTOR_TYPE_MLP ; 558clip_hparams hparams ; 559 560// embeddings 561ggml_tensor * class_embedding = nullptr; 562ggml_tensor * patch_embeddings_0 = nullptr; 563ggml_tensor * patch_embeddings_1 = nullptr;// second Conv2D kernel when we decouple Conv3D along temporal dimension (Qwen2VL) 564ggml_tensor * patch_bias = nullptr; 565ggml_tensor * position_embeddings = nullptr; 566ggml_tensor * norm_embd_w = nullptr; 567ggml_tensor * norm_embd_b = nullptr; 568 569// "indexed" patch embedding norms 570ggml_tensor * patch_norm_1_w = nullptr; 571ggml_tensor * patch_norm_1_b = nullptr; 572ggml_tensor * patch_norm_2_w = nullptr; 573ggml_tensor * patch_norm_2_b = nullptr; 574ggml_tensor * patch_norm_3_w = nullptr; 575ggml_tensor * patch_norm_3_b = nullptr; 576 577ggml_tensor * pre_ln_w = nullptr; 578ggml_tensor * pre_ln_b = nullptr; 579 580std ::vector < clip_layer > layers ; 581 582int32_t n_deepstack_layers = 0 ;// used by Qwen3-VL, calculated from clip_layer 583 584ggml_tensor * post_ln_w ; 585ggml_tensor * post_ln_b ; 586 587ggml_tensor * mm_fc_w ; 588ggml_tensor * mm_fc_b ; 589ggml_tensor * mm_ffn_up_w = nullptr; 590ggml_tensor * mm_ffn_up_b = nullptr; 591ggml_tensor * mm_ffn_gate_w = nullptr; 592ggml_tensor * mm_ffn_gate_b = nullptr; 593ggml_tensor * mm_ffn_down_w = nullptr; 594ggml_tensor * mm_ffn_down_b = nullptr; 595ggml_tensor * mm_post_norm_w = nullptr; 596ggml_tensor * mm_post_norm_b = nullptr; 597 598// LLaVA projection 599ggml_tensor * mm_input_norm_w = nullptr; 600ggml_tensor * mm_input_norm_b = nullptr; 601ggml_tensor * mm_0_w = nullptr; 602ggml_tensor * mm_0_b = nullptr; 603ggml_tensor * mm_2_w = nullptr; 604ggml_tensor * mm_2_b = nullptr; 605ggml_tensor * mm_merger_fc1_w = nullptr;// minimax-m3 606ggml_tensor * mm_merger_fc1_b = nullptr; 607ggml_tensor * mm_merger_fc2_w = nullptr; 608ggml_tensor * mm_merger_fc2_b = nullptr; 609 610ggml_tensor * image_newline = nullptr; 611ggml_tensor * view_seperator = nullptr; 612 613 614// Yi type models with mlp+normalization projection 615ggml_tensor * mm_1_w = nullptr;// Yi type models have 0, 1, 3, 4 616ggml_tensor * mm_1_b = nullptr; 617ggml_tensor * mm_3_w = nullptr; 618ggml_tensor * mm_3_b = nullptr; 619ggml_tensor * mm_4_w = nullptr; 620ggml_tensor * mm_4_b = nullptr; 621 622// GLMV-Edge projection 623ggml_tensor * mm_model_adapter_conv_w = nullptr; 624ggml_tensor * mm_model_adapter_conv_b = nullptr; 625 626// MobileVLM projection 627ggml_tensor * mm_model_mlp_1_w = nullptr; 628ggml_tensor * mm_model_mlp_1_b = nullptr; 629ggml_tensor * mm_model_mlp_3_w = nullptr; 630ggml_tensor * mm_model_mlp_3_b = nullptr; 631ggml_tensor * mm_model_block_1_block_0_0_w = nullptr; 632ggml_tensor * mm_model_block_1_block_0_1_w = nullptr; 633ggml_tensor * mm_model_block_1_block_0_1_b = nullptr; 634ggml_tensor * mm_model_block_1_block_1_fc1_w = nullptr; 635ggml_tensor * mm_model_block_1_block_1_fc1_b = nullptr; 636ggml_tensor * mm_model_block_1_block_1_fc2_w = nullptr; 637ggml_tensor * mm_model_block_1_block_1_fc2_b = nullptr; 638ggml_tensor * mm_model_block_1_block_2_0_w = nullptr; 639ggml_tensor * mm_model_block_1_block_2_1_w = nullptr; 640ggml_tensor * mm_model_block_1_block_2_1_b = nullptr; 641ggml_tensor * mm_model_block_2_block_0_0_w = nullptr; 642ggml_tensor * mm_model_block_2_block_0_1_w = nullptr; 643ggml_tensor * mm_model_block_2_block_0_1_b = nullptr; 644ggml_tensor * mm_model_block_2_block_1_fc1_w = nullptr; 645ggml_tensor * mm_model_block_2_block_1_fc1_b = nullptr; 646ggml_tensor * mm_model_block_2_block_1_fc2_w = nullptr; 647ggml_tensor * mm_model_block_2_block_1_fc2_b = nullptr; 648ggml_tensor * mm_model_block_2_block_2_0_w = nullptr; 649ggml_tensor * mm_model_block_2_block_2_1_w = nullptr; 650ggml_tensor * mm_model_block_2_block_2_1_b = nullptr; 651 652// MobileVLM_V2 projection 653ggml_tensor * mm_model_mlp_0_w = nullptr; 654ggml_tensor * mm_model_mlp_0_b = nullptr; 655ggml_tensor * mm_model_mlp_2_w = nullptr; 656ggml_tensor * mm_model_mlp_2_b = nullptr; 657ggml_tensor * mm_model_peg_0_w = nullptr; 658ggml_tensor * mm_model_peg_0_b = nullptr; 659 660// MINICPMV projection 661ggml_tensor * mm_model_pos_embed_k = nullptr; 662ggml_tensor * mm_model_query = nullptr; 663ggml_tensor * mm_model_proj = nullptr; 664ggml_tensor * mm_model_proj_b = nullptr; 665ggml_tensor * mm_model_kv_proj = nullptr; 666ggml_tensor * mm_model_attn_q_w = nullptr; 667ggml_tensor * mm_model_attn_q_b = nullptr; 668ggml_tensor * mm_model_attn_k_w = nullptr; 669ggml_tensor * mm_model_attn_k_b = nullptr; 670ggml_tensor * mm_model_attn_v_w = nullptr; 671ggml_tensor * mm_model_attn_v_b = nullptr; 672ggml_tensor * mm_model_attn_o_w = nullptr; 673ggml_tensor * mm_model_attn_o_b = nullptr; 674ggml_tensor * mm_model_ln_q_w = nullptr; 675ggml_tensor * mm_model_ln_q_b = nullptr; 676ggml_tensor * mm_model_ln_kv_w = nullptr; 677ggml_tensor * mm_model_ln_kv_b = nullptr; 678ggml_tensor * mm_model_ln_post_w = nullptr; 679ggml_tensor * mm_model_ln_post_b = nullptr; 680 681// MiniCPM-V 4.6 ViT merger (window self-attention + ViT MLP downsample) 682ggml_tensor * vit_merger_ln1_w = nullptr; 683ggml_tensor * vit_merger_ln1_b = nullptr; 684ggml_tensor * vit_merger_attn_q_w = nullptr; 685ggml_tensor * vit_merger_attn_q_b = nullptr; 686ggml_tensor * vit_merger_attn_k_w = nullptr; 687ggml_tensor * vit_merger_attn_k_b = nullptr; 688ggml_tensor * vit_merger_attn_v_w = nullptr; 689ggml_tensor * vit_merger_attn_v_b = nullptr; 690ggml_tensor * vit_merger_attn_o_w = nullptr; 691ggml_tensor * vit_merger_attn_o_b = nullptr; 692ggml_tensor * vit_merger_ds_ln_w = nullptr; 693ggml_tensor * vit_merger_ds_ln_b = nullptr; 694ggml_tensor * vit_merger_ds_up_w = nullptr; 695ggml_tensor * vit_merger_ds_up_b = nullptr; 696ggml_tensor * vit_merger_ds_down_w = nullptr; 697ggml_tensor * vit_merger_ds_down_b = nullptr; 698 699// gemma3 700ggml_tensor * mm_input_proj_w = nullptr; 701ggml_tensor * mm_soft_emb_norm_w = nullptr; 702 703// mobilenetv5 for gemma3n 704std ::vector < mobilenetv5_block > mobilenet_blocks ; 705std ::vector < int > mobilenet_stage_ends ; 706ggml_tensor * mobilenet_stem_conv_w = nullptr; 707ggml_tensor * mobilenet_stem_conv_b = nullptr; 708ggml_tensor * mobilenet_stem_norm_w = nullptr; 709ggml_tensor * mm_post_proj_norm_w = nullptr; 710 711// Multi-Scale Fusion Adapter (MSFA) components 712ggml_tensor * msfa_concat_conv_w = nullptr; 713ggml_tensor * msfa_concat_norm_w = nullptr; 714ggml_tensor * msfa_ffn_expand_w = nullptr; 715ggml_tensor * msfa_ffn_project_w = nullptr; 716ggml_tensor * msfa_ffn_expand_bn = nullptr; 717ggml_tensor * msfa_ffn_project_bn = nullptr; 718 719// yasa2 720ggml_tensor * yasa_patch_w = nullptr; 721ggml_tensor * yasa_patch_b = nullptr; 722ggml_tensor * yasa_patch_ln_w = nullptr; 723ggml_tensor * yasa_patch_ln_b = nullptr; 724ggml_tensor * yasa_backbone_ln_w = nullptr; 725ggml_tensor * yasa_backbone_ln_b = nullptr; 726ggml_tensor * yasa_vision_pos_embed = nullptr; 727std ::vector < yasa2_stage > yasa_stages ; 728 729// pixtral, glm4v 730ggml_tensor * token_embd_img_break = nullptr; 731 732// deepseek4v sentinel embeddings (image_newline is reused for IMAGE_NEW_LINE) 733ggml_tensor * token_embd_img_start = nullptr; 734ggml_tensor * token_embd_img_end = nullptr; 735ggml_tensor * token_embd_img_pad = nullptr; 736ggml_tensor * mm_patch_merger_w = nullptr; 737ggml_tensor * mm_patch_merger_b = nullptr; 738 739// ultravox / whisper encoder 740ggml_tensor * conv1d_1_w = nullptr; 741ggml_tensor * conv1d_1_b = nullptr; 742ggml_tensor * conv1d_2_w = nullptr; 743ggml_tensor * conv1d_2_b = nullptr; 744ggml_tensor * conv_out_w = nullptr; 745ggml_tensor * conv_out_b = nullptr; 746ggml_tensor * mm_norm_pre_w = nullptr; 747ggml_tensor * mm_norm_pre_b = nullptr; 748ggml_tensor * mm_norm_mid_w = nullptr; 749 750// mimo-audio-tokenizer: post-transformer downsample + RVQ codebook 751ggml_tensor * downsample_conv_w = nullptr;// no bias 752ggml_tensor * downsample_norm_w = nullptr; 753ggml_tensor * downsample_norm_b = nullptr; 754ggml_tensor * rvq_codebook = nullptr;// merged 3D [n_q, max_bins, dim] 755 756// mimo-v2.5: text-side RVQ code embedding ("text codebook") 757ggml_tensor * mm_a_code_embd = nullptr;// merged 3D [n_channels, vocab, dim] 758 759// mimo-v2.5: LLM-side connector (input_local_transformer, separate from the 760// audio_tokenizer's own encoder `layers`) 761std ::vector < clip_layer > mm_a_local_layers ; 762ggml_tensor * mm_a_local_norm_w = nullptr; 763 764// qwen3a 765ggml_tensor * conv2d_1_w = nullptr; 766ggml_tensor * conv2d_1_b = nullptr; 767ggml_tensor * conv2d_2_w = nullptr; 768ggml_tensor * conv2d_2_b = nullptr; 769ggml_tensor * conv2d_3_w = nullptr; 770ggml_tensor * conv2d_3_b = nullptr; 771 772// qwen3tts speaker encoder (ECAPA-TDNN) 773// reused tensors: stem conv is conv1d_1_w/b, feature aggregation is conv_out_w/b, output proj is mm_fc_w/b 774ggml_tensor * spk_asp_attn_w = nullptr; 775ggml_tensor * spk_asp_attn_b = nullptr; 776ggml_tensor * spk_asp_tdnn_w = nullptr; 777ggml_tensor * spk_asp_tdnn_b = nullptr; 778 779// qwen3tts code_predictor 780ggml_tensor * gen_code_proj_in_w = nullptr;// small_to_mtp_projection 781ggml_tensor * gen_code_proj_in_b = nullptr; 782ggml_tensor * gen_code_embd_w = nullptr;// per-codebook embedding, merged 3D 783ggml_tensor * gen_code_head_w = nullptr;// per-codebook output head, merged 3D 784ggml_tensor * gen_code_out_embd_w = nullptr;// codebook-0 embedding, fed back into the talker 785ggml_tensor * gen_code_norm_w = nullptr;// final norm 786 787// qwen3tts code2wav: RVQ codes -> raw PCM 788clip_code2wav c2w ; 789 790// pocket-tts: SEANet stack, shared by the encoder (speaker path) and the decoder (gen path) 791clip_seanet seanet ; 792 793// pocket-tts: voice latent -> backbone embd (speaker path) 794ggml_tensor * spk_proj_w = nullptr; 795ggml_tensor * downsample_w = nullptr; 796 797// pocket-tts: flow-matching decoder, backbone hidden state -> next latent 798clip_flow_net flow ; 799ggml_tensor * gen_out_eos_w = nullptr; 800ggml_tensor * gen_out_eos_b = nullptr; 801ggml_tensor * gen_input_lin_w = nullptr;// latent -> backbone embd 802ggml_tensor * gen_emb_mean = nullptr; 803ggml_tensor * gen_emb_std = nullptr; 804ggml_tensor * gen_quant_out_w = nullptr;// latent -> decoder dim 805ggml_tensor * gen_upsample_w = nullptr;// depthwise convtr, frame rate -> encoder frame rate 806std ::vector < clip_layer > gen_tfm_layers ;// mimi decoder_transformer 807 808// cogvlm 809ggml_tensor * mm_post_fc_norm_w = nullptr; 810ggml_tensor * mm_post_fc_norm_b = nullptr; 811ggml_tensor * mm_h_to_4h_w = nullptr; 812ggml_tensor * mm_gate_w = nullptr; 813ggml_tensor * mm_4h_to_h_w = nullptr; 814ggml_tensor * mm_boi = nullptr; 815ggml_tensor * mm_eoi = nullptr; 816 817// hunyuanvl perceiver 818ggml_tensor * mm_pre_norm_w = nullptr; 819ggml_tensor * mm_img_begin = nullptr; 820ggml_tensor * mm_img_end = nullptr; 821 822// deepseek ocr sam 823ggml_tensor * patch_embed_proj_w = nullptr; 824ggml_tensor * patch_embed_proj_b = nullptr; 825ggml_tensor * pos_embed = nullptr; 826 827ggml_tensor * neck_0_w ; 828ggml_tensor * neck_1_w ; 829ggml_tensor * neck_1_b ; 830ggml_tensor * neck_2_w ; 831ggml_tensor * neck_3_w ; 832ggml_tensor * neck_3_b ; 833ggml_tensor * net_2 ; 834ggml_tensor * net_3 ; 835 836int32_t n_sam_layers = 12 ;// used by deepseek-ocr sam encoder 837 838std ::vector < clip_layer > sam_layers ; 839 840// deepseek-ocr-2 841ggml_tensor * resample_query_768 = nullptr; 842ggml_tensor * resample_query_1024 = nullptr; 843 844// lfm2 audio 845std ::array < ggml_tensor * ,7 > pre_encode_conv_X_w = {nullptr}; 846std ::array < ggml_tensor * ,7 > pre_encode_conv_X_b = {nullptr}; 847ggml_tensor * pre_encode_out_w = nullptr; 848ggml_tensor * pre_encode_out_b = nullptr; 849 850// gemma4 851ggml_tensor * std_bias = nullptr; 852ggml_tensor * std_scale = nullptr; 853// Gemma4ClippableLinear 854struct clamp_info { 855float inp_max ; 856float inp_min ; 857float out_max ; 858float out_min ; 859 }; 860std ::map < std ::string ,clamp_info > clamp_info_map ; 861 862// gemma4 audio conformer 863std ::array < ggml_tensor * ,2 > sscp_conv_w = {nullptr}; 864std ::array < ggml_tensor * ,2 > sscp_conv_b = {nullptr}; 865std ::array < ggml_tensor * ,2 > sscp_norm_w = {nullptr}; 866ggml_tensor * sscp_inp_proj_w = nullptr; 867ggml_tensor * sscp_inp_proj_b = nullptr; 868ggml_tensor * audio_out_proj_w = nullptr; 869ggml_tensor * audio_out_proj_b = nullptr; 870 871// granite_speech encoder 872ggml_tensor * inp_proj_w = nullptr; 873ggml_tensor * inp_proj_b = nullptr; 874ggml_tensor * ctc_out_w = nullptr; 875ggml_tensor * ctc_out_b = nullptr; 876ggml_tensor * ctc_out_mid_w = nullptr; 877ggml_tensor * ctc_out_mid_b = nullptr; 878// qformer projector(s) 879std ::vector < qf_block > qf_proj_blocks ; 880 881bool audio_has_avgpool ()const { 882return proj_type == PROJECTOR_TYPE_QWEN2A 883|| proj_type == PROJECTOR_TYPE_VOXTRAL 884|| proj_type == PROJECTOR_TYPE_MUSIC_FLAMINGO ; 885 } 886 887bool audio_has_stack_frames ()const { 888return proj_type == PROJECTOR_TYPE_ULTRAVOX 889|| proj_type == PROJECTOR_TYPE_VOXTRAL 890|| proj_type == PROJECTOR_TYPE_MERALION ; 891 } 892}; 893 894const clip_hparams * clip_get_hparams (const struct clip_ctx * ctx );