SADA: Stability-guided Adaptive Diffusion Acceleration
Paper: arXiv:2507.17135 Code: Ting-Justin-Jiang/sada-icml Code reference:
main@bbbadce7(2025-07-24)
0. TL;DR
SADA 解决的是 diffusion / flow-matching 采样中的“训练后无改动加速但保真度掉得快”的问题。论文认为现有 training-free acceleration 之所以在速度上有效、但相对原始 baseline 的 faithfulness 较差,根因不是单纯缓存策略不够激进,而是两个更底层的不匹配:第一,不同 prompt 的 denoising trajectory 不一样,固定的 token 或 step sparsity 不能覆盖所有采样阶段;第二,很多方法把采样过程当作普通前向序列来近似,却没有利用采样器本身对应的 ODE 数值解结构,因此容易把 、、 和 reconstructed 的关系弄错。
SADA 的核心贡献是用一个 stability criterion 同时决定 step-wise、multistep-wise 和 token-wise sparsity。它在 timestep 做一次 fresh computation 后,用 solver 给出的 trajectory gradient 及其二阶差分判断 是否足够稳定:如果稳定,就跳过或插值部分 step;如果不稳定,就退到更细粒度的 token-wise cache-assisted pruning,只固定不稳定 token 的新计算,用缓存补稳定 token。这样它不是预设“每几步跳一次”或“每层固定剪多少 token”,而是把 sparsity 选择绑定到 ODE trajectory 的局部曲率。
实验上,SADA 在 SD-2、SDXL、Flux.1-dev 上覆盖 U-Net / modified U-Net / DiT,使用 EDM/Euler 和 DPM-Solver++,在 MS-COCO 2017 prompt 上相对 unmodified baseline 达到约 – speedup,同时维持 LPIPS 、FID 。它还迁移到 MusicLDM 和 ControlNet:MusicLDM 约 、spectrogram LPIPS 小于 0.020;ControlNet 约 且保留 canny-conditioned 结构。适合把它归入 Multimodal Generation / Acceleration & Distillation,因为它是训练自由的生成模型采样加速,不是新 backbone、不是 RL alignment,也不是视频/音频专用模型。
1. Motivation(研究动机)
Diffusion models 的部署瓶颈来自两层成本:一层是 denoising / flow sampling 的迭代步数,另一层是高分辨率 latent 上 attention 的近似二次复杂度。传统加速路径也对应这两层:减少 inference steps,例如 DDIM、DPM-Solver、EDM 等 scheduler;或者降低每一步的模型内部计算量,例如 token merging、latent/cache reuse、DeepCache、AdaptiveDiffusion、TeaCache 等。SADA 关注第二类 training-free 方法,但它的出发点是:仅靠经验阈值、固定缓存层、固定 token 合并比例,往往只能换来 latency 降低,却会和原始采样结果产生明显偏离。
论文对 fidelity gap 的解释很关键。生成采样不是一个所有 prompt 都类似的静态网络推理序列,而是一个 prompt-conditioned ODE trajectory。某些 prompt 在早期语义规划阶段变化剧烈,另一些 prompt 在局部纹理阶段才敏感;同一个 prompt 的前中后期也可能有完全不同的稳定性。若方法不观察 trajectory,就会在“还不稳定”的位置复用旧特征或旧噪声,从而把错误传播到后续状态。AdaptiveDiffusion 之类的 step reuse 方法直接令 ,会在 与对应 noise prediction 之间产生 mismatch;TeaCache 根据误差积累阈值缓存,但没有显式使用采样器的 ODE 结构;DeepCache 在中间层复用 latent feature,也没有把跳步和数值积分误差联系起来。
SADA 的另一个动机是“加速策略要和 solver 匹配”。DPM-Solver++、EDM/Euler 和 flow-matching 都可以写成 ODE 形式,solver 每一步实际给出了从 到 的梯度或 vector field 信息。若加速方法只看相邻输出差异,就浪费了这部分精确信息。SADA 把 solver 的 视为 stability 的测量源:当局部 curvature 与 extrapolation error 的方向关系表明近似会把状态推向正确方向时,可以更大胆地 step-wise 跳过;否则就只在 token 层面局部剪枝,以避免整步错误。
从应用角度看,SADA 的目标不是重新训练一个 distilled diffusion model,也不是学习一个额外 gate。它希望成为 HuggingFace Diffusers pipeline 上的 plug-in patch:给 SD-2、SDXL、Flux、ControlNet、MusicLDM 这类已有模型加一个 runtime patch,即可在不改变权重的情况下得到稳定加速。这个定位决定了论文特别强调 training-free、solver-aware、pipeline-compatible 三个约束;也解释了为什么它愿意设计较复杂的 criterion 和 cache logic,而不是只报告一个固定剪枝比例。
2. Idea(核心思想)
SADA 的核心 insight 可以压缩成三句话:用 ODE solver 的局部曲率判断“这个 timestep 是否稳定”,用同一个 criterion 在 step 级和 token 级之间切换 sparsity,用 solver-aware approximation 纠正跳过计算带来的状态/噪声 mismatch。 稳定时,整步或多步可以通过 Adams–Moulton / Lagrange 近似补偿;不稳定时,只剪掉局部稳定 token,并用 cache 重建 feature map。

