char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
a731805ce
char/aliceai-t5-moe
1#include "models.h" 2#include <cmath> 3 4ggml_cgraph * clip_graph_gemma4uv::build () { 5ggml_tensor * inp_raw = build_inp_raw (); 6 7// Gemma4UnifiedVisionEmbedder uses default pytorch LayerNorm, not RMSNorm 8float eps = 1e-5f ;// default eps for pytorch LayerNorm 9 10ggml_tensor * inp = nullptr ; 11 { 12// note: we cannot use ggml_conv_2d here because we need to apply norm after im2col 13auto c = inp_raw -> ne [2 ]; 14ggml_tensor * kernel = ggml_new_tensor_3d (ctx0 ,GGML_TYPE_F32 ,patch_size ,patch_size ,c ); 15inp = ggml_im2col (ctx0 ,kernel ,inp_raw ,patch_size ,patch_size ,0 ,0 ,1 ,1 , true,inp_raw -> type ); 16// inp shape: [patch_size * patch_size * c, n_patches_w, n_patches_h] 17 18inp = ggml_reshape_2d (ctx0 ,inp ,inp -> ne [0 ],inp -> ne [1 ]* inp -> ne [2 ]* inp -> ne [3 ]); 19inp = build_norm (inp ,model .patch_norm_1_w ,model .patch_norm_1_b ,NORM_TYPE_NORMAL ,eps ,-1 ); 20// inp shape: [patch_size * patch_size * c, n_patches] 21 22inp = ggml_mul_mat (ctx0 ,model .patch_embeddings_0 ,inp ); 23inp = ggml_add (ctx0 ,inp ,model .patch_bias ); 24// inp shape: [n_embd, n_patches] 25 26inp = build_norm (inp ,model .patch_norm_2_w ,model .patch_norm_2_b ,NORM_TYPE_NORMAL ,eps ,-1 ); 27 } 28 29ggml_tensor * pos_x = ggml_new_tensor_1d (ctx0 ,GGML_TYPE_I32 ,n_patches ); 30ggml_set_name (pos_x ,"pos_x" ); 31ggml_set_input (pos_x ); 32 33ggml_tensor * pos_y = ggml_new_tensor_1d (ctx0 ,GGML_TYPE_I32 ,n_patches ); 34ggml_set_name (pos_y ,"pos_y" ); 35ggml_set_input (pos_y ); 36 37 { 38const int64_t pos_size = model .position_embeddings -> ne [1 ]; 39const size_t nb1 = ggml_row_size (model .position_embeddings -> type ,n_embd ); 40 41// positional embeddings are stored as lookup tables (one for x, one for y) 42ggml_tensor * tbl_x = ggml_view_2d (ctx0 ,model .position_embeddings , 43n_embd ,pos_size ,nb1 ,0 ); 44ggml_tensor * tbl_y = ggml_view_2d (ctx0 ,model .position_embeddings , 45n_embd ,pos_size ,nb1 ,pos_size * nb1 ); 46 47// ggml_get_rows: [n_embd, n_patches] 48ggml_tensor * emb_x = ggml_get_rows (ctx0 ,tbl_x ,pos_x ); 49ggml_tensor * emb_y = ggml_get_rows (ctx0 ,tbl_y ,pos_y ); 50 51inp = ggml_add (ctx0 ,inp ,emb_x ); 52inp = ggml_add (ctx0 ,inp ,emb_y ); 53cb (inp ,"pos_embd" ,-1 ); 54 55// pos_norm 56inp = build_norm (inp ,model .patch_norm_3_w ,model .patch_norm_3_b ,NORM_TYPE_NORMAL ,eps ,-1 ); 57 } 58 59auto cur = inp ; 60 61// Gemma4UnifiedMultimodalEmbedder 62 { 63// embedding_pre_projection_norm 64cur = ggml_rms_norm (ctx0 ,cur ,hparams .eps ); 65cur = build_mm (model .mm_input_proj_w ,cur ); 66cb (cur ,"projected" ,-1 ); 67 } 68 69ggml_build_forward_expand (gf ,cur ); 70return gf ; 71}