ComfyUI_TJS
Custom node plugin for ComfyUI to experiment with Truncated Jump Sampling (TJS) for optimized diffusion sampling. (Description by CC)
Nodes (4)
KSampler Advanced that bails out early
SamplerCustom, but it quits early and jumps to the endpoint
SamplerCustomAdvanced with an early exit
Skip half your sampling steps and mostly get away with it
ComfyUI_TJS - Truncated Jump Sampling
中文 | English
ComfyUI_TJS 是一个用于 ComfyUI 的自定义节点插件,用来实验 TJS(Truncated Jump Sampling,截断跳步采样)。
该插件用于验证一种基于 endpoint / denoised 预测的训练无关采样加速思路。
论文
@article{peng2026x,
title={x-Prediction Is All You Need: Training-Free Accelerated Generation via Endpoint Decodability},
author={Peng, Xin and Gao, Ang},
journal={arXiv preprint arXiv:2607.06114},
year={2026}
}
功能简介
TJS 的核心思想是:不一定要把扩散/流匹配采样轨迹完整跑完。模型在中间步已经能给出一个
x0 / denoised 端点预测,因此可以先运行一部分采样步骤,再直接输出端点估计,从而减少 NFE。
简化流程如下:
k* = ceil(gamma * K)
run sampler from sigma[0] to sigma[k*]
return x0_hat(xt, sigma[k*]) with one endpoint model call
其中:
K是原始完整采样步数。gamma是早退比例,例如0.6表示只跑大约 60% 的轨迹。k*是实际早退步。x0_hat是模型在中间 latent 上预测的干净端点。
在 ComfyUI 中,endpoint estimate 对应模型包装器给出的原生 denoised latent,因此理论上可以兼容 diffusion、flow matching、Flux/SD3 类模型包装。
当 gamma = 1.0 时,节点会运行完整采样 schedule,并跳过额外 endpoint call,等价于普通 KSampler 的边界情况。
已测试模型
| 模型 | 状态 | |---|---| | SDXL | ✅ 已测试 | | SD3.5M | ✅ 已测试 | | Z-Image-Turbo | ✅ 已测试 | | Anima | ✅ 已测试 | | Krea2 | ✅ 已测试 | | Krea2-Turbo | ✅ 已测试 | | LTX-2B | ✅ 已测试 | | FLUX.2-Klein-Base-9B (FP8) | ✅ 已测试 | | Qwen-Image-Edit-2511 (Q4_K_S) | ✅ 已测试 |
即将测试
- 扩散类的视频生成模型
与其它加速手段组合使用
TJS 可与其它类型的加速手段组合使用,例如 TeaCache (BSS),进一步加速采样。两者互补:TeaCache 通过缓存复用减少注意力计算,TJS 通过截断轨迹减少采样步数。
以 Anima 模型为例的实测数据:
| 配置 | 耗时 | |---|---| | 原始版本 | 8.6s | | TeaCache (BSS) + FL 采样器 | 4.5s | | TeaCache (BSS) + TJS 采样器 | 3.5s |
TJS 采样器结果更接近原始版本,且总耗时仅为原始版本的 40.7%。示例工作流见 TJS-TeaCache (BSS).json。
更新日志
2026-07-13 修复 TJS 速度低于理论值的问题
问题:当 gamma = 1.0(退出时间设为 1)时,TJS 采样器比原版 KSampler 慢,导致 TJS 加速比例低于理论值。
根因:旧实现使用两次独立的采样调用来完成 TJS —— 第一次截断采样到 sigma[k*],第二次单独的 endpoint decode 调用 sample_custom(sigmas=[sigma*, 0])。每次调用都经过完整的 ComfyUI 采样管线(创建 CFGGuider、加载模型、准备条件、清理),导致理论上的 NFE = k* + 1 中那个 "+1" 远不止一次前向传播的开销。
修复:改为单次采样调用。在截断 sigmas 末尾追加 0:[sigma_0, ..., sigma_{k*}, 0],让采样器在同一次调用中多做一步(sigma* → 0)。通过 k-diffusion 回调在最后一步同时捕获 denoised(x0 预测)和 x(sigma* 处的状态),消除了第二次采样的全部开销。
修复后 gamma = 1.0 时与原版 KSampler 速度完全一致,其他 gamma 值的加速比也更接近理论值。
效果示意
Endpoint decodability 示意:上排是直接解码中间 noisy latent,早期噪声较重;下排是使用 endpoint / denoised 预测得到的干净端点估计。
<img src="assets/endpoint_decodability.png" alt="Endpoint decodability" width="760">Z-Image-Turbo 在不同 NFE 下的生成质量变化:
<img src="assets/z_image_turbo_low_nfe_gallery.png" alt="Z-Image-Turbo low NFE gallery" width="760">SDXL 30 步采样设置下的 NFE 渐进对比:
<img src="assets/sdxl_30step_nfe_progression.png" alt="SDXL 30-step NFE progression" width="760">FID 与 NFE 的趋势示意:
<img src="assets/fid_vs_nfe_benchmark.png" alt="FID versus NFE benchmark" width="760">安装
把本文件夹复制到 ComfyUI 的自定义节点目录:
ComfyUI/custom_nodes/ComfyUI_TJS/
然后重启 ComfyUI。
节点说明
TJS Sampler (Truncated Jump Sampling)
这是主要的一站式节点,可以作为普通文生图采样器的替代节点使用。
输入:
| Input | 中文说明 |
|---|---|
| model | ComfyUI 加载的模型 |
| total_steps | 原始完整采样步数 K,例如 30 |
| early_exit_gamma | 早退比例,例如 0.6 |
| cfg | CFG scale |
| sampler_name | 截断采样阶段使用的 ComfyUI sampler |
| scheduler | ComfyUI sigma scheduler |
| positive / negative | 正向/反向条件 |
| latent_image | 空 latent 或输入 latent |
| seed | 随机种子 |
| model_type | 信息标记:auto、diffusion 或 flow |
| denoise | 可选 denoise 强度 |
输出:
| Output | 中文说明 |
|---|---|
| latent_x0 | endpoint decoded latent,接到 VAE Decode |
| latent_xt | 早退时刻的中间 noisy latent |
| k_star | 实际早退步 |
| nfe_used | 早退时为 k_star + 1;gamma = 1.0 时为 K |
| nfe_saving_pct | 相对完整步数节省的 NFE 百分比 |
| sigma_at_exit | endpoint decode 使用的 sigma |
TJS Advanced Sampler (KSampler Advanced + Endpoint)
这是 KSampler Advanced 的 TJS 增强版。它在 KSampler Advanced 的基础上内置了 TJS endpoint decode,无需两节点串联即可实现截断跳步采样。
与 TJSSampler 相比,它额外支持:
add_noise=enable/disable:控制是否添加初始噪声(用于 img2img)。start_at_step:从指定步开始采样(用于多阶段工作流)。noise_seed:与 KSampler Advanced 一致的种子参数。
输入:
| Input | 中文说明 |
|---|---|
| model | ComfyUI 加载的模型 |
| add_noise | enable 添加噪声(文生图),disable 不添加(img2img) |
| noise_seed | 随机种子 |
| steps | 完整采样步数 K |
| early_exit_gamma | 早退比例 gamma |
| cfg | CFG scale |
| sampler_name | ComfyUI sampler |
| scheduler | ComfyUI scheduler |
| positive / negative | 正向/反向条件 |
| latent_image | 空 latent 或输入 latent |
| start_at_step | 起始步(默认 0) |
| model_type | 信息标记 |
输出与 TJSSampler 相同:latent_x0、latent_xt、k_star、nfe_used、nfe_saving_pct、sigma_at_exit。
TJS Custom (SamplerCustom + Endpoint)
这是 ComfyUI 自定义采样器的 TJS 版本,镜像原生 SamplerCustom 接口,额外增加 early_exit_gamma 参数。
与 TJSCustomAdvanced 的区别:TJSCustom 直接接收 model、cfg、positive、negative 等参数(内部自动创建 CFGGuider),而 TJSCustomAdvanced 需要用户手动连接 guider、noise 对象。TJSCustom 更简单易用,TJSCustomAdvanced 更灵活。
输入与 SamplerCustom 一致(model、add_noise、noise_seed、cfg、positive、negative、sampler、sigmas、latent_image),加上 early_exit_gamma。
输出:latent_x0、latent_xt、k_star、nfe_used、nfe_saving_pct、sigma_at_exit。
TJS Custom Advanced (SamplerCustomAdvanced + Endpoint)
这是 ComfyUI 自定义采样器(高级)的 TJS 版本,镜像原生 SamplerCustomAdvanced 接口,
额外增加 early_exit_gamma 参数。支持所有 ComfyUI guider 类型(CFGGuider、BasicGuider、DualCFGGuider)。
输入与 SamplerCustomAdvanced 一致(noise、guider、sampler、sigmas、latent_image),加上 early_exit_gamma。
输出:latent_x0、latent_xt、k_star、nfe_used、nfe_saving_pct、sigma_at_exit。
使用示例
直接使用 TJS Sampler
例如设置:
total_steps = 30
early_exit_gamma = 0.6
节点会运行到:
k* = ceil(0.6 * 30) = 18
然后执行一次 endpoint call。总成本约为:
NFE = 18 + 1 = 19
相对 30 步完整采样,约节省 36.7% NFE。
使用 TJS Advanced Sampler
TJSAdvancedSampler 是一体化节点,无需串联 KSampler Advanced:
steps = 30
early_exit_gamma = 0.6
add_noise = enable
start_at_step = 0
节点会自动计算 k* = 18,运行截断采样,然后执行 endpoint decode。
对于 img2img 工作流:
add_noise = disable
start_at_step = 0
此时不添加噪声,直接从输入 latent 开始采样。