@@ -253,7 +253,7 @@ clip_graph::clip_graph(clip_ctx * ctx, const clip_image_f32 & img) :
253253 n_embd(hparams.n_embd),
254254 n_head(hparams.n_head),
255255 n_head_kv(hparams.n_head_kv),
256- d_head(n_head > 0 ? n_embd / n_head : 0 ),
256+ d_head(hparams.n_embd_head > 0 ? hparams.n_embd_head : ( n_head > 0 ? n_embd / n_head : 0 ) ),
257257 n_layer(hparams.n_layer),
258258 n_mmproj_embd(clip_n_mmproj_embd(ctx)),
259259 eps(hparams.eps),
@@ -367,13 +367,13 @@ ggml_tensor * clip_graph::build_vit(
367367 /* nb1 */ ggml_row_size (cur->type , d_head),
368368 /* nb2 */ cur->nb [1 ],
369369 /* nb3 */ cur->nb [1 ] * n_pos,
370- /* offset */ ggml_row_size (cur->type , n_embd ));
370+ /* offset */ ggml_row_size (cur->type , n_head * d_head ));
371371
372372 Vcur = ggml_view_4d (ctx0, cur, d_head, n_head, n_pos, B,
373373 /* nb1 */ ggml_row_size (cur->type , d_head),
374374 /* nb2 */ cur->nb [1 ],
375375 /* nb3 */ cur->nb [1 ] * n_pos,
376- /* offset */ ggml_row_size (cur->type , 2 * n_embd ));
376+ /* offset */ ggml_row_size (cur->type , 2 * n_head * d_head ));
377377
378378 if (layer.q_norm ) {
379379 GGML_ASSERT (layer.q_norm ->ne [0 ] == Qcur->ne [0 ]);
@@ -964,6 +964,10 @@ static std::unique_ptr<clip_graph> clip_get_graph_builder(clip_ctx * ctx, const
964964 {
965965 builder = std::make_unique<clip_graph_kimik25>(ctx, img);
966966 } break ;
967+ case PROJECTOR_TYPE_KIMIK3 :
968+ {
969+ builder = std::make_unique<clip_graph_kimik3>(ctx, img);
970+ } break ;
967971 case PROJECTOR_TYPE_COGVLM :
968972 {
969973 builder = std::make_unique<clip_graph_cogvlm>(ctx, img);
@@ -1173,6 +1177,7 @@ struct clip_model_loader {
11731177 const char * prefix = is_vision ? " vision" : " audio" ;
11741178 get_u32 (string_format (KEY_N_EMBD , prefix), hparams.n_embd );
11751179 get_u32 (string_format (KEY_N_HEAD , prefix), hparams.n_head );
1180+ get_u32 (string_format (KEY_N_EMBD_HEAD , prefix), hparams.n_embd_head , false );
11761181 get_u32 (string_format (KEY_N_FF , prefix), hparams.n_ff );
11771182 get_u32 (string_format (KEY_N_BLOCK , prefix), hparams.n_layer );
11781183 get_u32 (string_format (KEY_PROJ_DIM , prefix), hparams.projection_dim );
@@ -1410,6 +1415,23 @@ struct clip_model_loader {
14101415 hparams.rope_theta = 10000 .0f ;
14111416 get_u32 (KEY_PROJ_SCALE_FACTOR , hparams.n_merge , false );
14121417
1418+ int min_pixels = 0 , max_pixels = 0 ;
1419+ get_u32 (KEY_IMAGE_MIN_PIXELS , min_pixels, false );
1420+ get_u32 (KEY_IMAGE_MAX_PIXELS , max_pixels, false );
1421+ if (min_pixels > 0 && max_pixels > 0 ) {
1422+ hparams.image_min_pixels = min_pixels;
1423+ hparams.image_max_pixels = max_pixels;
1424+ hparams.warmup_image_size = static_cast <int >(std::sqrt (max_pixels));
1425+ } else {
1426+ hparams.set_limit_image_tokens (2 , 4096 );
1427+ }
1428+ } break ;
1429+ case PROJECTOR_TYPE_KIMIK3 :
1430+ {
1431+ hparams.image_resize_algo = RESIZE_ALGO_BILINEAR ;
1432+ hparams.rope_theta = 10000 .0f ;
1433+ get_u32 (KEY_PROJ_SCALE_FACTOR , hparams.n_merge , false );
1434+
14131435 int min_pixels = 0 , max_pixels = 0 ;
14141436 get_u32 (KEY_IMAGE_MIN_PIXELS , min_pixels, false );
14151437 get_u32 (KEY_IMAGE_MAX_PIXELS , max_pixels, false );
@@ -2343,6 +2365,13 @@ struct clip_model_loader {
23432365 model.mm_2_w = get_tensor (string_format (TN_LLAVA_PROJ , 2 , " weight" ));
23442366 model.mm_2_b = get_tensor (string_format (TN_LLAVA_PROJ , 2 , " bias" ));
23452367 } break ;
2368+ case PROJECTOR_TYPE_KIMIK3 :
2369+ {
2370+ // patchmergerv2, bias-free, norm after the projection
2371+ model.mm_1_w = get_tensor (string_format (TN_LLAVA_PROJ , 1 , " weight" ));
2372+ model.mm_2_w = get_tensor (string_format (TN_LLAVA_PROJ , 2 , " weight" ));
2373+ model.mm_post_norm_w = get_tensor (string_format (TN_MM_POST_NORM , " weight" ));
2374+ } break ;
23462375 case PROJECTOR_TYPE_KIMIVL :
23472376 case PROJECTOR_TYPE_PADDLEOCR :
23482377 case PROJECTOR_TYPE_KIMIK25 :
@@ -3424,6 +3453,7 @@ int clip_n_output_tokens(const clip_ctx * ctx, const clip_image_f32 * img) {
34243453 case PROJECTOR_TYPE_LFM2 :
34253454 case PROJECTOR_TYPE_KIMIVL :
34263455 case PROJECTOR_TYPE_KIMIK25 :
3456+ case PROJECTOR_TYPE_KIMIK3 :
34273457 {
34283458 // dynamic size
34293459 int out_patch_size = params.patch_size * ctx->model .hparams .n_merge ;
@@ -4108,6 +4138,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, int n_threads, const clip_image_f32
41084138 case PROJECTOR_TYPE_PIXTRAL :
41094139 case PROJECTOR_TYPE_KIMIVL :
41104140 case PROJECTOR_TYPE_KIMIK25 :
4141+ case PROJECTOR_TYPE_KIMIK3 :
41114142 case PROJECTOR_TYPE_LIGHTONOCR :
41124143 {
41134144 // set the 2D positions
@@ -4661,6 +4692,7 @@ int clip_n_mmproj_embd(const struct clip_ctx * ctx) {
46614692 case PROJECTOR_TYPE_KIMIVL :
46624693 case PROJECTOR_TYPE_PADDLEOCR :
46634694 case PROJECTOR_TYPE_KIMIK25 :
4695+ case PROJECTOR_TYPE_KIMIK3 :
46644696 case PROJECTOR_TYPE_YASA2 :
46654697 return ctx->model .mm_2_w ->ne [1 ];
46664698 case PROJECTOR_TYPE_HUNYUANVL :
0 commit comments