Figure 1 解读:teaser 把 SADA 的定位讲得很直观:在 50-step diffusion / flow-matching 采样下,Flux、SDXL、SD-2 分别达到约 、、 加速,但视觉结果仍接近 baseline。这里的重点不是“某一个模型上压榨到最高 speedup”,而是同一套 criterion 能跨 U-Net、modified U-Net、DiT 结构工作。
Figure 2 解读:SADA pipeline 的中间分支对应 step-wise sparsity,底部分支对应 token-wise sparsity。每个 timestep 先在 做 fresh computation,基于 Criterion 3.4 判断 的稳定性;若稳定,就进入 step-wise / multistep-wise cache-assisted pruning;若不稳定,就进入 token-wise 分支,只对 stable tokens 做 reduction。右侧散点图显示 SADA 同时提升 faithfulness 与 efficiency,而不只是沿着“更快但更失真”的 trade-off 线移动。
这个设计与 DeepCache、AdaptiveDiffusion、TeaCache 的区别在于 decision source。DeepCache 主要利用 U-Net 中间层特征的跨步相似性,AdaptiveDiffusion 偏向重用上一时刻 noise prediction,TeaCache 用误差累积阈值触发缓存;SADA 则把 、 和 extrapolated state 的方向关系作为统一信号。它不是说 token-wise 或 step-wise 哪个绝对更好,而是承认二者适合 trajectory 的不同阶段:在语义规划/局部结构未稳定时,整步跳过风险高;在 已稳定时,多步插值更划算。
3. Method(方法)
3.1 ODE 视角和符号
论文先把 diffusion sampling 和 flow-matching 都写成 ODE。对于 diffusion probability-flow ODE: 其中 ,。对于 rectified flow / flow matching,反向变换由 denoising model 预测的 vector field 给出: 论文统一把这类 solver gradient 记为 ,简写为 ;噪声预测记为 ,flow vector 记为 。这一步很重要,因为后续 criterion 不是基于 feature cache 的黑盒距离,而是基于 trajectory velocity 的二阶变化。
3.2 两类 sparsity:step-wise 与 token-wise
Step-wise sparsity 的目标是跳过一部分 denoising network evaluation。若 timestep 可被近似,就不必完整计算 或对应 vector field。问题是简单令 会把 上的预测搬到 ,引入状态和噪声不匹配。因此 SADA 不把 skip 当作直接复用,而是把 skip 后的 和 reconstruction 作为数值积分近似问题。
Token-wise sparsity 的目标是在 transformer / attention 层内部减少 token 数。输入 sequence 的 token index 被分为 和 ,其中 是需要完整计算的不稳定 token, 是可由 cache 近似的稳定 token。定义映射 ,,token pruning 后只保留: 经过 self-attention 后,再把结果映射回原长度。论文指出 token merging 类方法有 low-pass filtering 效应,容易损失高频细节,因此 SADA 的主线是 cache-assisted pruning:新算不稳定 token,稳定 token 从 layer cache 取回。
3.3 Stability criterion:用曲率方向判断是否可跳
SADA 把加速问题建模为 stability prediction。它先考虑三阶 backward finite difference: 对应 correction term: 如果在稳定 regime 中连续三阶差分的符号保持一致,则 extrapolation error 与真实 curvature 的方向关系可以提示近似是否安全。又因为按照构造有 ,论文把 用 代替,得到 Criterion 3.4: 直观理解:若 extrapolated state 相对真实状态的误差方向与 velocity curvature 反向,说明它落在 curvature correction 的正确一侧,skip 造成的误差更可能被后续 solver correction 吸收;若这个内积不满足条件,整步近似方向可能错误,应该转入 token-wise 细粒度剪枝。
released code 中这个 criterion 被落成更工程化的 momentum_mean <= 0 判断:sada/solver.py 在 Euler / DPM scheduler step 中计算 pred_prev_sample,令 residual_factor = prev_sample - pred_prev_sample,再乘以相邻 f 的二阶差分 ((f-prev_f[-1]) - (prev_f[-1]-prev_f[-2])),取均值得到 momentum_mean。当 momentum_mean <= 0 且 step 落在 acc_range,并且连续 skip 未超过 max_interval,代码将 skip_this_step=True。这与论文 criterion 的方向是一致的:residual 乘 velocity curvature 的均值非正即表示稳定。

