AD Per Block+ (SDXL) ππ π
One control per SDXL UNet stage, instead of 16
- down_0
- down_1
- down_2
- mid
- up_0
- up_1
- up_2
- PER_BLOCK
Displayed as AD Per Block+ (SDXL), this is the middle rung of this pack's per-block tuning ladder for an SDXL motion module: seven addressable slots, one per structural stage, instead of three (the plain AD Per Block) or 16 (AD Per Block++, the individual-sub-block version).
Why the middle level exists
SDXL's UNet has three down (encoder) stages, one mid (bottleneck) block, and three up (decoder) stages - fewer than SD 1.5's four-and-four, which is also why SDXL's low-level per-block node has 16 sockets instead of 21. Each down/up stage here is itself built from two or three sub-blocks, which is the finer split ADE_PerBlock_SDXL_LowLevel exposes individually. Most of the time you don't need that resolution: if you've traced a motion issue to "somewhere in the decoder" rather than a specific sub-block within it, targeting up_1 or up_2 directly is faster than picking between two or three sub-block sockets.
Each slot takes an AD_BLOCK, built with ADE_ADBlockCombo or ADE_ADBlockIndiv elsewhere in your graph, same as every other level of this family.
One thing worth knowing before investing tuning time here at all: AnimateDiff's SDXL motion module never left beta, per our knowledge base - fewer native frames than SD 1.5, more VRAM, less community development. Per-block tuning can genuinely help compensate, but you're working with a rougher base than SD 1.5 gives you, and it's worth confirming your basics (matching beta_schedule, a real SDXL checkpoint) before assuming the fix lives at the block level.
Inputs and output
All seven optional and independent, type AD_BLOCK each:
down_0,down_1,down_2- one per encoder stage.mid- the bottleneck.up_0,up_1,up_2- one per decoder stage.
Leave any unwired and that stage keeps default behavior. Output is a single PER_BLOCK, feeding an Apply node's per_block input or a keyframe's per_block_replace.
How to install it
ComfyUI Manager: search AnimateDiff Evolved, confirm author Kosinkadink, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved
Needs an SDXL motion module with beta_schedule set to autoselect or linear (AnimateDiff-SDXL) on the loader, per the README, and a matching SDXL checkpoint underneath.
Common issues & troubleshooting
Not sure whether to start here or go straight to the 16-slot version. Start here. If dampening or boosting a whole stage - up_1 and up_2, say - solves what you're chasing, you're done. Only drop to ADE_PerBlock_SDXL_LowLevel if you need to separate the sub-blocks inside one stage.
No clean map from symptom to stage. True across this whole family - down stages tend toward broader structure, up stages toward finer detail, mid in between, but neither the README nor community discussion documents it precisely. Change one stage at a time and compare renders.
Configured stages, no visible change. Confirm PER_BLOCK actually reaches your Apply node's per_block input or a keyframe's per_block_replace slot.
Even seven knobs is more than needed. Try the plain AD Per Block (three knobs: down/mid/up) first, or reconsider whether a global scale_multival/effect_multival on your Apply node already solves it - per-block tuning at any level is a deliberate escalation, and doubly worth confirming you need it given the SDXL module's rougher baseline to begin with.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| down_0opt | AD_BLOCK | β | |
| down_1opt | AD_BLOCK | β | |
| down_2opt | AD_BLOCK | β | |
| midopt | AD_BLOCK | β | |
| up_0opt | AD_BLOCK | β | |
| up_1opt | AD_BLOCK | β | |
| up_2opt | AD_BLOCK | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PER_BLOCK | PER_BLOCK | β |