Commit 7874988b4 for llama.cpp
commit 7874988b456dc265d468fe18f612e875f1ebc490
Author: Pranesh Gonegandla <pranesh.iitp@gmail.com>
Date: Fri Nov 13 12:25:32 2026 +0000
spec : Warn when --spec-draft-p-min is used with probabilistic draft sampling (#31294)
* spec : skip p_min for sampled MTP and DFlash2 drafts
Under rejection sampling the acceptance at a position is 1 - TV(p, q),
which the draft's top probability does not tell, so the p_min cutoff
dropped draft tokens the target would have accepted. Skip it when
MTP or DFlash2 samples the draft. draft-simple keeps it: each extra
draft token costs a full draft model pass.
* spec : replace the sampled-draft p_min skip with a warning
p_min behaves as on master again for every drafter and sampling mode.
Instead, log a warning when --spec-draft-p-min > 0 is used with
--spec-draft-sampling probabilistic, suggesting p_min 0: under
rejection sampling the draft's top probability does not tell how much
of the draft the target accepts. The cut is not skipped because with
MTP at long drafts it can still pay off.
* spec : warn about p_min only for drafters that use it
The n-gram drafters ignore p_min, and DSpark uses it as the cutoff of its confidence head, so the warning is skipped when only these are configured.
---------
Co-authored-by: Pranesh Gonegandla <pgonegandla@nvidia.com>
diff --git a/common/speculative.cpp b/common/speculative.cpp
index a7bd22112..63cb5e611 100644
--- a/common/speculative.cpp
+++ b/common/speculative.cpp
@@ -3019,6 +3019,26 @@ common_speculative * common_speculative_init(common_params_speculative & params,
return nullptr;
}
+ // the n-gram drafters ignore p_min, and DSpark uses it as the cutoff of its confidence head
+ const bool uses_p_min = std::any_of(configs.begin(), configs.end(), [](const common_speculative_config & c) {
+ switch (c.type) {
+ case COMMON_SPECULATIVE_TYPE_DRAFT_DSPARK:
+ case COMMON_SPECULATIVE_TYPE_NGRAM_SIMPLE:
+ case COMMON_SPECULATIVE_TYPE_NGRAM_MAP_K:
+ case COMMON_SPECULATIVE_TYPE_NGRAM_MAP_K4V:
+ case COMMON_SPECULATIVE_TYPE_NGRAM_MOD:
+ case COMMON_SPECULATIVE_TYPE_NGRAM_CACHE:
+ return false;
+ default:
+ return true;
+ }
+ });
+
+ if (params.draft.probabilistic && params.draft.p_min > 0.0f && uses_p_min) {
+ LOG_WRN("%s: --spec-draft-p-min %.2f stops sampled drafts early, consider setting it to 0 with --spec-draft-sampling probabilistic\n",
+ __func__, (double) params.draft.p_min);
+ }
+
common_speculative_ptr result(new common_speculative {
/* .dparams = */ common_speculative_draft_params_vec(n_seq),
/* .impls = */ std::move(impls),