Figure 3 解读:左侧比较第三阶 finite difference 与 Adams–Moulton 的 step-wise pruning 视觉结果,右侧报告 50 个随机 MS-COCO prompts 上的 per-step MSE。作者要证明的不是“有限差分完全不可用”,而是 solver-aware 的 Adams–Moulton 在均值误差和标准差上更稳,因此更适合作为 step-wise skip 后的 correction。
3.4 Step-wise approximation:Adams–Moulton 纠正 skip
在 step-wise 分支中,SADA 不直接复用 ,而是利用 precise derivative information 。论文采用二阶/三阶 Adams–Moulton 形式: 并给出局部截断误差 。随后它把这个 用于 reconstruct clean sample ,误差界写为: 这里的 来自 solver resolution, 来自状态变化。如果采样步很密,或 trajectory 已趋于平滑,这个近似误差可控;如果 trajectory 剧烈变化,则 criterion 更可能返回 False,转向 token-wise。
Figure 4 解读:这张图说明 SADA 同时关心 trajectory 和 trajectory。很多 diffusion sampler,尤其 DPM-Solver++,实际会把 clean sample prediction 作为关键中间变量;如果只近似 或只复用 ,可能无法保证 与 scheduler 所需变量一致。SADA 的 dual approximation 用 的 ODE gradient 去构造 ,再对 做重建,使 skip 与 solver 的输入输出保持一致。
3.5 Multistep-wise approximation:稳定区间内的 Lagrange interpolation
论文借鉴“denoising trajectory 有语义规划阶段和 fidelity-improving 阶段”的观察:一旦 进入稳定 regime,可以用更大的 effective step size,但需要高阶插值补偿。SADA 在稳定后采用 uniform step-wise pruning,例如 50-step 过程中设置 interval 4,即每 4 步完整计算一次,其余 skipped steps 通过 Lagrange interpolation 估计 。
假设滚动缓存中有 个已知点 ,则对未计算的 timestep :
若 在区间内 次连续可微,则误差为:
其中 是缓存点最大间距。这个公式解释了为什么 multistep-wise 只适合稳定区间:插值假设本质上要求 平滑;如果 prompt 或结构仍在剧烈改变,插值会放大错误。released code 中 sada/patch.py::apply_patch 通过 lagrange_term、lagrange_int、lagrange_step 初始化 rolling buffers;sada/solver.py 在 use_lagrange 且 momentum_mean <= 0 时维护 lagrange_step / lagrange_x0 并调用 lagrange_skip。
3.6 Token-wise cache-assisted pruning
当 Criterion 3.4 返回 False,SADA 认为整步跳过风险较高,于是改为 token-level stability。它把 token 分成 和 :前者是不稳定 token,必须完整经过当前 layer 的 attention / transformer;后者由缓存中的 representation 近似。对于 transformer layer ,如果 ,先完整计算并初始化 cache:
若不是 cache initialization step,则把输入 prune 成 ,只计算 个 token,并更新 cache 中对应位置:
最终输出由新计算 token 和缓存 token 组合:
Figure 5 解读:token-wise 分支不是盲目删除 token,而是用 stability mask 指导每层输入的 pruning。被选为 unstable 的 token 进入新 attention;stable token 暂时由 cache 补回。这样每一层输出仍恢复成原 sequence length,后续网络不需要改变 shape。released code 的 sada/prune.py::compute_prune 会从 cache_bus.temporal_score 构造 token mask,并在超过 max_fix 时只保留 top unstable tokens;sada/module.py::patch_unet_transformer_block 在 patched transformer block 中调用 compute_prune,再在 attention 前后执行 prune / reconstruct。
3.7 Released code 对应关系和实现注意点
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| Diffusers patch 与全局状态 | sada/patch.py | CacheBus, apply_patch, reset_cache |
| Stability criterion / step skip | sada/solver.py | patch_solver, scheduler step wrappers |
| Token mask 与 cache reconstruction | sada/prune.py | compute_prune, downsample_temporal_score, prune, reconstruct |
| Transformer layer integration | sada/module.py | patch_unet_transformer_block, patch_transformer |
| Demo defaults | sd_demo.py, xl_demo.py, flux_demo.py | patch.apply_patch(...) calls |
| Batch generation / metrics | generate_unet.py, generate_dit.py, eval/*.py | COCO/Parti generation and PSNR/LPIPS/FID eval |
源码的主要控制参数来自 demo scripts,而不是 base default。sd_demo.py 使用 sx=3, sy=3, max_downsample=1, acc_range=(10,47), lagrange_int=4, lagrange_step=24, lagrange_term=4, max_fix=1024*5, max_interval=4;xl_demo.py 把 max_downsample=2、max_fix=1024*10;
flux_demo.py 对 Flux 使用 max_downsample=0, latent_size=(height//16,width//16), lagrange_step=20, lagrange_term=3, max_fix=0。README 的 one-line 配置与 SD demo 更接近。
generate_unet.py / generate_dit.py 的 parser 还保留 num_fid_samples=5000, seed=42, acc_start=10, acc_end=47, lagrange_term=4, lagrange_step=24, lagrange_int=4, max_fix=5*1024, max_interval=4,对应论文 MS-COCO 2017 batch evaluation。
论文公式与 released code 实现差异:当前 main@bbbadce7 的 sada/patch.py::apply_patch 签名不接受 ratio、mode、prune、interp_mode 参数,但 generate_unet.py 和 generate_dit.py 仍传入这些 stale kwargs;若直接运行这两个 batch generation scripts,按 Python 语义会触发 unexpected keyword argument。README、sd_demo.py、xl_demo.py、flux_demo.py 使用的是 accepted signature,更能代表当前可运行入口。因此本笔记把 demo scripts 的 apply_patch 参数作为实现锚点,把 batch scripts 视为需要修复的实验复现脚本。另一个命名差异是 demo 日志里仍有 “CAP” 字样,但 repo / README / paper 均指向 SADA;这更像旧名称残留,不影响 algorithm mapping。
def sada_sampling_loop(pipe, scheduler, prompt, args):
# released-code-level pseudocode, simplified from sada/patch.py + solver.py + prune.py
patch.apply_patch(
pipe,
sx=args.sx, sy=args.sy,
max_downsample=args.max_downsample,
acc_range=args.acc_range,
lagrange_int=args.lagrange_int,
lagrange_step=args.lagrange_step,
lagrange_term=args.lagrange_term,
max_fix=args.max_fix,
max_interval=args.max_interval,
latent_size=args.latent_size_if_dit,
)
for step in scheduler.timesteps:
if cache_bus.skip_this_step and cache_bus.pred_m_m_1 is not None:
model_output = cache_bus.pred_m_m_1
else:
# patched transformer blocks call compute_prune before attention
# unstable tokens are freshly computed; stable positions are restored from cache
model_output = pipe.denoiser(latents, prompt)
prev_sample, solver_gradient = scheduler.step(model_output, step, latents)
residual = prev_sample - adams_moulton_prediction(latents, solver_gradient, cache_bus.prev_f)
curvature = second_order_difference(solver_gradient, cache_bus.prev_f)
momentum_mean = mean(residual * curvature)
if momentum_mean <= 0 and step in args.acc_range and cache_bus.cons_skip < args.max_interval:
cache_bus.skip_this_step = True
cache_bus.pred_m_m_1 = corrected_prediction_or_lagrange_x0()
else:
cache_bus.skip_this_step = False
cache_bus.temporal_score = topk_unstable_token_score(residual * curvature, max_fix=args.max_fix)
latents = prev_sample这段伪代码只保留真实实现的关键路径:patch.apply_patch 先 monkey-patch Diffusers model 和 scheduler;scheduler 每一步计算 stability;transformer block 根据 temporal_score 做 token-wise prune/reconstruct;如果 stability 达标,下一步可直接使用 pred_m_m_1 或 Lagrange interpolation 的 clean-sample reconstruction。它不是 paper abstract 的改写,而是对应 CacheBus、patch_solver、compute_prune 三个实际实现模块。
4. Experimental Setup(实验设置)
实验覆盖三类 text-to-image backbone:SD-2(U-Net)、SDXL(modified U-Net)、Flux.1-dev(DiT / flow-matching)。采样器包括 Euler Discrete Multistep / EDM(一阶)和 DPM-Solver++(二阶),均以 50 sampling steps 为主设置。Flux.1-dev 实验在单张 NVIDIA A100 上运行,其余 SD-2 / SDXL 实验在单张 NVIDIA A5000 上运行。实现基于 HuggingFace Diffusers。
评估数据使用 MS-COCO 2017 validation set prompts。效率指标是相对 unmodified baseline 的 speedup ratio;质量指标是 accelerated samples 与 original generated samples 之间的 PSNR、LPIPS、FID。这里的比较对象不是人类标注的真实图像质量,而是“加速后是否忠于原模型输出”,因此 LPIPS/FID 越低、PSNR 越高代表保真度越高。对比 baselines 包括 DeepCache、AdaptiveDiffusion、TeaCache:DeepCache 复用 U-Net middle latent feature;AdaptiveDiffusion 跳过 noise predictor 并复用 previous predicted noise;TeaCache 用缓存阈值度量误差积累。
few-step ablation 改变 inference steps 为 50、25、15,测试 SD-2 和 SDXL 上的 DPM++ / Euler。作者还用 Figure A.3 解释选择 作为主实验 base step:DPM-Solver 生成样本在低 step 数先发生较大变化,50 step 后趋于收敛,因此以 50 step baseline 评估 acceleration 的 faithfulness 比较合理。下游/跨模态部分测试 ControlNet 和 MusicLDM,用于证明 criterion 不依赖 text-to-image 单一 pipeline。
5. Experimental Results(实验结果)
5.1 主结果:SADA 在速度和保真度上同时占优
Table 1 的核心结论是:SADA 相比 DeepCache、AdaptiveDiffusion、TeaCache 不只是更快,而是在相近或更高速度下显著降低 fidelity loss。关键数字如下:
| Model / Scheduler | Best baseline in table | SADA | Interpretation |
|---|---|---|---|
| SD-2 / DPM++ | AdaptiveDiffusion: PSNR 24.30, LPIPS 0.100, FID 4.35, 1.45× | PSNR 26.34, LPIPS 0.094, FID 4.02, 1.80× | 更快且三项质量都更好 |
| SD-2 / Euler | AdaptiveDiffusion: PSNR 21.90, LPIPS 0.173, FID 7.58, 1.89× | PSNR 26.25, LPIPS 0.100, FID 4.26, 1.81× | baseline 略快但失真明显更大 |
| SDXL / DPM++ | AdaptiveDiffusion: PSNR 26.10, LPIPS 0.125, FID 4.59, 1.65× | PSNR 29.36, LPIPS 0.084, FID 3.51, 1.86× | FID 从 8.48 DeepCache / 4.59 AdaptiveDiffusion 降到 3.51 |
| SDXL / Euler | AdaptiveDiffusion: PSNR 24.33, LPIPS 0.168, FID 6.11, 2.01× | PSNR 28.97, LPIPS 0.093, FID 3.76, 1.85× | DeepCache 2.16× 最快,但质量损失大 |
| Flux / Flow-matching | TeaCache: PSNR 19.14, LPIPS 0.216, FID 4.89, 2.00× | PSNR 29.44, LPIPS 0.060, FID 1.95, 2.02× | 同等约 2× 加速下 fidelity 大幅提升 |
论文特别强调两组 FID 降幅:SDXL + DPM-Solver++ 中,SADA 相对 DeepCache 的 FID 从 8.48 降到 3.51,约 59% 下降;Flux.1-dev 中,相对 TeaCache 从 4.89 降到 1.95,约 60% 下降。更重要的是,所有 SADA 主设置的 LPIPS 都不超过 0.100,说明 accelerated output 与原始模型 output 的 perceptual distance 较小。
5.2 Few-step ablation:步数越少时误差积累反而更低
Table 2 把 steps 改为 50、25、15。以 SD-2 / Euler 为例,SADA 在 50 steps 时 PSNR 26.25、LPIPS 0.100、FID 4.26、speedup 1.81×;25 steps 时 PSNR 26.83、LPIPS 0.088、FID 3.87、speedup 1.48×;15 steps 时 PSNR 29.34、LPIPS 0.076、FID 3.70、speedup 1.25×。作者解释为:原始 step 数减少后,可跳过的总计算减少,所以 speedup ratio 下降;但 trajectory 中累计误差的机会也减少,因此与 baseline 的 similarity 更高。
在 SDXL / DPM++ 中,50 steps 是 PSNR 29.36、LPIPS 0.084、FID 3.51、1.86×;25 steps 变为 30.84、0.073、2.80、1.52×;15 steps 为 31.91、0.073、2.54、1.29×。这个趋势支持 SADA 的 stability 逻辑:它并不是为了极少步 sampler 设计的蒸馏替代,而是在常见 50-step baseline 上获得最大实际 speedup;当 sampler 本来很短时,SADA 更像保真度优先的轻量加速。

Figure A.3 解读:不同 sampling steps 下生成样本先明显改变,随后逐渐稳定,这支撑了作者选择 50-step baseline 的判断。如果 baseline 本身尚未收敛,用它评估 acceleration 的“保真”会混入 sampler 不稳定性;50 steps 是质量和加速空间之间的折中。
5.3 下游任务和跨模态迁移

Figure 6 解读:MusicLDM 实验展示 SADA 不依赖图像像素指标;它在 audio spectrogram 生成上达到约 加速,并保持 spectrogram LPIPS 低于 0.020。图中 baseline 与 SADA 的频谱结构基本一致,说明 criterion 对 iterative generative process 的依赖强于对具体 modality 的依赖。

ControlNet 解读:作者使用 SD-1.5-based ControlNet,以 canny edges 作为 conditional input。SADA 约 加速,并保留条件结构。这个结果说明 SADA 的 patch 可以作用在带控制分支的 pipeline 上,而不是只能在 vanilla text-to-image 中运行;但 ControlNet speedup 低于 SDXL / Flux 主实验,也提示额外 control computation 和结构约束会压缩可跳过空间。
5.4 Appendix qualitative comparisons

Appendix TeaCache 对比:在 Flux.1-dev 上相同约 speedup 下,TeaCache 的局部细节和 prompt fidelity 明显更容易漂移;SADA 的结构与 baseline 更接近。这和 Table 1 中 Flux LPIPS 0.060 vs TeaCache 0.216、FID 1.95 vs 4.89 对应。

Appendix AdaptiveDiffusion 对比:在 SDXL 50-step DPM++ 上,SADA 速度 1.81× 高于 AdaptiveDiffusion 1.65×,同时视觉保真更好。这正好对应 motivation 中的噪声复用 mismatch:AdaptiveDiffusion 的第三阶估计没有显式与 DPM++ clean-sample reconstruction 对齐,容易在局部结构上积累误差。
6. Limitations, caveats, and reproduction notes(局限与复现注意)
第一,SADA 是 training-free runtime patch,因此它的可靠性依赖 Diffusers 内部模块命名、scheduler API 和模型结构。released code 通过 monkey-patching class 和 isinstance_str 匹配 DiffusionPipeline、ModelMixin、BasicTransformerBlock、FluxTransformerBlock 等;如果 Diffusers 版本变化较大,patch path 可能需要更新。它不是一个完全独立的 sampler,也不是所有自定义 pipeline 都自动兼容。
第二,criterion 的有效性依赖 trajectory smoothness。论文给出 Theorem 和 error bound,但实际部署中仍要设置 acc_range、max_interval、max_fix、lagrange_step 等参数。过大的 max_interval 或过早进入 acceleration range 可能在语义规划阶段跳得过猛;过小的 max_fix 可能让 token-wise 分支保护的 unstable tokens 不够。代码默认通常是 acc_range=(10,47)、max_interval=4,相当于避开最早和最后若干 steps。
第三,主实验是相对 original generated samples 的 faithfulness 评估,不等于人类偏好或真实图像质量绝对提升。SADA 的目标是“更快地产生接近原模型的样本”,不是让原模型更美观或更对齐。对一些 prompt,accelerated output 也可能与 baseline 有细节差异;论文通过 LPIPS/FID/PSNR 和 appendix qualitative figures 证明平均风险较小,但没有覆盖所有任务。
第四,官方 repo 的复现入口需要区分。README 和 demo scripts 是当前更可信的快速验证路径;generate_unet.py / generate_dit.py 中的 stale kwargs 与当前 apply_patch 签名不一致,批量评估前应先修复。若要严格复现 Table 1,建议固定 main@bbbadce7 后先运行 demo 确认 patch 生效,再修正 batch generation scripts 的参数接口,并记录 Diffusers / PyTorch 版本。