pgw#1139 (ie#657): the flow gate reads scheduler CAPABILITY, not the class name — 0.109.0 -> 0.110.0 - #656
Merged
Merged
Conversation
…class name — 0.109.0 -> 0.110.0
`clone_scheduler` admitted an objective="flow" checkpoint only when
`cls.__name__.startswith("FlowMatch")`. The official Wan solver is
`UniPCMultistepScheduler(prediction_type="flow_prediction",
use_flow_sigmas=True, flow_shift=5.0)` — upstream's own scheduler_config.json,
byte-identical in our mirrors — so every request against it raised before the
first denoise step, and the fatal requeued onto a fresh H100 per attempt.
Measured blast radius on the master stack: wan-2.2's `text-image-to-video` has
ONE request row ever (cancelled), `video-to-video` and `image-to-video` have
none. A name test refuses a config-declared flow sampler for EVERY consumer, so
the fix is the gate, not a third endpoint-local `_serving_view` bypass.
`flow_capable(cls, config)` reads the facts instead: flow by construction (the
`FlowMatch*` family) or flow by declaration — `use_flow_sigmas` /
`prediction_type="flow_prediction"` in the RESOLVED config AND a class that
takes `use_flow_sigmas`. The capability half is load-bearing: every diffusers
scheduler accepts `prediction_type`, so a declaration alone would let a flow
config carried onto EulerAncestral read as flow while from_config dropped it.
What the gate still refuses is unchanged, and now tested both ways: a diffusion
sampler over a flow checkpoint, a flow-CAPABLE class its config never declares,
a non-diffusers scheduler declaring nothing. Three new tests are red on the
pre-fix tree — the acceptance one with the production error verbatim — and the
three refusal tests pass on both sides.
ie#535's second half rides along: `shift` and `flow_shift` are the same knob
under two upstream spellings and from_config drops the one the class does not
take, so a published shift was ignored rather than applied. A declared shift is
renamed to the spelling the class honours; nothing is invented.
The cut carries pgw#1132 as well (merged after 0.109.0 was already published).
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.
The defect, measured on a billed request
3b12a2d6-b3aa-4e46-9323-03f70ae44fca(H100, whole 5B tree staged, parameters logged) raised before the first denoise step:view.py:241gatedobjective=="flow"oncls.__name__.startswith("FlowMatch")— a NAME test. The tree's scheduler is upstream's ownWan-AI/Wan2.2-TI2V-5B-Diffusers@b8fff731:scheduler/scheduler_config.json: UniPC withprediction_type: "flow_prediction",use_flow_sigmas: true,flow_shift: 5.0. It IS the official Wan flow solver; it just isn't spelled like one. A fatal that requeues buys a fresh H100 per attempt.Realized blast radius, off the master stack's whole request table: wan-2.2's
text-image-to-videohas ONE row ever (cancelled),video-to-videoandimage-to-videohave NONE. No TI2V-5B frame has ever been rendered. Only the-turbosiblings serve, via an endpoint-local_serving_viewthat bypasses the SDK.The fork, and why this side of it
A third endpoint-local bypass would fix three call sites and leave the trap armed for every other consumer. A name test that refuses a config-declared flow sampler is a defect wherever it fires — so the gate is what changes.
flow_capable(cls, config): flow BY CONSTRUCTION (FlowMatch*has no other mode) or flow BY DECLARATION — the resolved config declaresuse_flow_sigmas/prediction_type="flow_prediction"and the class takesuse_flow_sigmas. The capability half is the whole check: every diffusers scheduler acceptsprediction_type, so a declaration alone would let a flow config carried ontoEulerAncestralDiscreteSchedulerread as flow whilefrom_configsilently dropped it.What the gate still protects — tested both ways
flow_capablenot satisfied byprediction_typealonesampler="euler_a"over that same flow checkpointThe three refusal rows passing on both sides is what proves the gate was narrowed correctly rather than opened.
ie#535's second half
shift(FlowMatch*) andflow_shift(the multistep solvers) are the same flow-sigma knob;from_configdrops the spelling the target class does not take, so a repo publishing a shift onto a UniPC mirror had it ignored rather than refused. A declared shift is renamed to the spelling the class honours. Nothing is invented; a class taking neither is left alone.The cut
0.109.0 -> 0.110.0,
uv.lockrelocked in the same commit. The cut also carries pgw#1132, which merged after 0.109.0 was already published. A pod run needs this number (ie#657's canary), which is the batching rule's condition.Repin train owed: the fleet is pinned
gen-worker==0.106.0(fleet1060/ie#645). ie#657 repins wan-2.2 alone to reach a pod; the fleet train to 0.110.0 is a separate lane and is noted in the tracker.