char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
42928bc14
char/aliceai-t5-moe
1#include "models.h" 2 3std::unique_ptr < llm_graph_context > llama_model_ernie4_5_moe::build_arch_graph (const llm_graph_params & params )const { 4return std::make_unique < graph > (* this ,params ); 5} 6 7llama_model_ernie4_5_moe::graph::graph (const llama_model & model ,const llm_graph_params & params ) : 8llm_graph_context (params ) { 9const int64_t n_embd_head = hparams .n_embd_head_v (); 10 11GGML_ASSERT (n_embd_head == hparams .n_embd_head_k ()); 12GGML_ASSERT (n_embd_head == n_rot ); 13 14ggml_tensor * cur ; 15ggml_tensor * inpL ; 16 17inpL = build_inp_embd (model .tok_embd ); 18 19// inp_pos - contains the positions 20ggml_tensor * inp_pos = build_inp_pos (); 21 22auto * inp_attn = build_attn_inp_kv (); 23 24ggml_tensor * inp_out_ids = build_inp_out_ids (); 25 26GGML_ASSERT (hparams .n_moe_layer_step > 0 && "Ernie 4.5 MoE requires n_moe_layer_step > 0" ); 27for (int il = 0 ;il < n_layer ;++ il ) { 28ggml_tensor * inpSA = inpL ; 29// norm 30 { 31cur = build_norm (inpL ,model .layers [il ].attn_norm ,NULL ,LLM_NORM_RMS ,il ); 32cb (cur ,"attn_norm" ,il ); 33 } 34// self-attention 35 { 36// compute Q and K and RoPE them 37auto [Qcur ,Kcur ,Vcur ]= build_qkv (model .layers [il ],cur , 38n_embd_head ,n_head ,n_head_kv ,il ); 39 40Qcur = ggml_rope_ext (ctx0 ,Qcur ,inp_pos ,nullptr ,n_rot ,rope_type ,n_ctx_orig ,freq_base ,freq_scale , 41ext_factor ,attn_factor ,beta_fast ,beta_slow ); 42 43Kcur = ggml_rope_ext (ctx0 ,Kcur ,inp_pos ,nullptr ,n_rot ,rope_type ,n_ctx_orig ,freq_base ,freq_scale , 44ext_factor ,attn_factor ,beta_fast ,beta_slow ); 45 46cb (Qcur ,"Qcur" ,il ); 47cb (Kcur ,"Kcur" ,il ); 48cb (Vcur ,"Vcur" ,il ); 49 50cur = build_attn (inp_attn , 51model .layers [il ].wo ,NULL ,model .layers [il ].wo_s , 52Qcur ,Kcur ,Vcur ,nullptr ,nullptr ,nullptr ,1.0f /sqrtf (float (n_embd_head )),il ); 53cb (cur ,"attn_out" ,il ); 54 } 55if (il == n_layer - 1 && inp_out_ids ) { 56cur = ggml_get_rows (ctx0 ,cur ,inp_out_ids ); 57inpSA = ggml_get_rows (ctx0 ,inpSA ,inp_out_ids ); 58 } 59ggml_tensor * ffn_inp = ggml_add (ctx0 ,cur ,inpSA ); 60cb (ffn_inp ,"ffn_inp" ,il ); 61 62// feed-forward network 63bool is_moe_layer = 64static_cast < uint32_t > (il ) >=hparams .n_layer_dense_lead && (il + 1 ) %hparams .n_moe_layer_step == 0 ; 65 66if (!is_moe_layer ) { 67cur = build_norm (ffn_inp ,model .layers [il ].ffn_norm ,NULL ,LLM_NORM_RMS ,il ); 68cb (cur ,"ffn_norm" ,il ); 69 70cur = build_ffn (cur , 71model .layers [il ].ffn_up ,NULL ,NULL , 72model .layers [il ].ffn_gate ,NULL ,NULL , 73model .layers [il ].ffn_down ,NULL ,NULL , 74NULL ,LLM_FFN_SILU ,LLM_FFN_PAR ,il ); 75cb (cur ,"ffn_out" ,il ); 76 }else { 77// MoE branch 78cur = build_norm (ffn_inp ,model .layers [il ].ffn_norm ,NULL ,LLM_NORM_RMS ,il ); 79cb (cur ,"ffn_norm" ,il ); 80 81ggml_tensor * moe_out = build_moe_ffn (cur , 82model .layers [il ].ffn_gate_inp , 83model .layers [il ].ffn_up_exps , 84model .layers [il ].ffn_gate_exps , 85model .layers [il ].ffn_down_exps , 86model .layers [il ].ffn_exp_probs_b , 87n_expert ,n_expert_used , 88LLM_FFN_SILU , true, 89hparams .expert_weights_scale , 90LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX , 91il ); 92cb (moe_out ,"ffn_moe_out" ,il ); 93 94// Shared expert (if present) 95if (hparams .n_ff_shexp > 0 ) { 96ggml_tensor * ffn_shexp = 97build_ffn (cur , 98model .layers [il ].ffn_up_shexp ,NULL ,NULL , 99model .layers [il ].ffn_gate_shexp ,NULL ,NULL , 100model .layers [il ].ffn_down_shexp ,NULL ,NULL , 101NULL ,LLM_FFN_SILU ,LLM_FFN_PAR ,il ); 102cb (ffn_shexp ,"ffn_shexp" ,il ); 103 104cur = ggml_add (ctx0 ,moe_out ,ffn_shexp ); 105 }else { 106cur = moe_out ; 107 } 108cb (cur ,"ffn_out" ,il ); 109 } 110cur = ggml_add (ctx0 ,cur ,ffn_inp ); 111cb (cur ,"ffn_out" ,il ); 112 113cur = build_cvec (cur ,il ); 114cb (cur ,"l_out" ,il ); 115 116// input for next layer 117inpL = cur ; 118 } 119cur = inpL ; 120 121cur = build_norm (cur ,model .output_norm ,NULL ,LLM_NORM_RMS ,-1 ); 122 123cb (cur ,"result_norm" ,-1 ); 124res -> t_embd = cur ; 125 126// lm_head 127cur = build_lora_mm (model .output ,cur ,model .output_s ); 128 129cb (cur ,"result_output" ,-1 ); 130res -> t_logits = cur ; 131 132ggml_build_forward_expand (gf ,cur ); 133}