fix shape of v_diff_original

This commit is contained in:
ngxson 2024-06-11 01:33:16 +02:00
parent c241b500a1
commit 6a5adf3d7c
2 changed files with 11 additions and 8 deletions

View file

@ -210,8 +210,9 @@ struct train_context {
auto & diff_tmp = v_diff_tmp[il]; auto & diff_tmp = v_diff_tmp[il];
int n_elem = diff_tmp.size() / sizeof(float); int n_elem = diff_tmp.size() / sizeof(float);
int n_rows = n_elem / n_embd; int n_rows = n_elem / n_embd;
struct ggml_tensor * diff = ggml_new_tensor_2d(ctx_ggml, GGML_TYPE_F32, n_embd, n_rows); struct ggml_tensor * diff = ggml_new_tensor_2d(ctx_ggml, GGML_TYPE_F32, n_rows, n_embd);
ggml_set_name(diff, (std::string("diff_") + std::to_string(il)).c_str()); ggml_set_name(diff, (std::string("diff_") + std::to_string(il)).c_str());
// TODO: IMPORTANT!! transpose diff
diff->data = diff_tmp.data(); diff->data = diff_tmp.data();
v_diff.push_back(diff); v_diff.push_back(diff);
} }

View file

@ -72,10 +72,10 @@ void load_pca_model(pca_model & model, struct ggml_tensor * input) {
}; };
model.ctx = ggml_init(params); model.ctx = ggml_init(params);
auto n_embd = input->ne[0]; auto n_embd = input->ne[1];
auto n_samples = input->ne[1]; auto n_samples = input->ne[0];
model.v_diff_original = ggml_new_tensor_2d(model.ctx, GGML_TYPE_F32, n_embd, n_samples); model.v_diff_original = ggml_new_tensor_2d(model.ctx, GGML_TYPE_F32, n_samples, n_embd);
model.square = ggml_new_tensor_2d(model.ctx, GGML_TYPE_F32, n_embd, n_embd); model.square = ggml_new_tensor_2d(model.ctx, GGML_TYPE_F32, n_embd, n_embd);
model.eigenvector = ggml_new_tensor_1d(model.ctx, GGML_TYPE_F32, n_embd); model.eigenvector = ggml_new_tensor_1d(model.ctx, GGML_TYPE_F32, n_embd);
@ -117,9 +117,11 @@ static struct ggml_cgraph * build_graph_piter(
struct ggml_cgraph * gf = ggml_new_graph(ctx0); struct ggml_cgraph * gf = ggml_new_graph(ctx0);
// turn v_diff_original into square matrix if needed // turn v_diff_original into square matrix if needed
struct ggml_tensor * square;
if (calc_square) { if (calc_square) {
//struct ggml_tensor * v_diff_transposed = ggml_transpose(ctx0, model.v_diff_original); //struct ggml_tensor * v_diff_transposed = ggml_transpose(ctx0, model.v_diff_original);
struct ggml_tensor * square = ggml_mul_mat(ctx0, model.v_diff_original, model.v_diff_original); print_debug_tensor(model.v_diff_original);
square = ggml_mul_mat(ctx0, model.v_diff_original, model.v_diff_original);
ggml_set_name(square, "square"); ggml_set_name(square, "square");
//model.square = ggml_scale_inplace(ctx0, model.square, 0.0); //model.square = ggml_scale_inplace(ctx0, model.square, 0.0);
} }
@ -128,7 +130,7 @@ static struct ggml_cgraph * build_graph_piter(
for (int i = 0; i < nb_iterations; ++i) { for (int i = 0; i < nb_iterations; ++i) {
// b_tensor = square * eigenvector^T // b_tensor = square * eigenvector^T
b_tensor = ggml_mul_mat(ctx0, model.square, model.eigenvector); b_tensor = ggml_mul_mat(ctx0, square, model.eigenvector);
ggml_set_name(b_tensor, "b_tensor"); ggml_set_name(b_tensor, "b_tensor");
// normalize // normalize
@ -209,7 +211,6 @@ static void power_iteration(
} }
allocr = ggml_gallocr_new(ggml_backend_get_default_buffer_type(model.backend)); allocr = ggml_gallocr_new(ggml_backend_get_default_buffer_type(model.backend));
struct ggml_cgraph * gf = build_graph_piter(model, iter == 0); struct ggml_cgraph * gf = build_graph_piter(model, iter == 0);
printf("kkk\n");
ggml_graph_dump_dot(gf, nullptr, "/tmp/_cgraph.dot"); ggml_graph_dump_dot(gf, nullptr, "/tmp/_cgraph.dot");
struct ggml_tensor * distance = compute_piter(model, gf, allocr, n_threads); struct ggml_tensor * distance = compute_piter(model, gf, allocr, n_threads);
@ -236,6 +237,7 @@ static void run_pca(
int n_embd = v_input[0]->ne[0]; // shape of v_input[0]: [n_embd, m] int n_embd = v_input[0]->ne[0]; // shape of v_input[0]: [n_embd, m]
int n_threads = 8; // TODO: change me int n_threads = 8; // TODO: change me
for (size_t il = 0; il < v_input.size(); ++il) { for (size_t il = 0; il < v_input.size(); ++il) {
print_debug_tensor(v_input[il]);
// prepare output vector // prepare output vector
struct ggml_tensor * ctrl_out = v_output[il]; struct ggml_tensor * ctrl_out = v_output[il];
auto name = std::string("direction.") + std::to_string(il + 1); auto name = std::string("direction.") + std::to_string(il + 1);