Nodes/Anima Artist Mixer Forge/Anima Artist Options (Expert)
ComfyUI Node

Anima Artist Options (Expert)

Stabilizers, VRAM controls, and norm locks for Anima mixing

By Rinne414·Created 2 months ago·Updated about a month ago· 5
Anima Artist Options (Expert)
    • advanced_options
    start_block0
    end_block-1
    start_percent0.000
    end_percent1.000
    normalize_weightstrue
    artist_ema_alpha0.00
    lowrank_k1
    artist_static_capturefalse
    static_capture_k6
    static_capture_modeoutput
    static_capture_blend_alpha0.25
    artist_anchor_qfalse
    anchor_seeds_count1
    anchor_user_blend0.00
    anchor_deep_layer_threshold-1
    anchor_refresh_each_stepfalse
    stabilizer_end_percent1.00
    layer_filter
    compatibility_modefalse
    max_batch_artists0
    artist_q_reusefalse
    low_vram_cachefalse
    match_base_normfalse
    anchor_base_norm_reffalse
    norm_lock_modetoken
    norm_lock_scopeper_artist
    contribution_balancefalse
    contribution_balance_alpha1.00
    mixed_delta_capfalse
    mixed_delta_cap_ratio1.00

    This is the basement. AnimaArtistOptions (Expert) is where the pack's real machinery lives: cross-seed style stabilizers, norm locking, VRAM limits, and the A/B switches the presets deliberately keep off by default. If AnimaArtistPreset is "pick a mode", this node is "build a mode from parts". Most people should not be here - the README's own advice is that SimpleOptions handles the common tweaks and this panel is for stabilizer A/B and debugging. But if your mixes keep flip-flopping between dominant artists across seeds, this is where the fix is.

    The layout basics

    start_block/end_block and start_percent/end_percent bound where (DiT blocks) and when (sampling progress) the patch applies. normalize_weights toggles relative-vs-absolute weights. layer_filter overrides the block range with a list like 0,3,5-10,-1.

    The stabilizers, light to heavy

    • match_base_norm (+ norm_lock_mode token/row, norm_lock_scope per_artist/mixed/both) - rescales the mixed artist attention output to the base's RMS energy. Stops one seed-specific artist spike from dominating. The "v26 norm-lock" path.
    • artist_ema_alpha (0–0.95) - temporal EMA smoothing across sampling steps. 0.3–0.5 is light; past 0.8 style starts lagging content.
    • lowrank_k - only matters with combine_mode=lowrank_avg. k=1 gives one consensus direction (most stable, most homogeneous); k≥N equals plain output_avg.
    • artist_static_capture + static_capture_k (default 6) + static_capture_mode - freezes artist attention after K warmup steps. Also a 30–50% speedup. Incompatible with concat_with_base (auto-ignored) and with EMA.
    • artist_anchor_q + anchor_seeds_count + anchor_user_blend + anchor_deep_layer_threshold + anchor_refresh_each_step - the heaviest stabilizer: artist attention uses a fixed-seed anchor hidden state as Q, decoupling style from your seed. Costs one extra forward on first generation, then caches. Mutually exclusive with static_capture (anchor wins).
    • stabilizer_end_percent - lets EMA/static/anchor stop early in sampling; try 0.4–0.6 when late-step samplers need dynamic motion.

    VRAM and safety

    max_batch_artists caps how many artists run per batched forward (0 = auto, adapting to free VRAM on GPU). low_vram_cache pushes the static/anchor caches into system RAM. compatibility_mode forces the tolerant concat path for regional-prompt setups. The experimental artist_q_reuse (reuse Q across artists) is off by default for a reason - it shifts same-seed renders and bypasses TeaCache-style patches.

    Outputs

    One output: advanced_options (ANIMA_OPTS) → AnimaArtistPresetApply.advanced_options or AnimaArtistCrossAttn.advanced_options.

    Install

    Manager → search "Anima Artist Mixer Forge", or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/peter119lee/Anima-Artist-Mixer-Forge
    

    then restart. No extra deps; Anima files + Anima-compatible CLIP loader required. Don't run alongside the original Anima-Artist-Mixer.

    My take

    If I had to pick two things to try first here, it's match_base_norm with token/per_artist locking for seed-to-seed drift, then artist_ema_alpha around 0.4. artist_anchor_q is a sledgehammer - it stabilizes style hard but strokes can stop tracking the current image; that's what anchor_user_blend is for. And note the honest signal in the README: artist_static_capture used to be a default and got pulled back because multi-artist evidence showed it over-constrains style. When the authors demote their own stabilizer, listen.

    CategoryAnima/Setup

    Inputs (30)

    NameTypeDefaultDescription
    start_blockINT00–63First patched block (inclusive). 0 = first layer.
    end_blockINT-1-1–63Last patched block (inclusive). -1 = last layer.
    start_percentFLOAT0.0000–1Sampling-progress start. 0.0 = beginning.
    end_percentFLOAT1.0000–1Sampling-progress end. 1.0 = end of sampling.
    normalize_weightsBOOLEANtrueTrue: weights become relative proportions. False: weights act as independent strengths. If the artist_chain uses ::weight syntax, this switch is bypassed at runtime (explicit weights stay absolute).
    artist_ema_alphaFLOAT0.000–0.95Cross-step EMA smoothing (fusion interpolate/base_preserve). Smooths each layer's artist_total across steps to reduce cross-seed dominant-artist flips. 0.0: off (default) 0.3-0.5: light smoothing 0.5-0.8: medium-heavy >0.8: strong; style may lag behind base content A new sampling run (sigma jump) resets the cache.
    lowrank_kINT11–32LoRA-style low-rank dimension (combine_mode=lowrank_avg only). Projects N artist deltas onto the top-k principal directions. k=1: single consensus direction, most stable, most homogeneous k=2-3: keeps main directions, allows some per-artist variety k>=N: equivalent to output_avg (no projection) Falls back to output_avg automatically when N=1.
    artist_static_captureBOOLEANfalseH' temporal average: accumulate artist attention over the first K steps, then freeze and reuse the average (also a 30-50% speedup). K set by static_capture_k. Compatible: output_avg / lowrank_avg + interpolate / base_preserve. Incompatible: fusion=concat_with_base (ignored automatically). Mutually exclusive with EMA (EMA is ignored when on).
    static_capture_kINT61–12Steps accumulated before freezing (artist_static_capture only). K=1: single-point cache (fastest, most cross-seed drift) K=6: recommended default K=8-12: stronger drift suppression, more warmup cost If total steps < K it keeps averaging without freezing.
    static_capture_modeCOMBOoutputWhat static_capture freezes. output: freeze the full artist attention output (legacy, strongest lock) delta: freeze artist-base delta and add it to the current base output (less content smearing, weaker lock) blend: interpolate output and delta paths using static_capture_blend_alpha blend_perp: like blend, but only reintroduces base motion perpendicular to the frozen style delta. Advanced A/B mode; not the stable_seed default.
    static_capture_blend_alphaFLOAT0.250–1Used by static_capture mode blend / blend_perp. 0 = legacy output freeze, 1 = maximum base-motion return. Lower values keep the style lock stronger; higher values protect content motion but can reintroduce drift.
    artist_anchor_qBOOLEANfalseAnchor-Q: artist cross-attention uses a fixed-seed anchor hidden state as Q, decoupling style mixing from the user seed. The strongest built-in stabilizer, but not a full seed lock. Cost: one extra full forward on the first generation; same prompt across seeds then hits the cache for free. Mutually exclusive with static_capture (anchor wins). Incompatible with fusion=concat_with_base. Risk: stroke placement may track the current image less closely; raise anchor_user_blend if that bothers you.
    anchor_seeds_countINT11–4Number of fixed seeds for the anchor pre-run (anchor_q only). 1: single seed 2-4: average several anchors to reduce single-seed bias. Pre-run time scales with the count; cached afterwards.
    anchor_user_blendFLOAT0.000–1Anchor / user-x blend (anchor_q only). Q = blend * user_x + (1-blend) * anchor_x 0.0: pure anchor (most stable across seeds) 0.3-0.5: balanced stability vs stroke fit 1.0: pure user x (equivalent to anchor_q off)
    anchor_deep_layer_thresholdINT-1-1–64Use the anchor only in shallow layers (anchor_q only). -1: every layer uses the anchor N>=0: layers < N use the anchor, layers >= N use user x. Shallow layers set style direction; deep layers fit strokes. Example: 28-block model with N=14 anchors the first half.
    anchor_refresh_each_stepBOOLEANfalseRefresh the fixed-seed anchor at every sampling step instead of only the first step. This gives the anchor a timestep-matched Q reference and can reduce drift further, but costs extra forwards every step. Advanced A/B option.
    stabilizer_end_percentFLOAT1.000–1Sampling progress where cache-based stabilizers stop. Applies to EMA, static_capture, and anchor_q. 1.0: stabilizers run for the whole sampling pass. 0.4-0.6: useful when late-step samplers need dynamic step-to-step motion.
    layer_filteroptSTRINGAdvanced layer selection. Comma-separated block indices, ranges and negative indices supported. Example: '0,3,5-10,-1'. Overrides start_block/end_block. Empty = inactive.
    compatibility_modeoptBOOLEANfalseCompatibility-safe mode. Forces concat + concat_with_base and disables EMA / static_capture / anchor_q to minimize conflicts with regional prompting, Forge Couple-style routing, and other attention patch nodes.
    max_batch_artistsoptINT00–32Cap on how many artists run in one batched forward. 0 = automatic: on GPU the chunk size adapts to free VRAM (v27.5); elsewhere no cap. Set 2-8 to force a fixed cap with many artists at high resolution.
    artist_q_reuseoptBOOLEANfalseExperimental speed-up: project attention Q once per step and reuse it for every artist K/V (numerically validated on first use). OFF by default: the fp16 kernel difference shifts same-seed renders (~17% of pixels in live A/B) and it bypasses TeaCache-style attention patches.
    low_vram_cacheoptBOOLEANfalseStore static-capture and anchor caches in system RAM instead of VRAM. Saves hundreds of MB at high resolution for a small per-step transfer cost.
    match_base_normoptBOOLEANfalseRescale the mixed artist attention output to the base output's RMS energy (clamped to 0.5-2.0x). Keeps the style direction but stops activation-energy mismatch from compounding across layers. Enable this explicitly when you want v26 norm-lock stabilization.
    anchor_base_norm_refoptBOOLEANfalseWhen anchor_q and match_base_norm are both enabled, match artist RMS against the fixed-seed anchor base output instead of the current seed's base output. This reduces cross-seed style-strength drift more than standard match_base_norm, but may make strokes follow the anchor reference more.
    norm_lock_modeoptCOMBOtokenGranularity for match_base_norm. token: match each image token's RMS to base (strongest local style-strength stability) row: legacy whole-row RMS matching
    norm_lock_scopeoptCOMBOper_artistWhere to apply norm locking. per_artist: normalize each artist output before mixing, so one seed-specific artist spike cannot dominate mixed: normalize only the final mixed output (legacy) both: strongest clamp, highest chance of over-uniform style
    contribution_balanceoptBOOLEANfalseBalance each artist's measured delta against the base before mixing. Optional guard for seed-specific artist dominance flips.
    contribution_balance_alphaoptFLOAT1.000–1Strength of contribution_balance. 0 = off, 1 = full per-token delta balancing.
    mixed_delta_capoptBOOLEANfalseInference-time guard for style drift. Limits the final mixed artist delta relative to the base attention energy before fusion. Default off for A/B testing.
    mixed_delta_cap_ratiooptFLOAT1.000–4Maximum final artist-delta RMS as a multiple of base RMS. Lower values preserve composition more; higher values allow stronger style changes.

    Outputs (1)

    NameTypeDescription
    advanced_optionsANIMA_OPTS