CineStack H3 Director SelfLift
Sample Half Your Steps at Half the Size — SelfLift, Explained
- bd_grp_selflift_sample
- bd_grp_selflift_lift
- bd_grp_selflift_tile
- model_hires
- selflift
The expensive part of making a high-resolution video clip is that the model has to think about every pixel at full size, twenty-five times in a row. SelfLift asks the obvious question: does it have to? Run most of the steps small, lift the result into the bigger canvas, and spend only the last couple of steps at full resolution.
CineStack H3 Director SelfLift is that idea wired into the Director's first pass. Connect it to the Director's selflift socket and the first pass stops being one straight sample: it becomes a low-resolution prefix, a 3D latent lift, and a high-resolution tail on the same timeline canvas. Leave it unconnected and you get the current single-stage behaviour, byte for byte.
This is the most experimental dial in the pack. Everything else here is a workflow convenience; this changes the sampler's trajectory.
How it works
Three stages. First, the prefix runs at lowres_scale × the Director canvas - 0.5 by default, i.e. half the width and height, which is a quarter of the pixels. Then the latent is lifted to the full canvas using a 3D upscale weight (latent_upscale_model, from models/latent_upscale_models/), and finally the high-resolution tail spends the remaining steps at full size.
split_mode decides how you cut the step budget. highres_steps (the default) says "run N steps at the end at full resolution" - 2 by default, which on an 8-step run means 6 low-res plus 2 high-res, and the tooltip suggests keeping it around 25% of total steps. transition_step is the paper's formulation instead: transition_step is the low-res prefix length k (6 is the suggested value for an 8-step turbo run).
Then there's the sampler constraint, and it's absolute: Euler only. Default sampler_mode: euler runs both stages with Euler at s_churn=0, the paper's path. follow_director inherits the Director's sampler but throws an error if that sampler isn't Euler. Don't plan on res_multistep here.
native_low_carry is the segmentation-sensitive one. With it on (default), each segment's low-res prefix carries the native low-res tail from the previous segment as well as the high-res pin, so junctions hold together. Turn it off and the low-res prefix is just the high-res tail downgraded, which is where you get a flash or a smear at the seam. It does nothing unless the Director's segment continuity is enabled.
rho is the paper's pixel-anchor blend: 0 means "use only the 3D latent lift", which the tooltip recommends precisely because it avoids a VAE round trip. Crank it above zero and the pack decodes the low-res x0, upscales it in pixel space with lanczos, re-encodes, and blends it into the 3D result weighted by w_min and w_max. More faithful to the low-res frame; more VAE in the loop. latent_upsample (bilinear or nearest) only affects the interpolated intermediate states - clean endpoints go through the 3D network.
Same memory levers as Refine, in the same shape: enable_latent_chunking slices the 3D lift into time chunks, enable_tiling with tile_count and tile_overlap splits only the high-res tail. Both lower the peak and both can shift a seam away from the whole-segment forward result.
model_hires is optional and useful if your low-res stage is a turbo-LoRA model and you want a different UNET for the tail.
Output and install
One output, selflift, type MMX_DIR_SELFLIFT, into the Director's selflift socket. It doesn't sample alone.
cd ComfyUI/custom_nodes
git clone https://github.com/guomenghao/ComfyUI-CineStack-H3.git
python -m pip install -r ComfyUI-CineStack-H3/requirements.txt
You'll need a 3D latent upscale weight in ComfyUI/models/latent_upscale_models/ - the same folder Refine reads - and with rho=0 it's mandatory; the dropdown shows a placeholder until the file is there. Restart ComfyUI and look under CineStack/H3.
Where this bites
"Sampler must be euler." You picked follow_director while the Director is set to res_multistep. Either set the Director to Euler or accept the node's default Euler path.
lowres_scale at 1.0 does nothing. That's the tooltip's own note: no progression, plain first pass. It's a useful sanity check - set it to 1.0, confirm the output matches your normal pipeline, then dial it back.
The 3D weight is missing and nothing lifts. Check the folder before you file a bug; the placeholder label in the dropdown is the only warning you get.
Refine still works afterwards. SelfLift and Refine are independent - you can lift the first pass to 1.0MP and then have Refine enlarge to 2.0MP. That's the intended stack, and also the fastest way to discover your VRAM ceiling.
One more honesty note from the node itself: TST isn't bundled, and if a model needs patching you patch Director.model yourself. If you don't know what that sentence means, this is not the node to start with.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| bd_grp_selflift_sample | BDGROUP | 渐进采样 | — |
| split_mode | COMBO | highres_steps | highres_steps = 高清收尾步数(8 步默认 2,即低清 6 + 高清 2)。transition_step = SelfLift 论文的 k(8 步默认 6)。 |
| highres_steps | INT | 21–64 | 仅 split_mode=highres_steps。高清阶段步数,建议约为总步数的 25%。 |
| transition_step | INT | 61–200 | 仅 split_mode=transition_step。低清前缀步数 k。8 步 turbo 用 6。 |
| lowres_scale | FLOAT | 0.500.25–1 | 低清画布 = 导演台画布 × 该倍率,再对齐 ×32。1.0 = 不渐进,走原来的一采。 |
| sampler_mode | COMBO | euler | 默认 euler:SelfLift 两阶段都用 Euler(论文路径,s_churn=0)。不改导演台采样器。follow_director = 跟导演台,但必须也是 euler,否则直接报错。 |
| native_low_carry | BOOLEAN | true | 段间把上一段 native 低清尾写入当前低清前缀(与高清 pin 一起)。关掉则低清前缀只是高清尾再降格,接缝容易闪/糊。导演台未开段间引导时无效。 |
| bd_grp_selflift_lift | BDGROUP | 提升 / 3D | — |
| latent_upscale_model | COMBO | (将 3D 权重放入 models/latent_upscale_models) | H3 3D latent 放大权重,与 Refine 同一目录:ComfyUI/models/latent_upscale_models/。rho=0(默认)时必选。 |
| latent_upsample | COMBO | bilinear | 降格 cond / 升采样过渡态 x 的插值。干净端点 x0 走 3D 网。 |
| rho | FLOAT | 0.000–1 | 论文像素锚混合。0 = 只用 3D lift(推荐,避免 VAE 往返)。>0 时解码低清 x0、lanczos 放大像素再编码,按 w_min/w_max 混进 3D 结果。真正的 3D 权重在上面的 latent_upscale_model。 |
| w_min | FLOAT | 0.500–1 | 仅 rho>0。低频区域的像素锚权重。 |
| w_max | FLOAT | 1.000–1 | 仅 rho>0。高频残差区域的像素锚权重。 |
| enable_latent_chunking | BOOLEAN | false | 3D lift 时间分块(省显存,默认关)。接缝可能和整段前向不同。 |
| bd_grp_selflift_tile | BDGROUP | 高清分块 | — |
| enable_tiling | BOOLEAN | false | 仅高清收尾空间分块(默认关)。低清阶段不分块。音频不切空间。 |
| tile_count | INT | 21–8 | 高清分块数量。1 等同不分块。 |
| tile_overlap | INT | 1280–2048 | 块间重叠,单位为输出像素。 |
| model_hiresopt | MODEL | 可选高清阶段 UNET。不接则低清/高清都用导演台主模型。适合低清挂 Turbo、高清换一套。 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| selflift | MMX_DIR_SELFLIFT | — |