CoolFace
Modelpublic

Felipe97/llama-cpp-compiled

sourceHugging Faceupdated 3d agoView on Hugging Face
0likes1.1kdownloads
qwen3vlmoe.cpp191 linesDownload Raw Back to models
1#include "models.h"2 3void llama_model_qwen3vlmoe::load_arch_hparams(llama_model_loader & ml) {4    ml.get_key(LLM_KV_NUM_DEEPSTACK_LAYERS, hparams.n_deepstack_layers, false);5    ml.get_key_or_arr(LLM_KV_ROPE_DIMENSION_SECTIONS, hparams.rope_sections, 4, true);6    ml.get_key_or_arr(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp_arr, hparams.n_layer_all, false);7    ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);8 9    switch (hparams.n_layer()) {10        case 48: type = LLM_TYPE_30B_A3B; break;11        case 94: type = LLM_TYPE_235B_A22B; break;12        default: type = LLM_TYPE_UNKNOWN;13    }14}15 16void llama_model_qwen3vlmoe::load_arch_tensors(llama_model_loader &) {17    LLAMA_LOAD_LOCALS;18 19    tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0);20 21    // output22    output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0);23    output      = create_tensor(tn(LLM_TENSOR_OUTPUT,      "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED);24    // if output is NULL, init from the input tok embed25    if (output == NULL) {26        output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED);27    }28 29    for (int i = 0; i < n_layer; ++i) {30        auto & layer = layers[i];31 32        layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, 0);33 34        create_tensor_qkv(layer, i, n_embd, n_embd_head_k * n_head, n_embd_gqa, n_embd_gqa, 0);35        layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), {n_embd_head_k * n_head, n_embd}, 0);36 37        layer.attn_k_norm = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "weight", i), {n_embd_head_k}, 0);38        layer.attn_q_norm = create_tensor(tn(LLM_TENSOR_ATTN_Q_NORM, "weight", i), {n_embd_head_k}, 0);39 40        layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, 0);41 42        layer.ffn_gate_inp = create_tensor(tn(LLM_TENSOR_FFN_GATE_INP, "weight", i), {n_embd, n_expert}, 0);43 44        if (n_expert == 0) {45            throw std::runtime_error("n_expert must be > 0 for QWEN3MOE");46        }47        if (n_expert_used == 0) {48            throw std::runtime_error("n_expert_used must be > 0 for QWEN3MOE");49        }50 51        // MoE branch52        const int64_t n_ff_exp = hparams.n_ff_exp() ? hparams.n_ff_exp() : n_ff / n_expert_used;53 54        layer.ffn_gate_exps = create_tensor(tn(LLM_TENSOR_FFN_GATE_EXPS, "weight", i), {  n_embd, n_ff_exp, n_expert}, 0);55        layer.ffn_down_exps = create_tensor(tn(LLM_TENSOR_FFN_DOWN_EXPS, "weight", i), {n_ff_exp,   n_embd, n_expert}, 0);56        layer.ffn_up_exps   = create_tensor(tn(LLM_TENSOR_FFN_UP_EXPS,   "weight", i), {  n_embd, n_ff_exp, n_expert}, 0);57    }58}59 60std::unique_ptr<llm_graph_context> llama_model_qwen3vlmoe::build_arch_graph(const llm_graph_params & params) const {61    return std::make_unique<graph>(*this, params);62}63 64llama_model_qwen3vlmoe::graph::graph(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) {65    const size_t n_deepstack_layers = hparams.n_deepstack_layers;66 67    const int64_t n_embd      = hparams.n_embd;68    const int64_t n_embd_head = hparams.n_embd_head_v();69 70    GGML_ASSERT(n_embd_head == hparams.n_embd_head_k());71    GGML_ASSERT(n_embd_head == n_rot);72 73    ggml_tensor * cur;74    ggml_tensor * inpL;75 76    inpL = build_inp_embd(model.tok_embd);77 78    int sections[4];79    std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections);80 81    // inp_pos - contains the positions82    ggml_tensor * inp_pos = build_inp_pos();83 84    auto * inp_attn = build_attn_inp_kv();85 86    ggml_tensor * inp_out_ids = build_inp_out_ids();87 88    for (int il = 0; il < n_layer; ++il) {89        ggml_tensor * inpSA = inpL;90 91        // norm92        cur = build_norm(inpL,93                model.layers[il].attn_norm, NULL,94                LLM_NORM_RMS, il);95        cb(cur, "attn_norm", il);96 97        // self_attention98        {99            // compute Q and K and RoPE them100            auto [Qcur, Kcur, Vcur] = build_qkv(model.layers[il], cur,101                    n_embd_head, n_head, n_head_kv, il);102 103            Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il);104            cb(Qcur, "Qcur_normed", il);105 106            Qcur = ggml_rope_multi(107                    ctx0, Qcur, inp_pos, nullptr,108                    n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale,109                    ext_factor, attn_factor, beta_fast, beta_slow110                    );111 112            Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il);113            cb(Kcur, "Kcur_normed", il);114 115            Kcur = ggml_rope_multi(116                    ctx0, Kcur, inp_pos, nullptr,117                    n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale,118                    ext_factor, attn_factor, beta_fast, beta_slow119                    );120 121            cb(Qcur, "Qcur", il);122            cb(Kcur, "Kcur", il);123            cb(Vcur, "Vcur", il);124 125            cur = build_attn(inp_attn,126                    model.layers[il].wo, model.layers[il].wo_b, model.layers[il].wo_s,127                    Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il);128        }129 130        if (il == n_layer - 1 && inp_out_ids) {131            cur   = ggml_get_rows(ctx0,   cur, inp_out_ids);132            inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids);133        }134 135        ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA);136        cb(ffn_inp, "ffn_inp", il);137 138        // MoE branch139        cur = build_norm(ffn_inp,140                model.layers[il].ffn_norm, NULL,141                LLM_NORM_RMS, il);142        cb(cur, "ffn_norm", il);143 144        ggml_tensor * moe_out =145            build_moe_ffn(cur,146                    model.layers[il].ffn_gate_inp,147                    model.layers[il].ffn_up_exps,148                    model.layers[il].ffn_gate_exps,149                    model.layers[il].ffn_down_exps,150                    nullptr,151                    n_expert, n_expert_used,152                    LLM_FFN_SILU, true,153                    hparams.expert_weights_scale,154                    LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX,155                    il);156        cb(moe_out, "ffn_moe_out", il);157        cur = moe_out;158 159        cur = ggml_add(ctx0, cur, ffn_inp);160 161        cur = build_cvec(cur, il);162        cb(cur, "l_out", il);163 164        if (il < (int) n_deepstack_layers) {165            ggml_tensor * ds = ggml_view_2d(ctx0, res->t_inp_embd, n_embd, n_tokens, res->t_inp_embd->nb[1], (il + 1) * n_embd * sizeof(float));166            cur = ggml_add(ctx0, cur, ds);167            cb(cur, "deepstack_out", il);168        }169 170        // input for next layer171        inpL = cur;172    }173 174    cur = inpL;175 176    cur = build_norm(cur,177            model.output_norm, NULL,178            LLM_NORM_RMS, -1);179 180    cb(cur, "result_norm", -1);181    res->t_embd = cur;182 183    // lm_head184    cur = build_lora_mm(model.output, cur, model.output_s);185 186    cb(cur, "result_output", -1);187    res->t_logits = cur;188 189    ggml_build_forward_expand(gf, cur);190}191