Nodes/ComfyUI-AceStep_SFT/AceStep 1.5 SFT Generate Advanced
ComfyUI Node

AceStep 1.5 SFT Generate Advanced

The KSampler-Advanced treatment, finally, for a music model

By jeankassio·Created 8 months ago·Updated 7 days ago· 65
AceStep 1.5 SFT Generate Advanced
  • model
  • positive
  • negative
  • vae
  • latent_or_audio
  • task
  • reference_audio
  • model
  • vae
  • positive
  • negative
  • latent
  • audio
◄add_noiseenable►
◄noise_seed0►
◄steps50►
◄cfg7.0►
◄sampler_namejkass_quality►
◄schedulerace_step►
◄start_at_step0►
◄end_at_step10000►
◄return_with_leftover_noisedisable►
◄duration60.0►
◄infer_methodode►
◄guidance_modeapg►
◄batch_size1►
◄latent_shift0.00►
◄latent_rescale1.00►
◄fade_in_duration0.0►
◄fade_out_duration0.0►
◄use_tiled_vaetrue►
◄unload_models_after_generatefalse►
◄voice_boost0.0►
◄apg_eta0.00►
◄apg_momentum-0.75►
◄apg_norm_threshold2.5►
◄guidance_interval1.00►
◄guidance_schedulenormal►
◄min_guidance_scale3.0►
◄guidance_scale_text-1.0►
◄guidance_scale_lyric-1.0►
◄omega_scale0.00►
◄erg_scale0.00►
◄cfg_interval_start0.00►
◄cfg_interval_end1.00►
◄shift3.0►
◄noise_sourceofficial►
◄timbre_cls_tokentrue►
◄guidance_rescale0.00►
◄schedule_precisionfloat32►
◄apg_norm_rms0.000►
◄reference_xl_attentiontrue►
◄reference_guidance_scale1.0►
◄reference_timbre_repeats1►

If you've ever split a 50-step image generation across two KSampler Advanced nodes, you already understand this node. It's Generate with the noise and step-range controls exposed: add_noise, noise_seed, start_at_step, end_at_step, return_with_leftover_noise. Everything else - the sampler list including the bundled jkass_quality, the guidance controls, the outputs - behaves exactly as the regular Generate does.

It exists for two-stage sampling - run half the steps, inspect the latent, finish with different settings - and for pipelines that hand a latent from one stage to the next. What it is not is a "better" Generate: the author says it plainly, splitting stages "adds control, not a guaranteed quality gain."

What changes versus Generate

Under the hood it's a subclass that strips denoise (there's no single denoise value when you're slicing a schedule) and removes the task input entirely, so native Cover and Inpaint tasks must use regular Generate. It then calls the same sampler with a full denoise of 1.0, disable_noise from your add_noise choice, and force_full_denoise from return_with_leftover_noise. Your steps value still defines the whole schedule - start_at_step and end_at_step slice it rather than restart it. guidance_schedule and the LM-code handoff also read the full schedule, which is what stops a split run from redoing the guidance ramp in stage two.

The two-stage recipe

Same sampler, scheduler, shift and noise_seed in both nodes, steps=50:

| Stage | add_noise | start_at_step | end_at_step | return_with_leftover_noise | |-------|-------------|-----------------|---------------|------------------------------| | First | enable | 0 | 25 | enable | | Final | disable | 25 | 50 | disable |

Connect the first node's latent output to the second node's latent_or_audio, and hang the VAE off the final stage only. An unfinished range - one that still ends above zero noise, or one that executes no steps at all - skips audio decoding even with a VAE plugged in, so a mid-pipeline decode just isn't a thing you should expect.

Outputs

model, vae, positive and negative pass through for chaining. latent is the raw diffusion result - the one you chain into the next stage. audio is decoded audio, and it only appears when a VAE is connected; without one the node prints a note to console and hands back nothing to wire.

The pack's own knobs, and why they're there

This node also carries the newer widgets the author added while chasing ACE-Step 1.5 SFT quality, and two of them are on by default for good reason.

timbre_cls_token=true restores a learned summary token that the timbre encoder in this ComfyUI core drops - it gets prepended before audio and RoPE positions, matching the official XL implementation. schedule_precision=float32 is the other: building the ace_step schedule in BF16 loses precision before it's converted, and CPU checks at shift=3 found 3, 13 and 35 repeated-sigma intervals for 50, 100 and 200 steps - points where the integrator simply doesn't advance. Float32 is the default now; model reproduces the old behaviour if you want to A/B it.

