@@ -127,6 +127,39 @@ static void process_tensor_name(const std::string & input, std::string & layer,
127127 }
128128}
129129
130+ static std::vector<float > compute_tensor_averages (const Stats & tstats) {
131+ if (tstats.counts .empty ()) return {};
132+ const size_t n_mat = tstats.counts .size ();
133+ const size_t len = !tstats.in_sum .empty () ? tstats.in_sum .size () : tstats.in_sum2 .size ();
134+
135+ if (len == 0 || len % n_mat != 0 ) return {};
136+ const size_t row = len / n_mat;
137+ std::vector<float > vec;
138+ vec.reserve (len);
139+
140+ if (!tstats.in_sum .empty ()) {
141+ for (size_t m = 0 ; m < n_mat; ++m) {
142+ const float c = (float )tstats.counts [m];
143+ if (c <= 0 ) return {};
144+ const size_t off = m * row;
145+ for (size_t j = 0 ; j < row; ++j) {
146+ vec.push_back (tstats.in_sum [off + j] / c);
147+ }
148+ }
149+ } else {
150+ for (size_t m = 0 ; m < n_mat; ++m) {
151+ const float c = (float )tstats.counts [m];
152+ if (c <= 0 ) return {};
153+ const size_t off = m * row;
154+ for (size_t j = 0 ; j < row; ++j) {
155+ vec.push_back (tstats.in_sum2 [off + j] / c);
156+ }
157+ }
158+ }
159+
160+ return vec;
161+ }
162+
130163static int compute_tensor_statistics (std::vector<tensor_statistics> & tstats, const std::string & name, const Stats & e) {
131164 if (e.in_sum2 .size () % e.counts .size () != 0 ) {
132165 LOG_ERR (" %s: activation size mismatch for tensor %s (%zu vs %zu)\n " , __func__, name.c_str (), e.counts .size (), e.in_sum2 .size ());
@@ -222,33 +255,6 @@ static int compute_tensor_statistics(std::vector<tensor_statistics> & tstats, co
222255static void compute_layer_statistics (std::vector<tensor_statistics> & tstats) {
223256 static const std::regex pattern (R"( blk\.(\d+)\.)" );
224257
225- auto build_avg = [](const Stats & s) -> std::vector<float > {
226- if (s.counts .empty ()) return {};
227- const size_t n_mat = s.counts .size ();
228- const size_t len = !s.in_sum .empty () ? s.in_sum .size ()
229- : s.in_sum2 .size ();
230- if (len == 0 || len % n_mat != 0 ) return {};
231- const size_t row = len / n_mat;
232- std::vector<float > v;
233- v.reserve (len);
234- if (!s.in_sum .empty ()) {
235- for (size_t m = 0 ; m < n_mat; ++m) {
236- const float c = (float )s.counts [m];
237- if (c <= 0 ) return {};
238- const size_t off = m*row;
239- for (size_t j = 0 ; j < row; ++j) v.push_back (s.in_sum [off+j]/c);
240- }
241- } else {
242- for (size_t m = 0 ; m < n_mat; ++m) {
243- const float c = (float )s.counts [m];
244- if (c <= 0 ) return {};
245- const size_t off = m*row;
246- for (size_t j = 0 ; j < row; ++j) v.push_back (s.in_sum2 [off+j]/c);
247- }
248- }
249- return v;
250- };
251-
252258 // compute the cosine similarity between the same tensors in consecutive layers
253259 for (auto & ts : tstats) {
254260 ts.cossim = 0 ;
@@ -261,8 +267,8 @@ static void compute_layer_statistics(std::vector<tensor_statistics> & tstats) {
261267 auto prev = std::find_if (tstats.begin (), tstats.end (),
262268 [tname](const tensor_statistics & t) { return t.tensor == tname; });
263269 if (prev == tstats.end ()) continue ;
264- const auto curr_avg = build_avg (ts.stats );
265- const auto prev_avg = build_avg (prev->stats );
270+ const auto curr_avg = compute_tensor_averages (ts.stats );
271+ const auto prev_avg = compute_tensor_averages (prev->stats );
266272 if (curr_avg.size () == prev_avg.size () && !curr_avg.empty ()) {
267273 float dot_prod = 0 .0f , vec1 = 0 .0f , vec2 = 0 .0f ;
268274 for (size_t i = 0 ; i < curr_avg.size (); ++i) {
@@ -288,8 +294,8 @@ static void compute_layer_statistics(std::vector<tensor_statistics> & tstats) {
288294 auto prev = std::find_if (tstats.begin (), tstats.end (),
289295 [tname](const tensor_statistics & t) { return t.tensor == tname; });
290296 if (prev == tstats.end ()) continue ;
291- const auto cur_avg = build_avg (ts.stats );
292- const auto prev_avg = build_avg (prev->stats );
297+ const auto cur_avg = compute_tensor_averages (ts.stats );
298+ const auto prev_avg = compute_tensor_averages (prev->stats );
293299 if (cur_avg.empty () || prev_avg.empty () || cur_avg.size () != prev_avg.size ()) continue ;
294300
295301 float dist = 0.0 ;
0 commit comments