Nodes/ComfyUI-Easy-Media/MiniMax H3 SelfLift Sampler
ComfyUI Node

MiniMax H3 SelfLift Sampler

Do most of your steps at 60% resolution and pay for it once

By yolain·Created 4 months ago·Updated a day ago· 186
MiniMax H3 SelfLift Sampler
  • model
  • positive
  • vae
  • latent_image
  • sigmas
  • low_context_latent
  • preview_vae
  • latent
  • low_context_latent
seed0
transition_ratio0.60
lowres_scale0.600
rho0.10
w_max0.70
w_min0.25
upscaler_modelNone
enabled_tilingfalse
highres_tilingfalse
tile_count0
preview_node_id
generated_frame_count1
preview_fps24.00
segment_index0
sampling_passselflift

Every denoiser evaluation in a 2K H3 clip costs full-resolution money. SelfLift's deal is blunt: run the early steps - the ones deciding composition and motion - at a fraction of the resolution, lift the clean endpoint to target size, and finish the same Euler schedule up there. You don't get more steps. You get the same steps, mostly spent somewhere cheaper.

Why this exists

The usual answer to "my video pass is too slow at high resolution" is a manual two-stage pipeline: sample small, upscale, sample again - and accept that the second stage adds NFE on top. That works, and it's what the MiniMax H3 Latent Upscaler in this same pack is for.

SelfLift folds both stages into one node and re-splits the schedule you gave it instead of extending it. The low stage runs sigmas[:n], the high stage runs sigmas[n:], and the total model evaluations are identical to a plain run of that schedule. At the default transition_ratio of 0.6, 60% of them happen at 0.6× resolution - a third of the pixels. That's the pitch, and it's a speed argument, not a free-quality one.

The pack credits this as adapted from facok/comfyui-SelfLift, implementing the SelfLift paper's Algorithm 1 in its "zero" mode.

How the mechanism actually runs

Both passes are forced through standard Euler - you don't supply a sampler, and anything with churn is rejected. Both also sample at CFG 1.0 with empty negative conditioning: there is no negative input on this node at all. Fine for H3's turbo and distilled presets, a hard no if you wanted CFG guidance.

  1. Low stage. The latent is resized spatially by lowres_scale (even dims, minimum 2) and Euler runs sigmas[:transition_step+1]. The sampler state and the predicted clean latent are captured.
  2. Paired lifts. The clean endpoint gets lifted two ways: a direct latent lift (nearest by default, or the learned 3D upscaler if you set upscaler_model) and a pixel anchor (VAE decode → Lanczos upscale → re-encode).
  3. Artifact-aware correction. The per-location difference between the two lifts is the error signal. Only the worst rho fraction of locations is corrected, weight ramping between w_min and w_max. rho = 0 gives the pure direct lift, with no VAE round trip at all.
  4. Resume. The corrected latent is re-noised at the transition sigma and sigmas[transition_step:] run at full size, with noise reseeded from seed + 1 and your denoise masks intact.

transition_ratio is an NFE ratio, not a sigma cutoff (the tooltip says so). It's rounded to a step boundary and clamped to at least one eval each side, so a 4-step schedule at 0.6 becomes 2 low / 2 high.

Inputs and outputs

Wire the obvious ones - model, positive, vae, latent_image, sigmas - and then these three are the ones you'll actually tune:

  • transition_ratio (0.05–0.95, default 0.6) - how much of the schedule stays cheap. Higher is faster and asks more of the lift; live at 0.5–0.7.
  • lowres_scale (0.25–1.0, default 0.6) - how small the low stage's latent is. 0.5–0.6 is the sensible band; 1.0 makes the low stage pointless.
  • upscaler_model - None uses nearest lifting, no pixel/VAE round trip. Point it at a checkpoint from ComfyUI/models/latent_upscale_models for a learned lift instead.

rho, w_max, w_min control the correction. highres_tiling (optional, off) tiles only the high-resolution stage to cut peak VRAM - flagged experimental, and tiling costs speed. low_context_latent (optional) is the low-stage continuity hook.

Outputs: latent → VAE decode → SaveVideo. low_context_latent → the next SelfLift node's low_context_latent. That second wire is the trick for multi-segment work: keep batch and channels compatible and the cheap stage stays continuous while the full-resolution latent keeps its own boundary.

Installing it

Same pack, same install. Manager → search ComfyUI-Easy-Media, or:

cd ComfyUI/custom_nodes
git clone https://github.com/yolain/ComfyUI-Easy-Media

Restart. For a learned lift instead of nearest interpolation, put H3 upscaler weights in ComfyUI/models/latent_upscale_models/. No extra Python packages either way.

One routing note: no shipped example workflow places this node by hand. The paved road is easy multitrackProject with sampling_mode = selflift.

Where it bites

It's flagged dev-only. The schema sets is_dev_only, the same flag that keeps dev-only nodes out of the normal menu - if you can't find it in search, that's why. It also has essentially zero community coverage yet, and the pack sits at the pre-release end of its 1.3.x line; treat the defaults as moving.

It only runs rectified-flow models. Pass an SDXL or Flux model and it refuses: "SelfLift requires a rectified-flow model". The sigma schedule must be non-increasing and at least two evaluations long, so a one-step turbo setup won't work.

Small schedules don't leave room for the split. At 4 steps and 0.6 you get 2 cheap evals and 2 expensive ones. Push transition_ratio too high and the lift has to invent more than the final steps can clean up.

Context chains break quietly. Change lowres_scale or the target dimensions and a saved low_context_latent no longer describes this node's low stage. It shows up as drift at the join, not as an error.

CategoryEasyUse/MiniMax

Inputs (22)

NameTypeDefaultDescription
modelMODEL
positiveCONDITIONING
vaeVAE
latent_imageLATENT
sigmasSIGMAS
seedINT00–18446744073709550000
transition_ratioFLOAT0.600.05–0.95Fraction of denoiser evaluations performed at low resolution. This is an NFE ratio, not a sigma-value cutoff.
lowres_scaleFLOAT0.6000.25–1Scale of the low-resolution prefix relative to the target latent.
rhoFLOAT0.100–1Strength of the pixel/VAE artifact correction.
w_maxFLOAT0.700–1Maximum consistency weight used by artifact correction.
w_minFLOAT0.250–1Minimum consistency weight used by artifact correction.
upscaler_modelCOMBONoneOptional MiniMax H3 latent upscaler. None uses nearest latent lifting without a pixel/VAE round trip.
enabled_tilingoptBOOLEANfalseSplit MiniMax H3 model evaluation into spatial tiles during the high-resolution SelfLift stage.
highres_tilingoptBOOLEANfalseLegacy alias for enabled_tiling. Kept for saved workflow compatibility.
tile_countoptINT00–8Internal shared H3 tiling count; 0 keeps legacy auto planning.
low_context_latentoptLATENT
preview_vaeoptVAE
preview_node_idoptSTRING
generated_frame_countoptINT1
preview_fpsoptFLOAT24.00
segment_indexoptINT0
sampling_passoptSTRINGselflift

Outputs (2)

NameTypeDescription
latentLATENT
low_context_latentLATENT