@@ -2329,11 +2329,13 @@ struct test_set_rows : public test_case {
23292329struct test_rope_set_rows : public test_case {
23302330 const ggml_type type;
23312331 const ggml_type type_idx;
2332- const std::array<int64_t , 4 > ne ;
2332+ const std::array<int64_t , 4 > ne_a ;
23332333 int mode;
2334+ const int n_ctx{512 };
2335+ const int n_dims{128 };
23342336
23352337 std::string vars () override {
2336- return VARS_TO_STR4 (type, type_idx, ne , mode);
2338+ return VARS_TO_STR4 (type, type_idx, ne_a , mode);
23372339 }
23382340
23392341 std::string op_desc (ggml_tensor * t) override {
@@ -2345,24 +2347,51 @@ struct test_rope_set_rows : public test_case {
23452347
23462348 test_rope_set_rows (ggml_type type,
23472349 ggml_type type_idx,
2348- std::array<int64_t , 4 > ne ,
2350+ std::array<int64_t , 4 > ne_a ,
23492351 int mode)
2350- : type(type), type_idx(type_idx), ne(ne ), mode(mode) {}
2352+ : type(type), type_idx(type_idx), ne_a(ne_a ), mode(mode) {}
23512353
23522354 ggml_tensor * build_graph (ggml_context * ctx) override {
2353- ggml_tensor * src = ggml_new_tensor_4d (ctx, GGML_TYPE_F32, ne [0 ], ne [1 ], ne [2 ], 1 );
2354- ggml_set_name (src , " src " );
2355+ ggml_tensor * a = ggml_new_tensor_4d (ctx, GGML_TYPE_F32, ne_a [0 ], ne_a [1 ], ne_a [2 ], 1 );
2356+ ggml_set_name (a , " a " );
23552357
2356- ggml_tensor * pos = ggml_new_tensor_1d (ctx, GGML_TYPE_I32, ne[2 ]);
2358+ const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE;
2359+ const bool is_vision = mode == GGML_ROPE_TYPE_VISION;
23572360
2358- ggml_tensor * rope = ggml_rope (ctx, src, pos, ne[0 ], mode);
2361+ ggml_tensor * pos;
2362+ if (is_mrope || is_vision) {
2363+ pos = ggml_new_tensor_1d (ctx, GGML_TYPE_I32, ne_a[2 ] * 4 );
2364+ } else {
2365+ pos = ggml_new_tensor_1d (ctx, GGML_TYPE_I32, ne_a[2 ]);
2366+ }
2367+ ggml_set_name (pos, " pos" );
2368+
2369+ float fs = 1 .4245f ;
2370+ float ef = 0 .7465f ;
2371+ float af = 1 .4245f ;
2372+ ggml_tensor * freq = nullptr ;
2373+
2374+ ggml_tensor * rope = nullptr ;
2375+ if (is_mrope) {
2376+ if (is_vision) {
2377+ GGML_ASSERT (n_dims/4 > 0 );
2378+ int rope_sections[4 ] = {n_dims/4 , n_dims/4 , 0 , 0 }; // Vision-RoPE only use first two dimension for image (x, y) coordinate
2379+ rope = ggml_rope_multi (ctx, a, pos, freq, n_dims/2 , rope_sections, mode, 0 , 10000 .0f , fs, ef, af, 1 .0f , 1 .0f );
2380+ } else {
2381+ GGML_ASSERT (n_dims/3 > 0 );
2382+ int rope_sections[4 ] = {n_dims/3 , n_dims/3 , n_dims/3 , 0 };
2383+ rope = ggml_rope_multi (ctx, a, pos, freq, n_dims, rope_sections, mode, 0 , 10000 .0f , fs, ef, af, 1 .0f , 1 .0f );
2384+ }
2385+ } else {
2386+ rope = ggml_rope (ctx, a, pos, ne_a[0 ], mode);
2387+ }
23592388
2360- ggml_tensor * view = ggml_view_2d (ctx, rope, ne [0 ] * ne [1 ], ne [2 ], rope->nb [2 ], 0 );
2389+ ggml_tensor * view = ggml_view_2d (ctx, rope, ne_a [0 ] * ne_a [1 ], ne_a [2 ], rope->nb [2 ], 0 );
23612390
2362- ggml_tensor * dst = ggml_new_tensor_4d (ctx, type, ne [0 ] * ne [1 ], ne [2 ] * ne [3 ], 1 , 1 );
2391+ ggml_tensor * dst = ggml_new_tensor_4d (ctx, type, ne_a [0 ] * ne_a [1 ], ne_a [2 ] * ne_a [3 ], 1 , 1 );
23632392 ggml_set_name (dst, " dst" );
23642393
2365- ggml_tensor * row_idxs = ggml_new_tensor_3d (ctx, type_idx, ne [2 ], 1 , 1 );
2394+ ggml_tensor * row_idxs = ggml_new_tensor_3d (ctx, type_idx, ne_a [2 ], 1 , 1 );
23662395 ggml_set_name (row_idxs, " row_idxs" );
23672396
23682397 ggml_tensor * out = ggml_set_rows (ctx, dst, view, row_idxs);
@@ -2373,14 +2402,26 @@ struct test_rope_set_rows : public test_case {
23732402
23742403 void initialize_tensors (ggml_context * ctx) override {
23752404 for (ggml_tensor * t = ggml_get_first_tensor (ctx); t != NULL ; t = ggml_get_next_tensor (ctx, t)) {
2376- if (t->type == GGML_TYPE_I64 || t-> type == GGML_TYPE_I32 ) {
2405+ if (strcmp ( t->name , " row_idxs " ) == 0 ) {
23772406 if (ggml_is_view_op (t->op )) {
23782407 continue ;
23792408 }
2380-
2381- init_set_rows_row_ids (t, ne[2 ]);
2409+ init_set_rows_row_ids (t, ne_a[2 ]);
2410+ } else if (t->type == GGML_TYPE_I32) {
2411+ // pos
2412+ const int num_pos_ids = (mode & GGML_ROPE_TYPE_MROPE) ? ne_a[2 ] * 4 : ne_a[2 ];
2413+ std::vector<int > data (num_pos_ids);
2414+ for (int i = 0 ; i < num_pos_ids; i++) {
2415+ data[i] = rand () % n_ctx;
2416+ }
2417+ ggml_backend_tensor_set (t, data.data (), 0 , num_pos_ids * sizeof (int ));
23822418 } else {
2383- init_tensor_uniform (t);
2419+ if (t->ne [0 ] == n_dims/2 ) {
2420+ // frequency factors in the range [0.9f, 1.1f]
2421+ init_tensor_uniform (t, 0 .9f , 1 .1f );
2422+ } else {
2423+ init_tensor_uniform (t);
2424+ }
23842425 }
23852426 }
23862427 }
@@ -6854,10 +6895,12 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
68546895 }
68556896 }
68566897
6857- for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX }) {
6898+ for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX, GGML_ROPE_TYPE_MROPE, GGML_ROPE_TYPE_VISION }) {
68586899 for (ggml_type type : {GGML_TYPE_F16, GGML_TYPE_F32}) {
6859- test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , 1 , 100 }, mode));
6860- test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , 512 , 1 }, mode));
6900+ for (int ne2 : {1 , 8 , 512 }) {
6901+ test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , ne2, 1 }, mode));
6902+ test_cases.emplace_back (new test_rope_set_rows (type, GGML_TYPE_I64, { 128 , 32 , ne2, 3 }, mode));
6903+ }
68616904 }
68626905 }
68636906
0 commit comments