diff --git a/examples/control-vector-generator/control-vector-generator.cpp b/examples/control-vector-generator/control-vector-generator.cpp index 60d0c87b5..486ade1e1 100644 --- a/examples/control-vector-generator/control-vector-generator.cpp +++ b/examples/control-vector-generator/control-vector-generator.cpp @@ -127,7 +127,7 @@ struct callback_data { // diff_filtered: [n_embd, n_nonzero_rows] struct ggml_tensor * diff_filtered = ggml_new_tensor_2d( ctx_ggml, GGML_TYPE_F32, n_embd, n_nonzero_rows); - ggml_set_name(diff_filtered, (std::string("diff_filtered_") + a->name).c_str()); + ggml_format_name(diff_filtered, "diff_filtered_%s", a->name); diff_filtered->data = malloc(ggml_nbytes(diff_filtered)); // copy non-zero rows @@ -245,7 +245,7 @@ struct train_context { struct ctrl_params { /* default meta parameters */ - int n_completions = INT_MAX; + int n_completions = 64; int n_pca_batch = 20; int n_pca_iterations = 1000; @@ -311,7 +311,7 @@ static void print_usage(const char * executable) { printf(" -cf, --completions-file completions file\n"); printf(" default: %s\n", defaults.completions_file.c_str()); printf(" -nc, --num-completions N number of lines of completions file to use\n"); - printf(" default: use all lines\n"); + printf(" default: %d\n", defaults.n_completions); printf(" --batch-pca N batch size used for PCA. Larger batch runs faster, but uses more memory\n"); printf(" default: %d\n", defaults.n_pca_batch); printf(" --iter-pca N number of iterations used for PCA\n"); @@ -550,6 +550,11 @@ int main(int argc, char ** argv) { return 1; } + if (cparams.n_pca_iterations % cparams.n_pca_batch != 0) { + fprintf(stderr, "PCA iterations must by multiply of PCA batch size\n"); + return 1; + } + // load and prepare entries for training prepare_entries(cparams); diff --git a/examples/control-vector-generator/pca.hpp b/examples/control-vector-generator/pca.hpp index a227c1729..8e13a53ca 100644 --- a/examples/control-vector-generator/pca.hpp +++ b/examples/control-vector-generator/pca.hpp @@ -181,13 +181,14 @@ static struct ggml_cgraph * build_graph_piter( b_tensor, ggml_sqrt_inplace(ctx0, ggml_sum_rows(ctx0, ggml_sqr(ctx0, b_tensor))) ); - ggml_set_name(b_tensor, ("b_tensor_norm_" + std::to_string(i)).c_str()); + ggml_format_name(b_tensor, "b_tensor_norm_%d", i); // calculate distance(new eigenvector - old eigenvector) + // we don't use ggml_sub because it may not be implemented on GPU backend struct ggml_tensor * new_sub_old = ggml_add(ctx0, old_eigen, ggml_scale(ctx0, b_tensor, -1)); distance = ggml_sqrt_inplace(ctx0, ggml_sum_rows(ctx0, ggml_sqr_inplace(ctx0, new_sub_old))); - ggml_set_name(distance, ("distance_" + std::to_string(i)).c_str()); + ggml_format_name(distance, "distance_%d", i); old_eigen = b_tensor; @@ -317,22 +318,20 @@ static void run_pca( struct pca_params & params, const std::vector & v_input, // shape of v_input[0]: [n_samples, n_embd] const std::vector & v_output) { - printf("Running PCA...\n"); + printf("%s: Running PCA...\n", __func__); for (size_t il = 0; il < v_input.size(); ++il) { // prepare output vector struct ggml_tensor * ctrl_out = v_output[il]; - auto name = std::string("direction.") + std::to_string(il + 1); - ggml_set_name(ctrl_out, name.c_str()); + ggml_format_name(ctrl_out, "direction.%ld", il+1); // run power_iteration params.i_layer = il; params.n_layers = v_input.size(); power_iteration(params, v_input[il], ctrl_out); - printf("DONE layer %ld / %ld\n", il+1, v_input.size()); + printf("%s: Done layer %ld / %ld\n", __func__, il+1, v_input.size()); //print_debug_tensor(ctrl_out); } - printf("Done with PCA.\n"); } }