Timestep Shift Model
The one-knob node that makes 1-step NitroSD actually work
- model
- MODEL
The Timestep Shift Model node is the secret sauce behind NitroSD, the single-step diffusion checkpoint that renders an image in one sampler step. On its own it does almost nothing - it takes a model in, hands you the same model back. But slide it between your checkpoint loader and your KSampler, set one number, and a model that otherwise produces gray mush starts producing finished pictures. It's from the same author as NitroFusion/NitroSD (ChenDarYen / ChenDY on Hugging Face), and it exists because that model's training schedule is weird in a way a normal sampler can't compensate for.
Why it exists
NitroFusion is a "dynamic adversarial training" one-step model in the spirit of SDXL Turbo and Lightning: the student model was trained to jump straight to the denoised image, with a discriminator keeping it honest. The catch is the training used a shifted timestep distribution. Feed it a standard schedule and the sampler feeds it timesteps it was never really trained on - hence blurry or outright broken output at 1 step.
The node fixes that at the model level rather than the sampler level. Peek at the source and you'll see it monkey-patches the model's _apply_model with a wrapped version. On every forward pass it rescales the timestep: t * (shifted_timestep / num_train_timesteps), where num_train_timesteps is 1000 for these checkpoints. So with shifted_timestep at 250, the model only ever sees the first quarter of its schedule, and the node recomputes the matching sigma so the denoising math stays consistent. You don't touch your KSampler at all - the standard lcm sampler at 1 step and CFG 1 does the rest.
The two inputs (there are only two)
- model (MODEL) - your NitroSD checkpoint, straight out of CheckpointLoaderSimple.
- shifted_timestep (INT, default 250, range 1–1000) - the knob. This value is model-specific, and the shipped example workflow tells you exactly which to use:
nitrosd-realism_comfyui.safetensors→ 250nitrosd-vibrant_comfyui.safetensors→ 500
The output is a single MODEL slot, and it's the same model you put in, now wearing the patched forward pass. Wire it into your KSampler. If you forget the node and feed the raw checkpoint to the KSampler, you get garbage - that's the classic "I downloaded NitroSD and it's broken" post, and this node is the missing link.
Installing it
Two files plus the pack. Install the pack however you like - ComfyUI Manager (search "ComfyUI-TimestepShiftModel") or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/ChenDarYen/ComfyUI-TimestepShiftModel
Then restart ComfyUI. Grab the actual NitroSD checkpoints from Hugging Face (ChenDY/NitroFusion) and drop the .safetensors files into ComfyUI/models/checkpoints:
wget https://huggingface.co/ChenDY/NitroFusion/resolve/main/nitrosd-realism_comfyui.safetensors
wget https://huggingface.co/ChenDY/NitroFusion/resolve/main/nitrosd-vibrant_comfyui.safetensors
No extra Python dependencies, no weights beyond those two checkpoints. This is a delightfully tiny pack.
Common gotchas
- The node lives in the "test" category. Check the source and you'll see
CATEGORY = "test"- that's not a bug, but it means the node hides under the test menu in the node picker, which trips up people hunting for it in "sampling" or "custom nodes." - Wrong
shifted_timestepfor the checkpoint. Realism wants 250, vibrant wants 500. Swap them and you'll get washed-out or noisy output - the value isn't a quality slider, it's a calibration constant that has to match the model file. - Don't apply it to normal checkpoints. This rescaling is tuned for NitroSD's training range. Slap it on an SDXL model and you'll mangle that model's schedule for no benefit.
- Keep the sampler settings NitroSD expects. The example workflow uses 1 step, the
lcmsampler,simplescheduler, CFG 1. The node fixes the timestep axis; it can't save you if you crank CFG to 7.
One honest word on expectations: NitroSD is fast, and "realtime" fast, but quality is a trade - community feedback says it shines on animals and stylized subjects, is merely okay on human faces, and falls apart on architecture and landscapes. It's a speed-first model. The Timestep Shift Model node is simply the piece that lets that speed actually show up as coherent images.
Think of it as a lighter cousin of the flow-matching shift knobs (ModelSamplingAuraFlow and friends) - same idea, different model family, and here it's a fixed per-checkpoint constant instead of a per-prompt tune. Set it, forget it.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| shifted_timestep | INT | 2501–1000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MODEL | MODEL | — |