@@ -130,6 +130,7 @@ const char * llm_type_name(llm_type type) {
130130 case LLM_TYPE_230B_A10B : return " 230B.A10B" ;
131131 case LLM_TYPE_235B_A22B : return " 235B.A22B" ;
132132 case LLM_TYPE_300B_A47B : return " 300B.A47B" ;
133+ case LLM_TYPE_310B_A15B : return " 310B.A15B" ;
133134 case LLM_TYPE_355B_A32B : return " 355B.A32B" ;
134135 case LLM_TYPE_E2B : return " E2B" ;
135136 case LLM_TYPE_E4B : return " E4B" ;
@@ -2339,6 +2340,22 @@ void llama_model::load_hparams(llama_model_loader & ml) {
23392340 default : type = LLM_TYPE_UNKNOWN ;
23402341 }
23412342 } break ;
2343+ case LLM_ARCH_MIMO2 :
2344+ {
2345+ ml.get_key (LLM_KV_ATTENTION_LAYERNORM_RMS_EPS , hparams.f_norm_rms_eps );
2346+
2347+ hparams.swa_type = LLAMA_SWA_TYPE_STANDARD ;
2348+
2349+ ml.get_key (LLM_KV_EXPERT_FEED_FORWARD_LENGTH , hparams.n_ff_exp );
2350+ ml.get_key (LLM_KV_ATTENTION_SLIDING_WINDOW , hparams.n_swa );
2351+ ml.get_key (LLM_KV_ROPE_FREQ_BASE_SWA , hparams.rope_freq_base_train_swa );
2352+ ml.get_key_or_arr (LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN , hparams.swa_layers , hparams.n_layer );
2353+
2354+ switch (hparams.n_layer ) {
2355+ case 48 : type = LLM_TYPE_310B_A15B ; break ;
2356+ default : type = LLM_TYPE_UNKNOWN ;
2357+ }
2358+ } break ;
23422359 default : throw std::runtime_error (" unsupported model architecture" );
23432360 }
23442361
@@ -6648,6 +6665,44 @@ bool llama_model::load_tensors(llama_model_loader & ml) {
66486665 layer.ffn_down_shexp = create_tensor (tn (LLM_TENSOR_FFN_DOWN_SHEXP , " weight" , i), { hparams.n_ff_shexp , n_embd }, 0 );
66496666 }
66506667 } break ;
6668+ case LLM_ARCH_MIMO2 :
6669+ {
6670+ tok_embd = create_tensor (tn (LLM_TENSOR_TOKEN_EMBD , " weight" ), {n_embd, n_vocab}, 0 );
6671+
6672+ // output
6673+ output_norm = create_tensor (tn (LLM_TENSOR_OUTPUT_NORM , " weight" ), {n_embd}, 0 );
6674+ output = create_tensor (tn (LLM_TENSOR_OUTPUT , " weight" ), {n_embd, n_vocab}, 0 );
6675+
6676+ for (int i = 0 ; i < n_layer; ++i) {
6677+ auto & layer = layers[i];
6678+ uint32_t n_embd_k_gqa = hparams.n_embd_k_gqa (i);
6679+ uint32_t n_embd_v_gqa = hparams.n_embd_v_gqa (i);
6680+ uint32_t n_head = hparams.n_head (i);
6681+
6682+ layer.wq = create_tensor (tn (LLM_TENSOR_ATTN_Q , " weight" , i), { n_embd, n_embd_head_k * n_head }, 0 );
6683+ layer.wk = create_tensor (tn (LLM_TENSOR_ATTN_K , " weight" , i), { n_embd, n_embd_k_gqa }, 0 );
6684+ layer.wv = create_tensor (tn (LLM_TENSOR_ATTN_V , " weight" , i), { n_embd, n_embd_v_gqa }, 0 );
6685+ layer.wo = create_tensor (tn (LLM_TENSOR_ATTN_OUT , " weight" , i), { n_embd_head_v * n_head, n_embd }, 0 );
6686+
6687+ layer.attn_norm = create_tensor (tn (LLM_TENSOR_ATTN_NORM , " weight" , i), {n_embd}, 0 );
6688+ layer.attn_sinks = create_tensor (tn (LLM_TENSOR_ATTN_SINKS , " weight" , i), {n_head}, TENSOR_NOT_REQUIRED );
6689+
6690+ layer.ffn_norm = create_tensor (tn (LLM_TENSOR_FFN_NORM , " weight" , i), {n_embd}, 0 );
6691+
6692+ // non-MoE branch
6693+ layer.ffn_gate = create_tensor (tn (LLM_TENSOR_FFN_GATE , " weight" , i), {n_embd, n_ff}, TENSOR_NOT_REQUIRED );
6694+ layer.ffn_down = create_tensor (tn (LLM_TENSOR_FFN_DOWN , " weight" , i), { n_ff, n_embd}, TENSOR_NOT_REQUIRED );
6695+ layer.ffn_up = create_tensor (tn (LLM_TENSOR_FFN_UP , " weight" , i), {n_embd, n_ff}, TENSOR_NOT_REQUIRED );
6696+
6697+ // MoE branch
6698+ int64_t n_ff_exp = hparams.n_ff_exp ;
6699+ layer.ffn_gate_inp = create_tensor (tn (LLM_TENSOR_FFN_GATE_INP , " weight" , i), {n_embd, n_expert}, TENSOR_NOT_REQUIRED );
6700+ layer.ffn_gate_exps = create_tensor (tn (LLM_TENSOR_FFN_GATE_EXPS , " weight" , i), {n_embd, n_ff_exp, n_expert}, TENSOR_NOT_REQUIRED );
6701+ layer.ffn_down_exps = create_tensor (tn (LLM_TENSOR_FFN_DOWN_EXPS , " weight" , i), {n_ff_exp, n_embd, n_expert}, TENSOR_NOT_REQUIRED );
6702+ layer.ffn_up_exps = create_tensor (tn (LLM_TENSOR_FFN_UP_EXPS , " weight" , i), {n_embd, n_ff_exp, n_expert}, TENSOR_NOT_REQUIRED );
6703+ layer.ffn_exp_probs_b = create_tensor (tn (LLM_TENSOR_FFN_EXP_PROBS_B , " bias" , i), {n_expert}, TENSOR_NOT_REQUIRED );
6704+ }
6705+ } break ;
66516706 default :
66526707 throw std::runtime_error (" unknown architecture" );
66536708 }
@@ -7710,6 +7765,10 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const {
77107765 {
77117766 llm = std::make_unique<llm_build_mistral3>(*this , params);
77127767 } break ;
7768+ case LLM_ARCH_MIMO2 :
7769+ {
7770+ llm = std::make_unique<llm_build_mimo2_iswa>(*this , params);
7771+ } break ;
77137772 default :
77147773 GGML_ABORT (" fatal error" );
77157774 }
@@ -7940,6 +7999,7 @@ llama_rope_type llama_model_rope_type(const llama_model * model) {
79407999 case LLM_ARCH_PANGU_EMBED :
79418000 case LLM_ARCH_AFMOE :
79428001 case LLM_ARCH_QWEN3NEXT :
8002+ case LLM_ARCH_MIMO2 :
79438003 return LLAMA_ROPE_TYPE_NEOX ;
79448004
79458005 case LLM_ARCH_QWEN2VL :
0 commit comments