|
@@ -2329,11 +2329,13 @@ struct test_set_rows : public test_case {
|
|
|
struct test_rope_set_rows : public test_case {
|
|
struct test_rope_set_rows : public test_case {
|
|
|
const ggml_type type;
|
|
const ggml_type type;
|
|
|
const ggml_type type_idx;
|
|
const ggml_type type_idx;
|
|
|
- const std::array<int64_t, 4> ne;
|
|
|
|
|
|
|
+ const std::array<int64_t, 4> ne_a;
|
|
|
int mode;
|
|
int mode;
|
|
|
|
|
+ const int n_ctx{512};
|
|
|
|
|
+ const int n_dims{128};
|
|
|
|
|
|
|
|
std::string vars() override {
|
|
std::string vars() override {
|
|
|
- return VARS_TO_STR4(type, type_idx, ne, mode);
|
|
|
|
|
|
|
+ return VARS_TO_STR4(type, type_idx, ne_a, mode);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
std::string op_desc(ggml_tensor * t) override {
|
|
std::string op_desc(ggml_tensor * t) override {
|
|
@@ -2345,24 +2347,51 @@ struct test_rope_set_rows : public test_case {
|
|
|
|
|
|
|
|
test_rope_set_rows(ggml_type type,
|
|
test_rope_set_rows(ggml_type type,
|
|
|
ggml_type type_idx,
|
|
ggml_type type_idx,
|
|
|
- std::array<int64_t, 4> ne,
|
|
|
|
|
|
|
+ std::array<int64_t, 4> ne_a,
|
|
|
int mode)
|
|
int mode)
|
|
|
- : type(type), type_idx(type_idx), ne(ne), mode(mode) {}
|
|
|
|
|
|
|
+ : type(type), type_idx(type_idx), ne_a(ne_a), mode(mode) {}
|
|
|
|
|
|
|
|
ggml_tensor * build_graph(ggml_context * ctx) override {
|
|
ggml_tensor * build_graph(ggml_context * ctx) override {
|
|
|
- ggml_tensor * src = ggml_new_tensor_4d(ctx, GGML_TYPE_F32, ne[0], ne[1], ne[2], 1);
|
|
|
|
|
- ggml_set_name(src, "src");
|
|
|
|
|
|
|
+ ggml_tensor * a = ggml_new_tensor_4d(ctx, GGML_TYPE_F32, ne_a[0], ne_a[1], ne_a[2], 1);
|
|
|
|
|
+ ggml_set_name(a, "a");
|
|
|
|
|
|
|
|
- ggml_tensor * pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne[2]);
|
|
|
|
|
|
|
+ const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE;
|
|
|
|
|
+ const bool is_vision = mode == GGML_ROPE_TYPE_VISION;
|
|
|
|
|
|
|
|
- ggml_tensor * rope = ggml_rope(ctx, src, pos, ne[0], mode);
|
|
|
|
|
|
|
+ ggml_tensor * pos;
|
|
|
|
|
+ if (is_mrope || is_vision) {
|
|
|
|
|
+ pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne_a[2] * 4);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne_a[2]);
|
|
|
|
|
+ }
|
|
|
|
|
+ ggml_set_name(pos, "pos");
|
|
|
|
|
+
|
|
|
|
|
+ float fs = 1.4245f;
|
|
|
|
|
+ float ef = 0.7465f;
|
|
|
|
|
+ float af = 1.4245f;
|
|
|
|
|
+ ggml_tensor * freq = nullptr;
|
|
|
|
|
+
|
|
|
|
|
+ ggml_tensor * rope = nullptr;
|
|
|
|
|
+ if (is_mrope) {
|
|
|
|
|
+ if (is_vision) {
|
|
|
|
|
+ GGML_ASSERT(n_dims/4 > 0);
|
|
|
|
|
+ int rope_sections[4] = {n_dims/4, n_dims/4, 0, 0}; // Vision-RoPE only use first two dimension for image (x, y) coordinate
|
|
|
|
|
+ rope = ggml_rope_multi(ctx, a, pos, freq, n_dims/2, rope_sections, mode, 0, 10000.0f, fs, ef, af, 1.0f, 1.0f);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ GGML_ASSERT(n_dims/3 > 0);
|
|
|
|
|
+ int rope_sections[4] = {n_dims/3, n_dims/3, n_dims/3, 0};
|
|
|
|
|
+ rope = ggml_rope_multi(ctx, a, pos, freq, n_dims, rope_sections, mode, 0, 10000.0f, fs, ef, af, 1.0f, 1.0f);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ rope = ggml_rope(ctx, a, pos, ne_a[0], mode);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- ggml_tensor * view = ggml_view_2d(ctx, rope, ne[0] * ne[1], ne[2], rope->nb[2], 0);
|
|
|
|
|
|
|
+ ggml_tensor * view = ggml_view_2d(ctx, rope, ne_a[0] * ne_a[1], ne_a[2], rope->nb[2], 0);
|
|
|
|
|
|
|
|
- ggml_tensor * dst = ggml_new_tensor_4d(ctx, type, ne[0] * ne[1], ne[2] * ne[3], 1, 1);
|
|
|
|
|
|
|
+ ggml_tensor * dst = ggml_new_tensor_4d(ctx, type, ne_a[0] * ne_a[1], ne_a[2] * ne_a[3], 1, 1);
|
|
|
ggml_set_name(dst, "dst");
|
|
ggml_set_name(dst, "dst");
|
|
|
|
|
|
|
|
- ggml_tensor * row_idxs = ggml_new_tensor_3d(ctx, type_idx, ne[2], 1, 1);
|
|
|
|
|
|
|
+ ggml_tensor * row_idxs = ggml_new_tensor_3d(ctx, type_idx, ne_a[2], 1, 1);
|
|
|
ggml_set_name(row_idxs, "row_idxs");
|
|
ggml_set_name(row_idxs, "row_idxs");
|
|
|
|
|
|
|
|
ggml_tensor * out = ggml_set_rows(ctx, dst, view, row_idxs);
|
|
ggml_tensor * out = ggml_set_rows(ctx, dst, view, row_idxs);
|
|
@@ -2373,14 +2402,26 @@ struct test_rope_set_rows : public test_case {
|
|
|
|
|
|
|
|
void initialize_tensors(ggml_context * ctx) override {
|
|
void initialize_tensors(ggml_context * ctx) override {
|
|
|
for (ggml_tensor * t = ggml_get_first_tensor(ctx); t != NULL; t = ggml_get_next_tensor(ctx, t)) {
|
|
for (ggml_tensor * t = ggml_get_first_tensor(ctx); t != NULL; t = ggml_get_next_tensor(ctx, t)) {
|
|
|
- if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) {
|
|
|
|
|
|
|
+ if (strcmp(t->name, "row_idxs") == 0) {
|
|
|
if (ggml_is_view_op(t->op)) {
|
|
if (ggml_is_view_op(t->op)) {
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- init_set_rows_row_ids(t, ne[2]);
|
|
|
|
|
|
|
+ init_set_rows_row_ids(t, ne_a[2]);
|
|
|
|
|
+ } else if (t->type == GGML_TYPE_I32) {
|
|
|
|
|
+ // pos
|
|
|
|
|
+ const int num_pos_ids = (mode & GGML_ROPE_TYPE_MROPE) ? ne_a[2] * 4 : ne_a[2];
|
|
|
|
|
+ std::vector<int> data(num_pos_ids);
|
|
|
|
|
+ for (int i = 0; i < num_pos_ids; i++) {
|
|
|
|
|
+ data[i] = rand() % n_ctx;
|
|
|
|
|
+ }
|
|
|
|
|
+ ggml_backend_tensor_set(t, data.data(), 0, num_pos_ids * sizeof(int));
|
|
|
} else {
|
|
} else {
|
|
|
- init_tensor_uniform(t);
|
|
|
|
|
|
|
+ if (t->ne[0] == n_dims/2) {
|
|
|
|
|
+ // frequency factors in the range [0.9f, 1.1f]
|
|
|
|
|
+ init_tensor_uniform(t, 0.9f, 1.1f);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ init_tensor_uniform(t);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -6854,10 +6895,12 @@ static std::vector<std::unique_ptr<test_case>> make_test_cases_eval() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX }) {
|
|
|
|
|
|
|
+ for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX, GGML_ROPE_TYPE_MROPE, GGML_ROPE_TYPE_VISION }) {
|
|
|
for (ggml_type type : {GGML_TYPE_F16, GGML_TYPE_F32}) {
|
|
for (ggml_type type : {GGML_TYPE_F16, GGML_TYPE_F32}) {
|
|
|
- test_cases.emplace_back(new test_rope_set_rows(type, GGML_TYPE_I64, { 128, 32, 1, 100 }, mode));
|
|
|
|
|
- test_cases.emplace_back(new test_rope_set_rows(type, GGML_TYPE_I64, { 128, 32, 512, 1 }, mode));
|
|
|
|
|
|
|
+ for (int ne2 : {1, 8, 512}) {
|
|
|
|
|
+ test_cases.emplace_back(new test_rope_set_rows(type, GGML_TYPE_I64, { 128, 32, ne2, 1 }, mode));
|
|
|
|
|
+ test_cases.emplace_back(new test_rope_set_rows(type, GGML_TYPE_I64, { 128, 32, ne2, 3 }, mode));
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|