mirror of
https://github.com/vladmandic/automatic
synced 2026-09-05 04:20:44 +02:00
3302e78af6
Replace the six closure hijacks stacked in devices.set_sdpa_params with a registry of declarative backends and one router installed in their place. Each backend declares the constraints its closure carried as a predicate, a priority matching its old stacking position, and a prepare step that imports and configures the implementation; the router walks the prepared entries by priority and hands declined calls to the terminal backend (dynamic, flex) or the original sdpa, so fallback is the router's job rather than each closure's. - parity held: gates transcribed literally, the same kernel kwargs, enable_gqa passed to the original only when set, torch_info keeps the last prepared backend, the dynamic pin still set - a backend enabled on a platform without it warns instead of silently doing nothing - the legacy set_* entry points are gone; devices.py installs the router - test/test-attention-router.py checks every override subset against the old stacking order, gate parity over 16,000 shape cases, dispatch, terminal handoff and prepare isolation, offline
12 lines
522 B
Python
12 lines
522 B
Python
from modules.attention.registry import AttentionBackend, Platform
|
|
|
|
|
|
def prepare(platform: Platform, original): # pylint: disable=unused-argument
|
|
from modules import devices
|
|
devices.sdpa_pre_dyanmic_atten = original # the sliced path calls this pin for every slice
|
|
from modules.sd_hijack_dynamic_atten import dynamic_scaled_dot_product_attention
|
|
return dynamic_scaled_dot_product_attention
|
|
|
|
|
|
backend = AttentionBackend(name='dynamic', label='Dynamic attention', priority=10, prepare=prepare, terminal=True)
|