Then the experimental ones: guidance_rescale (0 by default; try 0.25 and 0.5 with identical seeds - it moves the guided velocity's standard deviation toward the conditional prediction's, at no extra model evaluations), apg_norm_rms (0 keeps the fixed L2 cap from apg_norm_threshold; positive values replace it with an RMS cap independent of duration - not an audio volume control), and guidance_mode=apg_denoised_joint, which projects clean predictions across channels and time together. The author is refreshingly blunt that musical improvement from these needs listening comparisons, not test suites.

Install

Manager search ComfyUI-AceStep_SFT, or:

cd ComfyUI/custom_nodes
git clone https://github.com/jeankassio/ComfyUI-AceStep_SFT.git

Install requirements into ComfyUI's Python (transformers>=4.52.0, torchaudio, librosa, soundfile, numpy, pyyaml), drop in the model files (acestep_v1.5_sft.safetensors or the merged SFT+Turbo build, the Qwen encoders, ace_1.5_vae.safetensors), then restart. You need a ComfyUI with native ACE-Step 1.5 support; the pack layers on the core's ACE modules.

Common issues

jkass_quality is missing, or you have two of them. It's bundled from the author's JK-AceStep-Nodes pack, and the local copy doesn't touch the global sampler registry - so you get exactly one entry whether or not JK is installed separately. If the sampler dropdown looks stale, restart; the pack appends new widgets after existing ones and saved workflows keep their old selections.

An old workflow won't run. ace_step_euler was removed - select jkass_quality and re-save. Values from dropped widgets (enable_normalization, velocity_ema_factor and friends) don't come back; output peak protection stays.

Console warns that your duration doesn't match the LM encoding. Keep TextEncode's and Generate's duration equal, or set Generate's to 0 to inherit.

The continuation doesn't sound like an unbroken run. Sometimes it won't. APG momentum, multistep solver history and SDE noise state may reset at the node boundary; deterministic standard_cfg with the Heun-based jkass_quality survives continuation best. Use stages when you need a decision point, not as a ritual.

Categoryaudio/AceStep SFT

Inputs (48)

