From 9c7d8b07cca32864439f72f5985665e318d2883e Mon Sep 17 00:00:00 2001 From: KeinNiemand <18308201+KeinNiemand@users.noreply.github.com> Date: Sat, 2 May 2026 15:08:49 +0200 Subject: [PATCH] perplexity : fix large-vocab logit offset overflow (#1717) Co-authored-by: Codex --- examples/perplexity/perplexity.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/perplexity/perplexity.cpp b/examples/perplexity/perplexity.cpp index 9d3a392d..91b205ee 100644 --- a/examples/perplexity/perplexity.cpp +++ b/examples/perplexity/perplexity.cpp @@ -207,7 +207,9 @@ static void process_logits(std::ostream& out, int n_vocab, const float * logits, break; } lock.unlock(); - const double v = log_softmax(n_vocab, logits + i*n_vocab, log_probs.data() + int64_t(i)*nv, tokens[i+1]); + const size_t logits_offset = size_t(i)*size_t(n_vocab); + const size_t probs_offset = size_t(i)*size_t(nv); + const double v = log_softmax(n_vocab, logits + logits_offset, log_probs.data() + probs_offset, tokens[i+1]); local_nll += v; local_nll2 += v*v; } @@ -453,9 +455,11 @@ static results_perplexity perplexity_v2(llama_context * ctx, const gpt_params & for (int j = n_ctx - params.ppl_stride - 1; j < n_ctx - 1; ++j) { // Calculate probability of next token, given the previous ones. + const size_t offset = size_t(j)*size_t(n_vocab); + const float * tok_logits_begin = logits.data() + offset; const std::vector tok_logits( - logits.begin() + (j + 0) * n_vocab, - logits.begin() + (j + 1) * n_vocab); + tok_logits_begin, + tok_logits_begin + n_vocab); const float prob = softmax(tok_logits)[tokens[start + j + 1]]; logit_history[start + j + 1] = tok_logits[tokens[start + j + 1]];