mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-12-28 12:24:35 +00:00
d283d02bf2
Warning types fixed (observed under MSYS2 GCC 14.2.0): * format '%ld' expects argument of type 'long int', but argument has type 'size_t' * llama.cpp/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp:81:46: warning: missing initializer for member '_STARTUPINFOA::lpDesktop' [-Wmissing-field-initializers] (emitted for all struct field except first)
49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
#include "common.h"
|
|
#include "llama.h"
|
|
#include "ggml.h"
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
#include <math.h>
|
|
|
|
namespace mean {
|
|
|
|
static void run(
|
|
const std::vector<struct ggml_tensor *> & v_input, // shape of v_input[0]: [n_embd, n_samples]
|
|
const std::vector<struct ggml_tensor *> & v_output) {
|
|
printf("%s: Running mean...\n", __func__);
|
|
for (size_t il = 0; il < v_input.size(); ++il) {
|
|
// prepare output vector
|
|
struct ggml_tensor * ctrl_out = v_output[il];
|
|
ggml_format_name(ctrl_out, "direction.%zu", il+1);
|
|
|
|
// calculate mean vector
|
|
struct ggml_tensor * t_layer = v_input[il];
|
|
GGML_ASSERT(t_layer->ne[0] == ctrl_out->ne[0]); // == n_embd
|
|
for (int ic = 0; ic < t_layer->ne[0]; ic++) {
|
|
float f = 0.0;
|
|
for (int ir = 0; ir < t_layer->ne[1]; ir++) {
|
|
f += ggml_get_f32_nd(t_layer, ic, ir, 0, 0);
|
|
}
|
|
f /= t_layer->ne[1];
|
|
ggml_set_f32_1d(ctrl_out, ic, f);
|
|
}
|
|
|
|
// normalize output vector
|
|
float norm = 0.0;
|
|
for (int i = 0; i < ggml_nelements(ctrl_out); i++) {
|
|
float f = ggml_get_f32_1d(ctrl_out, i);
|
|
norm += f*f;
|
|
}
|
|
norm = sqrt(norm);
|
|
for (int i = 0; i < ggml_nelements(ctrl_out); i++) {
|
|
float f = ggml_get_f32_1d(ctrl_out, i);
|
|
ggml_set_f32_1d(ctrl_out, i, f / norm);
|
|
}
|
|
|
|
printf("%s: Done layer %d / %d\n", __func__, (int) il+1, (int) v_input.size());
|
|
}
|
|
}
|
|
|
|
}
|