MiniMax H3 PDD Acc Warmup Scheduler (2-phase)
Let the Slow Model Do the First Half — H3's Two-Phase Warmup, Explained
- sigmas
- phase2_start_step
- info
An 8-step distilled render is fantastic at almost everything and occasionally a little vague about who is in the frame. That's the usual trade - the KB's distillation write-up says it straight: fewer steps means less time to refine, and every distillation loses something. What's specific to MiniMax-H3 is that you can buy some of it back without giving up the 8-step tail, by letting the un-distilled base model handle the early, high-noise part of the trajectory.
That's the deal this scheduler offers. Phase 1: a handful of ordinary base-model steps that establish composition and likeness. Phase 2: the PDD-patched model finishing on its trained blocks, which is where the speed actually came from.
How the schedule is built
warmup_steps (default 8, 1–32) is base-model steps, uniform in t, running from sigma 1.0 down to the handoff knot on the shift-12 grid. Any sigmas are legal in that stretch - there are no heads to stay aligned with, so the phase-1 guider can be any sampler/schedule you like.
handoff_sigma is an enum, not a slider, and that's deliberate: only seven values exist, they're the trained block boundaries, and each one means a different number of PDD evals to finish the run.
0.800000(default) → 2 PDD evals0.631579→ 10.878049→ 30.923077→ 4 … up to0.988235→ 7
So a higher handoff means the base model does more of the work and the distill does less of it - more time spent, more "undistilled" character in the result. The default hands over with two blocks left, which is roughly the same amount of PDD work a denoise 0.25 refine would do. The node returns sigmas, phase2_start_step as an INT, and an info string that prints the phase-1 and phase-2 boundaries in plain text.
Wiring it up
This is the part that isn't obvious from the node itself. The sigmas come back as one list that spans both phases, so you split it:
MiniMax H3 PDD Acc Warmup Scheduler
sigmas → SplitSigmas (step = phase2_start_step)
phase2_start_step → SplitSigmas.step
info → PreviewAny
Then two SamplerCustomAdvanced passes. Pass 1 takes the first half of the split, a BasicGuider built on the bare, unpatched model, euler, CFG 1.0. Pass 2 takes the second half, the guider built on the PDD-patched model, and - the detail that gets missed - the pass-1 output latent fed in through DisableNoise. No re-noising between phases; you're continuing a trajectory, not starting a new one.
Two housekeeping notes. The Apply node's own sigmas output is unused in this recipe (that's the single-phase flow), but keep Apply at nfe 8 anyway so the tail is on the block-4 grid the handoff values assume. And keep the phase-1 model genuinely clean - no PDD patch, no turbo/Lightning LoRA. The whole point is undistilled early steps.
The pack ships example_workflows/pdd_acc_t2v_warmup_split.json doing exactly this. Drag it in and change one number at a time.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/xm6018924/BSAI-ComfyUI-MiniMax-H3-PDD-Acc
Restart, and it shows up under sampling/custom_sampling/schedulers next to the plain PDD scheduler. Dependencies are torch, safetensors and numpy - the pack adds nothing else, and no models beyond the PDD file in models/pdd_acc/. Core needs to be new enough for H3's carried-audio latent (v0.33.0+ per the README), which you'll already have if the Apply node loads at all.
Honest expectations
This costs you real time. warmup_steps 8 on the base model is 8 full forward passes at the slow setting before the cheap tail even starts - the schedule's total step count is warmup steps plus remaining PDD blocks, and only the second number is the fast kind. On a card that was already sweating through a 124-frame render, two-phase warmup may not be worth it.
I'd reach for it in one situation: reference-driven generation where the likeness is coming out soft. The README frames it exactly that way - better reference likeness - and that's the failure mode early distilled steps produce. For plain text-to-video where you're happy with the clip, the single-phase 8-step render is fine and you should leave this node out of the graph.
If the two passes look like the warmup got thrown away, check the order of the wires at pass 2 first: DisableNoise into the noise input and the pass-1 output - not denoised_output - into the latent input. Those two swaps account for almost every "warmup did nothing" report I'd expect from this graph.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| warmup_steps | INT | 81–32 | Base-model steps from sigma 1.0 to the handoff (uniform in t; any sigmas are legal for the undistilled base). |
| handoff_sigma | COMBO | 0.800000 | PDD boundary where phase 2 takes over = how many PDD evals finish the run: 0.631579->1, 0.8->2, 0.878049->3, 0.923077->4, 0.952381->5, 0.972973->6, 0.988235->7. Keep the Apply node at nfe 8 (the tail is on the block-4 grid). |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| sigmas | SIGMAS | — |
| phase2_start_step | INT | — |
| info | STRING | — |