NameTypeDefaultDescription
modelMODELAceStep 1.5 diffusion model (from Load Diffusion Model or with LoRA applied).
positiveCONDITIONINGPositive conditioning from AceStep 1.5 SFT TextEncode.
negativeCONDITIONINGNegative conditioning from AceStep 1.5 SFT TextEncode.
add_noiseCOMBOenableEnable for the first stage; disable when continuing a partially sampled LATENT.
noise_seedINT00–18446744073709550000—
stepsINT501–200Diffusion inference steps.
cfgFLOAT7.01–20Classifier-free guidance scale. Use 7 for Base/SFT and 1 for Turbo checkpoints.
sampler_nameCOMBOjkass_qualityjkass_quality uses the bundled JK-AceStep-Nodes Heun sampler (ODE), with two model evaluations per step except the final zero-sigma step.
schedulerCOMBOace_stepace_step uses Gradio's shifted linear timesteps and CFG timestep bounds. Other schedulers retain ComfyUI step-fraction intervals.
start_at_stepINT00–10000Start index in the full schedule. For continuation, match the previous stage's end_at_step.
end_at_stepINT100000–10000Stop index in the full schedule. Values at or above steps run through the final step.
return_with_leftover_noiseCOMBOdisableEnable to keep an unfinished LATENT for another stage; AUDIO decoding is skipped until finished. Disable to force the endpoint to zero noise.
durationFLOAT60.00–600Duration in seconds. Set to 0 for auto from latent_or_audio.
infer_methodCOMBOodeode keeps the selected sampler. sde remaps supported ComfyUI Euler/Heun choices to SDE variants; jkass_quality remains ODE.
guidance_modeCOMBOapgapg follows ACE-Step velocity guidance. apg_denoised projects clean latents per channel; apg_denoised_joint projects channels and time together. ADG = Angle-based Dynamic Guidance. standard_cfg = normal CFG.
vaeoptVAEVAE for decoding latents to audio. Audio output requires this.
latent_or_audiooptAUDIO,LATENTSource audio or LATENT. To continue an unfinished stage, connect its LATENT and disable add_noise.
batch_sizeoptINT11–16Number of audios to generate in parallel. Native task context is repeated for each variation.
latent_shiftoptFLOAT0.00-0.2–0.2Additive shift on latents before VAE decode.
latent_rescaleoptFLOAT1.000.5–1.5Multiplicative scale on latents before VAE decode.
fade_in_durationoptFLOAT0.00–10—
fade_out_durationoptFLOAT0.00–10—
use_tiled_vaeoptBOOLEANtrueUse context-padded chunks and discard boundary predictions for 1D audio VAE decoding, matching ACE-Step's overlap-discard policy.
unload_models_after_generateoptBOOLEANfalseUnload models from memory after generation.
voice_boostoptFLOAT0.0-12–12Gain in dB for the entire mix before peak protection. Does not isolate or boost only the singer.
apg_etaoptFLOAT0.00-10–10APG eta: parallel component retention.
apg_momentumoptFLOAT-0.75-1–1APG momentum buffer coefficient.
apg_norm_thresholdoptFLOAT2.50–15APG update norm cap; 0 disables clipping. Velocity units for apg, clean-latent units for apg_denoised. Joint APG uses this value times sqrt(latent channels) as its aggregate cap (2.5 becomes 20 for 64 channels).
guidance_intervaloptFLOAT1.00-1–1Guidance interval width. 1.0 matches the official full 0-1 guidance interval; -1 uses cfg_interval_start/end.
guidance_scheduleoptCOMBOnormalnormal keeps CFG constant; decay decreases from CFG to min_guidance_scale; ramp_up increases from min_guidance_scale to CFG. Ramps follow the active guidance interval. Applies to standard CFG, APG, ADG and split guidance, including jkass_quality.
min_guidance_scaleoptFLOAT3.00–30Final CFG for decay, or initial CFG for ramp_up. Set to 1 for a fully conditional endpoint. Unused by normal.
guidance_scale_textoptFLOAT-1.0-1–30Split text guidance. Active when both text and lyric > 1.0.
guidance_scale_lyricoptFLOAT-1.0-1–30Split lyric guidance. Active when both text and lyric > 1.0.
omega_scaleoptFLOAT0.00-8–8—
erg_scaleoptFLOAT0.00-0.9–2—
cfg_interval_startoptFLOAT0.000–1—
cfg_interval_endoptFLOAT1.000–1—
shiftoptFLOAT3.00.1–5Timestep schedule shift. ACEStep15 default is 3.0.
noise_sourceoptCOMBOofficialofficial draws noise on the model device in model dtype/BTC layout. comfy preserves ComfyUI CPU noise. Batch variations use seed + index.
timbre_cls_tokenoptBOOLEANtrueUse the trained timbre summary token omitted by this ComfyUI core. Disable only to compare with the previous generation behavior.
guidance_rescaleoptFLOAT0.000–1Experimental velocity rescale after CFG/APG/ADG, during sampling. 0 preserves current behavior; compare 0.25 and 0.50 with the same seeds. No extra model evaluations.
schedule_precisionoptCOMBOfloat32float32 avoids rounded or repeated ace_step timesteps with BF16 models. model reproduces the previous schedule precision. Does not change model or noise dtype; other schedulers retain their own precision.
apg_norm_rmsoptFLOAT0.0000–1Optional APG update RMS cap in the selected prediction space, before projection and CFG. 0 keeps apg_norm_threshold. Positive values replace that fixed cap and keep the per-value budget independent of audio duration. For apg_denoised_joint, compare 0.05 and 0.075. Does not control audio volume; ignored by other guidance modes.
taskoptACESTEP_SFT_TASKCover/Remix or Inpaint/Repaint task. Connect the same task to TextEncode and every Advanced stage; continue its LATENT with add_noise disabled.
reference_audiooptAUDIO,LATENTOptional singer/timbre reference for a new song. Keeps lyrics, duration and LM codes; with a task, overrides its reference. For Advanced continuation, connect it to every stage.
reference_xl_attentionoptBOOLEANtrueUse the checkpoint's alternating sliding/full attention windows in the timbre encoder when a voice reference is available. Independent of timbre_cls_token; keeps LM codes, lyrics and sampling controls. Disable to compare with the previous reference behavior.
reference_guidance_scaleoptFLOAT1.00–4Experimental independent reference-timbre guidance; 1 retains standard result; higher costs extra conditional prediction per sampling step. Can introduce artifacts.
reference_timbre_repeatsoptINT11–8Experimental repetition of the complete reference-timbre tokens in cross-attention, without increasing embedding amplitude. 1 keeps the standard result. Only affects a direct reference_audio input; can alter the music or introduce artifacts and does not guarantee voice similarity.

Outputs (6)

NameTypeDescription
modelMODEL—
vaeVAE—
positiveCONDITIONING—
negativeCONDITIONING—
latentLATENT—
audioAUDIO—