Nodes/AnimateDiff Evolved/AD Per Block+ (SDXL) πŸŽ­πŸ…πŸ…“
ComfyUI Node Runs on cloud

AD Per Block+ (SDXL) πŸŽ­πŸ…πŸ…“

One control per SDXL UNet stage, instead of 16

By KosinkadinkΒ·Created 3 years agoΒ·Updated 12 days agoΒ· 3,519
AD Per Block+ (SDXL) πŸŽ­πŸ…πŸ…“
  • 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.

CategoryAnimate Diff πŸŽ­πŸ…πŸ…“/per block

Inputs (7)

NameTypeDefaultDescription
down_0optAD_BLOCKβ€”
down_1optAD_BLOCKβ€”
down_2optAD_BLOCKβ€”
midoptAD_BLOCKβ€”
up_0optAD_BLOCKβ€”
up_1optAD_BLOCKβ€”
up_2optAD_BLOCKβ€”

Outputs (1)

NameTypeDescription
PER_BLOCKPER_BLOCKβ€”