Repository navigation
ExLlamaV3: aging-LFU, warm prefixes, and FlashStates hybrid state options - #519
Open
auryn-macmillan wants to merge 2 commits into
Open
auryn-macmillan wants to merge 2 commits into
auryn-macmillan wants to merge 2 commits into
Conversation
added 2 commits
November 10, 2026 16:51
- Add memory.aging_lfu and the aging_* knobs to MemoryConfig and pass them to AsyncGenerator, so exllamav3 can score eviction candidates by decaying reuse credit instead of raw recency. - Add memory.warm_prefixes / warm_prefix_token_ids and prefill them in a background task after load, before the first request, so their pages (and weights) are resident again after a restart. - Replay prefixes captured from earlier cache hits by the engine (pagetable.stored_prefixes()) within memory.warm_prefix_max_tokens, in most-recently-written order, so a restart does not spend minutes re-prefilling stale chains before serving. - Cancel a running warmup on unload so no job outlives its generator, and report the warmed token total.
Pass recurrent_frontier_checkpoints, recurrent_eviction and prefill_cost_coefficients from the model config/load request to the exllamav3 Generator, and log the effective hybrid-state settings. Warn when frontier checkpoints are enabled without a system-memory K/V tier, which is needed to store a partially filled page.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Expose the new exllamav3 prompt-cache and hybrid-state options in TabbyAPI, and prefill warm prefixes in the background after a model load.
Requires the corresponding exllamav3 PRs (turboderp-org/exllamav3#594, turboderp-org/exllamav3#595): the new
aging_*constructor kwargs and the hybrid-state options are passed toAsyncGeneratorat load, so an engine without them raisesTypeErrorrather than silently ignoring the settings. The effective-settings log and the warm-prefix task guard the newerGeneratorattributes withgetattr, so a partially-updated engine still loads.What changed
common/config_models.py+endpoints/core/types/model.pymemory.aging_lfu,aging_half_life_hours,aging_hit_cap_pages,aging_weight_cap,aging_persist_dir,aging_capture_prefixes,aging_prefix_min_tokens,aging_prefix_max_tokens,aging_prefix_max_entries, passed through toAsyncGenerator.model.recurrent_frontier_checkpoints,recurrent_eviction("lru"/"gds"),prefill_cost_coefficients[D, E], in both the model config andModelLoadRequest.memory.warm_prefixes(prompt strings, tokenizer-encoded) andmemory.warm_prefix_token_ids(exact IDs, no tokenizer step) are prefilled once in a background task after load, so their pages (and aging-LFU weights) are resident before the first request. Prefixes captured by the engine from earlier hits (pagetable.stored_prefixes()) are replayed too, in most-recently-written order, withinmemory.warm_prefix_max_tokens; configured prefixes are pinned and not budget-limited. A running warmup is cancelled on unload so no job outlives its generator, and the warmed token total is logged.xlogger.info, which accepts at most two and crashed generator creation at model load. Format the line before logging.sysmem_kv_cache: 0now log that partial pages cannot be stored (only page-aligned checkpoints will be kept).Example config
Testing
python -m compileall -q backends common endpointson the rebased branch.pytest tests/test_generator_recovery.py -qfrontier=on, eviction=gds; 31,040-token follow-up resumed with 31,031 cached tokens and a 0.08 s prefill; unload cancels the warmup task cleanly.memory.aging_lfu/aging_persist_dir.