diff --git a/tools/imatrix/imatrix.cpp b/tools/imatrix/imatrix.cpp index a7b9f644ab..ac02b53dfc 100644 --- a/tools/imatrix/imatrix.cpp +++ b/tools/imatrix/imatrix.cpp @@ -132,25 +132,34 @@ static std::vector compute_tensor_averages(const Stats & tstats) { const size_t n_mat = tstats.counts.size(); const size_t len = !tstats.activations.empty() ? tstats.activations.size() : tstats.values.size(); - if (len == 0 || len % n_mat != 0) return {}; + if (len == 0 || n_mat == 0 || len % n_mat != 0) { return {}; } + const size_t row = len / n_mat; std::vector vec; vec.reserve(len); if (tstats.activations.empty()) { + // Use mean of squares; fill zeros for experts with zero counts to preserve shape for (size_t m = 0; m < n_mat; ++m) { const float c = (float)tstats.counts[m]; - if (c <= 0) return {}; const size_t off = m * row; + if (c <= 0.0f) { + vec.insert(vec.end(), row, 0.0f); + continue; + } for (size_t j = 0; j < row; ++j) { vec.push_back(tstats.values[off + j] / c); } } } else { + // Use mean; fill zeros for experts with zero counts to preserve shape for (size_t m = 0; m < n_mat; ++m) { const float c = (float)tstats.counts[m]; - if (c <= 0) return {}; const size_t off = m * row; + if (c <= 0.0f) { + vec.insert(vec.end(), row, 0.0f); + continue; + } for (size_t j = 0; j < row; ++j) { vec.push_back(tstats.activations[off + j] / c); }