char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
f5c6ae182
char/aliceai-t5-moe
1#include "models.h" 2 3ggml_cgraph * clip_graph_conformer::build () { 4const int n_frames = img .nx (); 5const int n_pos = n_frames /2 ; 6const int n_pos_embd = (((((n_frames + 1 ) /2 )+ 1 ) /2 + 1 ) /2 )* 2 - 1 ; 7GGML_ASSERT (model .position_embeddings -> ne [1 ] >=n_pos ); 8 9ggml_tensor * pos_emb = ggml_new_tensor_2d (ctx0 ,GGML_TYPE_F32 ,512 ,n_pos_embd ); 10ggml_set_name (pos_emb ,"pos_emb" ); 11ggml_set_input (pos_emb ); 12ggml_build_forward_expand (gf ,pos_emb ); 13 14ggml_tensor * inp = build_inp_raw (1 ); 15 16auto * cur = ggml_cont (ctx0 ,ggml_transpose (ctx0 ,inp )); 17 18// pre encode, conv subsampling 19 { 20// layer.0 - conv2d 21cur = ggml_conv_2d (ctx0 ,model .pre_encode_conv_X_w [0 ],cur ,2 ,2 ,1 ,1 ,1 ,1 ); 22cur = ggml_add (ctx0 ,cur ,model .pre_encode_conv_X_b [0 ]); 23cb (cur ,"conformer.pre_encode.conv.{}" ,0 ); 24 25// layer.1 - relu 26cur = ggml_relu_inplace (ctx0 ,cur ); 27 28// layer.2 conv2d dw 29cur = ggml_conv_2d_dw_direct (ctx0 ,model .pre_encode_conv_X_w [2 ],cur ,2 ,2 ,1 ,1 ,1 ,1 ); 30cur = ggml_add (ctx0 ,cur ,model .pre_encode_conv_X_b [2 ]); 31cb (cur ,"conformer.pre_encode.conv.{}" ,2 ); 32 33// layer.3 conv2d 34cur = ggml_conv_2d_direct (ctx0 ,model .pre_encode_conv_X_w [3 ],cur ,1 ,1 ,0 ,0 ,1 ,1 ); 35cur = ggml_add (ctx0 ,cur ,model .pre_encode_conv_X_b [3 ]); 36cb (cur ,"conformer.pre_encode.conv.{}" ,3 ); 37 38// layer.4 - relu 39cur = ggml_relu_inplace (ctx0 ,cur ); 40 41// layer.5 conv2d dw 42cur = ggml_conv_2d_dw_direct (ctx0 ,model .pre_encode_conv_X_w [5 ],cur ,2 ,2 ,1 ,1 ,1 ,1 ); 43cur = ggml_add (ctx0 ,cur ,model .pre_encode_conv_X_b [5 ]); 44cb (cur ,"conformer.pre_encode.conv.{}" ,5 ); 45 46// layer.6 conv2d 47cur = ggml_conv_2d_direct (ctx0 ,model .pre_encode_conv_X_w [6 ],cur ,1 ,1 ,0 ,0 ,1 ,1 ); 48cur = ggml_add (ctx0 ,cur ,model .pre_encode_conv_X_b [6 ]); 49cb (cur ,"conformer.pre_encode.conv.{}" ,6 ); 50 51// layer.7 - relu 52cur = ggml_relu_inplace (ctx0 ,cur ); 53 54// flatten channel and frequency axis 55cur = ggml_cont (ctx0 ,ggml_permute (ctx0 ,cur ,0 ,2 ,1 ,3 )); 56cur = ggml_reshape_2d (ctx0 ,cur ,cur -> ne [0 ]* cur -> ne [1 ],cur -> ne [2 ]); 57 58// calculate out 59cur = build_mm (model .pre_encode_out_w ,cur ); 60cur = ggml_add (ctx0 ,cur ,model .pre_encode_out_b ); 61cb (cur ,"conformer.pre_encode.out" ,-1 ); 62 } 63 64// pos_emb 65cb (pos_emb ,"pos_emb" ,-1 ); 66 67for (int il = 0 ;il < hparams .n_layer ;il ++ ) { 68const auto & layer = model .layers [il ]; 69 70auto * residual = cur ; 71 72cb (cur ,"layer.in" ,il ); 73 74// feed_forward1 75cur = build_norm (cur ,layer .ff_norm_w ,layer .ff_norm_b ,NORM_TYPE_NORMAL ,1e-5 ,il ); 76cb (cur ,"conformer.layers.{}.norm_feed_forward1" ,il ); 77 78cur = build_ffn (cur ,layer .ff_up_w ,layer .ff_up_b ,nullptr ,nullptr ,layer .ff_down_w ,layer .ff_down_b ,FFN_SILU , 79il ); 80cb (cur ,"conformer.layers.{}.feed_forward1.linear2" ,il ); 81 82const auto fc_factor = 0.5f ; 83residual = ggml_add (ctx0 ,residual ,ggml_scale (ctx0 ,cur ,fc_factor )); 84 85// self-attention 86 { 87cur = build_norm (residual ,layer .ln_1_w ,layer .ln_1_b ,NORM_TYPE_NORMAL ,1e-5 ,il ); 88cb (cur ,"conformer.layers.{}.norm_self_att" ,il ); 89 90ggml_tensor * Qcur = build_mm (layer .q_w ,cur ); 91Qcur = ggml_add (ctx0 ,Qcur ,layer .q_b ); 92Qcur = ggml_reshape_3d (ctx0 ,Qcur ,d_head ,n_head ,Qcur -> ne [1 ]); 93ggml_tensor * Q_bias_u = ggml_add (ctx0 ,Qcur ,layer .pos_bias_u ); 94Q_bias_u = ggml_permute (ctx0 ,Q_bias_u ,0 ,2 ,1 ,3 ); 95ggml_tensor * Q_bias_v = ggml_add (ctx0 ,Qcur ,layer .pos_bias_v ); 96Q_bias_v = ggml_permute (ctx0 ,Q_bias_v ,0 ,2 ,1 ,3 ); 97 98// TODO @ngxson : some cont can/should be removed when ggml_mul_mat support these cases 99ggml_tensor * Kcur = build_mm (layer .k_w ,cur ); 100Kcur = ggml_add (ctx0 ,Kcur ,layer .k_b ); 101Kcur = ggml_reshape_3d (ctx0 ,Kcur ,d_head ,n_head ,Kcur -> ne [1 ]); 102Kcur = ggml_cont (ctx0 ,ggml_permute (ctx0 ,Kcur ,0 ,2 ,1 ,3 )); 103 104ggml_tensor * Vcur = build_mm (layer .v_w ,cur ); 105Vcur = ggml_add (ctx0 ,Vcur ,layer .v_b ); 106Vcur = ggml_reshape_3d (ctx0 ,Vcur ,d_head ,n_head ,Vcur -> ne [1 ]); 107Vcur = ggml_cont (ctx0 ,ggml_permute (ctx0 ,Vcur ,1 ,2 ,0 ,3 )); 108 109// build_attn won't fit due to matrix_ac and matrix_bd separation 110ggml_tensor * matrix_ac = ggml_mul_mat (ctx0 ,Q_bias_u ,Kcur ); 111matrix_ac = ggml_cont (ctx0 ,ggml_permute (ctx0 ,matrix_ac ,1 ,0 ,2 ,3 )); 112cb (matrix_ac ,"conformer.layers.{}.self_attn.id3" ,il ); 113 114auto * p = build_mm (layer .linear_pos_w ,pos_emb ); 115cb (p ,"conformer.layers.{}.self_attn.linear_pos" ,il ); 116p = ggml_reshape_3d (ctx0 ,p ,d_head ,n_head ,p -> ne [1 ]); 117p = ggml_permute (ctx0 ,p ,0 ,2 ,1 ,3 ); 118 119auto * matrix_bd = ggml_mul_mat (ctx0 ,Q_bias_v ,p ); 120matrix_bd = ggml_cont (ctx0 ,ggml_permute (ctx0 ,matrix_bd ,1 ,0 ,2 ,3 )); 121 122// rel shift 123 { 124const auto pos_len = matrix_bd -> ne [0 ]; 125const auto q_len = matrix_bd -> ne [1 ]; 126const auto h = matrix_bd -> ne [2 ]; 127matrix_bd = ggml_pad (ctx0 ,matrix_bd ,1 ,0 ,0 ,0 ); 128matrix_bd = ggml_roll (ctx0 ,matrix_bd ,1 ,0 ,0 ,0 ); 129matrix_bd = ggml_reshape_3d (ctx0 ,matrix_bd ,q_len ,pos_len + 1 ,h ); 130matrix_bd = ggml_view_3d (ctx0 ,matrix_bd ,q_len ,pos_len ,h ,matrix_bd -> nb [1 ], 131matrix_bd -> nb [2 ],matrix_bd -> nb [0 ]* q_len ); 132matrix_bd = ggml_cont_3d (ctx0 ,matrix_bd ,pos_len ,q_len ,h ); 133 } 134 135matrix_bd = ggml_view_3d (ctx0 ,matrix_bd ,matrix_ac -> ne [0 ],matrix_bd -> ne [1 ], 136matrix_bd -> ne [2 ],matrix_bd -> nb [1 ],matrix_bd -> nb [2 ],0 ); 137auto * scores = ggml_add (ctx0 ,matrix_ac ,matrix_bd ); 138scores = ggml_scale (ctx0 ,scores ,1.0f / std::sqrt (d_head )); 139cb (scores ,"conformer.layers.{}.self_attn.id0" ,il ); 140 141ggml_tensor * attn = ggml_soft_max (ctx0 ,scores ); 142ggml_tensor * x = ggml_mul_mat (ctx0 ,attn ,Vcur ); 143x = ggml_permute (ctx0 ,x ,2 ,0 ,1 ,3 ); 144x = ggml_cont_2d (ctx0 ,x ,x -> ne [0 ]* x -> ne [1 ],x -> ne [2 ]); 145 146ggml_tensor * out = build_mm (layer .o_w ,x ); 147out = ggml_add (ctx0 ,out ,layer .o_b ); 148cb (out ,"conformer.layers.{}.self_attn.linear_out" ,il ); 149 150cur = out ; 151 } 152 153residual = ggml_add (ctx0 ,residual ,cur ); 154cur = build_norm (residual ,layer .norm_conv_w ,layer .norm_conv_b ,NORM_TYPE_NORMAL ,1e-5 ,il ); 155cb (cur ,"conformer.layers.{}.norm_conv" ,il ); 156 157// conv 158 { 159auto * x = cur ; 160x = build_mm (layer .conv_pw1_w ,x ); 161x = ggml_add (ctx0 ,x ,layer .conv_pw1_b ); 162cb (x ,"conformer.layers.{}.conv.pointwise_conv1" ,il ); 163 164// ggml_glu doesn't support sigmoid 165// TODO @ngxson : support this ops in ggml 166 { 167int64_t d = x -> ne [0 ] /2 ; 168ggml_tensor * gate = ggml_sigmoid (ctx0 ,ggml_view_2d (ctx0 ,x ,d ,x -> ne [1 ],x -> nb [1 ],d * x -> nb [0 ])); 169x = ggml_mul (ctx0 ,ggml_view_2d (ctx0 ,x ,d ,x -> ne [1 ],x -> nb [1 ],0 ),gate ); 170x = ggml_cont (ctx0 ,ggml_transpose (ctx0 ,x )); 171 } 172 173// use ggml_ssm_conv for f32 precision 174x = ggml_pad (ctx0 ,x ,4 ,0 ,0 ,0 ); 175x = ggml_roll (ctx0 ,x ,4 ,0 ,0 ,0 ); 176x = ggml_pad (ctx0 ,x ,4 ,0 ,0 ,0 ); 177x = ggml_ssm_conv (ctx0 ,x ,layer .conv_dw_w ); 178x = ggml_add (ctx0 ,x ,layer .conv_dw_b ); 179 180x = ggml_add (ctx0 ,ggml_mul (ctx0 ,x ,layer .conv_norm_w ),layer .conv_norm_b ); 181x = ggml_silu (ctx0 ,x ); 182 183// pointwise_conv2 184x = build_mm (layer .conv_pw2_w ,x ); 185x = ggml_add (ctx0 ,x ,layer .conv_pw2_b ); 186 187cur = x ; 188 } 189 190residual = ggml_add (ctx0 ,residual ,cur ); 191 192cur = build_norm (residual ,layer .ff_norm_1_w ,layer .ff_norm_1_b ,NORM_TYPE_NORMAL ,1e-5 ,il ); 193cb (cur ,"conformer.layers.{}.norm_feed_forward2" ,il ); 194 195cur = build_ffn (cur ,layer .ff_up_1_w ,layer .ff_up_1_b ,nullptr ,nullptr ,layer .ff_down_1_w ,layer .ff_down_1_b , 196FFN_SILU ,il );// TODO(tarek): read activation for ffn from hparams 197cb (cur ,"conformer.layers.{}.feed_forward2.linear2" ,il ); 198 199residual = ggml_add (ctx0 ,residual ,ggml_scale (ctx0 ,cur ,fc_factor )); 200cb (residual ,"conformer.layers.{}.conv.id" ,il ); 201 202cur = build_norm (residual ,layer .ln_2_w ,layer .ln_2_b ,NORM_TYPE_NORMAL ,1e-5 ,il ); 203cb (cur ,"conformer.layers.{}.norm_out" ,il ); 204 } 205 206// audio adapter 207cur = build_norm (cur ,model .mm_0_w ,model .mm_0_b ,NORM_TYPE_NORMAL ,1e-5 ,-1 ); 208cb (cur ,"audio_adapter.model.{}" ,0 ); 209cur = build_ffn (cur ,model .mm_1_w ,model .mm_1_b ,nullptr ,nullptr ,model .mm_3_w ,model .mm_3_b ,FFN_GELU_ERF ,-1 ); 210 211cb (cur ,"projected" ,-1 ); 212 213ggml_build_forward_expand (gf ,cur ); 214 215return gf ; 216}