From 0985c7f7b7b7847078f757867cae8dfeebba2fe9 Mon Sep 17 00:00:00 2001 From: turboderp <11859846+turboderp@users.noreply.github.com> Date: Tue, 20 Jan 2026 19:09:54 +0100 Subject: [PATCH] Sampling: Add adaptive-P params --- backends/exllamav3/model.py | 4 ++++ backends/exllamav3/sampler.py | 8 ++++++++ common/sampling.py | 9 +++++++++ sampler_overrides/sample_preset.yml | 8 ++++++++ 4 files changed, 29 insertions(+) diff --git a/backends/exllamav3/model.py b/backends/exllamav3/model.py index 0d1780b..50c3045 100644 --- a/backends/exllamav3/model.py +++ b/backends/exllamav3/model.py @@ -918,6 +918,10 @@ class ExllamaV3Container(BaseModelContainer): if params.temperature_last: sampler_builder.temperature(params.temperature) + # Apply adaptive-P + if params.adaptive_target < 1.0: + sampler_builder.adaptive_p(params.adaptive_target, params.adaptive_decay) + # Build the sampler # Set greedy if temperature is 0 sampler = sampler_builder.build(params.temperature == 0) diff --git a/backends/exllamav3/sampler.py b/backends/exllamav3/sampler.py index 7b08a9b..11cce10 100644 --- a/backends/exllamav3/sampler.py +++ b/backends/exllamav3/sampler.py @@ -11,6 +11,7 @@ from exllamav3.generator.sampler import ( SS_TopP, SS_Sample, SS_Base, + SS_AdaptiveP ) @@ -43,9 +44,16 @@ class ExllamaV3SamplerBuilder: def greedy(self): self.stack.append(SS_Argmax()) + def adaptive_p(self, adaptive_target, adaptive_decay): + self.stack.append(SS_AdaptiveP(adaptive_target, adaptive_decay)) + def build(self, greedy): """Builds the final sampler from stack.""" + # Adaptive-P does categorical sampling already + if len(self.stack) and isinstance(self.stack[-1], SS_AdaptiveP): + return CustomSampler(self.stack) + # Use greedy if temp is 0 if greedy: return CustomSampler([SS_Argmax()]) diff --git a/common/sampling.py b/common/sampling.py index 49be5b9..af20004 100644 --- a/common/sampling.py +++ b/common/sampling.py @@ -275,6 +275,15 @@ class BaseSamplerRequest(BaseModel): ge=0, ) + adaptive_target: Optional[float] = Field( + default_factory=lambda: get_default_sampler_value("adaptive_target", 1.0) + ) + + adaptive_decay: Optional[float] = Field( + default_factory=lambda: get_default_sampler_value("adaptive_decay", 0.9) + ) + + @field_validator("top_k", mode="before") def convert_top_k(cls, v): """Fixes instance if Top-K is -1.""" diff --git a/sampler_overrides/sample_preset.yml b/sampler_overrides/sample_preset.yml index 0a2d05c..d7e788a 100644 --- a/sampler_overrides/sample_preset.yml +++ b/sampler_overrides/sample_preset.yml @@ -156,3 +156,11 @@ cfg_scale: negative_prompt: override: force: false + +# MARK: Adaptive-P +adaptive_target: + override: 1.0 + force: false +adaptive_decay: + override: 0.9 + force: false