Internal Lab Note · Performance

縮短時間的可能

同一台 RTX 5090、同一個 MiniMax H3,兩天前跑一支 720P 15 秒要 32.8 分鐘,今天是 11.3 分鐘。 這份筆記把四個加速變因逐一單變因拆開量—— SageAttention、Spectrum 採樣加速器、步數、以及一個 ComfyUI 自己的記憶體問題—— 並記錄六次「看起來很合理卻被實測推翻」的推論。

Part 3 · 先讀前兩篇 模型配置、工作流差別、提示詞欄位結構、構圖與景別規則, 在 《MiniMax H3 本地實測》《影片產線實測》。 本篇只談時間,不重複那些。
2026-08-05 RTX 5090 ComfyUI 本地 單變因對照 內部技術筆記

成品先看

Output
45 秒 · 三段 15 秒接成 · 1080P(720P 生成後超解析度放大)。 純動作、無對白,所以全程走 14 步 + 加速器 + purge。 每段生成約 11 分鐘。

先講結論

TL;DR

四個變因互不重疊,所以是乘法疊加,合計省 63%。

它們作用在完全不同的層:SageAttention 讓每一次 attention 更便宜、 Spectrum 減少 transformer 呼叫次數、降步數減少排程步數、 purge 解決的是 VAE 階段的記憶體飢餓沒有一個是在跟另一個搶同一塊時間。

四個變因(每一項都是單變因對照)
變因省下對照條件代價
SageAttention 36.4% 480P/260 幀/20 步/無 Spectrum
307s → 195.3s
啟動參數掛上即可,無畫質代價
Spectrum 加速器 29.3% 720P/362 幀/20 步/purge 開
1213.1s → 858.2s
同 seed 不可重現;有聲音時音訊會被重寫
步數 20 → 14 21.2% 720P/362 幀/有 Spectrum/purge
858.2s → 676.6s
畫質下降,但比原生縮步小得多(見下)
VAE purge 40.7% 720P/362 幀/14 步
1140.8s → 676.6s
下次要重載 UNet(63~95 秒)

疊起來是這樣(以第一天 480P/260 幀/20 步/無加速的 307s 為基準):

原始(無 SageAttn、無 Spectrum、20 步)  307.0s
+ SageAttention              195.3s −36.4%
+ Spectrum(20 步)            145.7s −25.4%
+ 降到 14 步               113.8s −21.4%
合計省 63%
但超線性沒有消失 很容易誤以為「成本曲線變平了」。用今天的數字重算:480P → 720P 仍是 畫布 ×2.33 對應時間 ×3.18(第一天測的是 ×3.32)。 放大解析度該付的錢一樣貴,整條曲線只是被往下平移。 拿今天的 720P 去比昨天的 480P,會把 SageAttention 的功勞錯算成「超線性減弱」—— 這是本文六次錯誤推論中的第五次。

變因一:SageAttention

36.4%

掛在 ComfyUI 的啟動參數上(--use-sage-attention),不是節點層的東西, 所以工作流裡看不到它,很容易在做對照時忘記它的存在。

單變因:480P/260 幀/20 步/timbre/無 Spectrum
條件時間差異
2026-08-03(未開)307 s
2026-08-05(開啟)195.3 s−36.4%

這是四個變因裡最大的一塊,而且沒有畫質代價。它便宜到值得當成預設, 但也因為它藏在啟動參數裡,先前兩天的成本表沒有標註它的狀態—— 於是那張表在今天差點誤導我們兩次。

成本表一定要標測試條件,否則它會變成過期的記事紙。

一張只寫著「RTX 5090 / 480P / steps 20 實測」的表,看起來完整, 卻沒有記下 SageAttention、取樣器、模式。條件沒寫下來的數字, 在條件改變的那一天會安靜地開始說謊。

變因二:Spectrum 採樣加速器

25.8%

ComfyUI-Spectrum-MiniMax-H3 掛在原生 H3 上,用 Chebyshev ridge 擬合 transformer 之後的 hidden feature, 在部分 solver step 用預測取代實算。20 步的排程只實際呼叫 14 次 transformer。

單變因:720P/362 幀/20 步/purge 開/同 seed,唯一差異是 Spectrum
條件總時間採樣s/it
無 Spectrum1213.1s956s47.83
有 Spectrum858.2s713s35.66
差異−29.3%−25.4%−25.4%
為什麼讀 s/it 而不是總時間 總時間會被模型 staging、VAE 解碼、記憶體 offload 汙染——實測同一支工作流的 「模型 staged → 第一個採樣 step」可以從 63 秒暴增到 559 秒。 s/it 只反映採樣本身,是這四個變因裡唯一乾淨的速率指標。

理論值是 30%(20 步扣掉 6 步預測)。實測採樣階段省 25.4%差的 4.6 個百分點就是 forecast 本身的開銷——預測不是免費的,只是很便宜。 專案 README 標示「30% transformer-step reduction」,數字對得上。 總時間省得更多(29.3%),因為 VAE 那段兩邊一樣長,分母被拉大後比例反而更好看—— 這也提醒了:報加速比例時要講清楚分母是什麼

它在 log 裡留下了一個很好認的指紋。

開 Spectrum 那次的 s/it 在 6.73 ~ 91.49 之間跳, 因為 actual 步(約 90 秒)與 forecast 步(約 6.7 秒)交錯,tqdm 顯示的是移動平均; 不開的那次從頭到尾是穩定單值。 要確認加速器有沒有真的在工作,看 s/it 的抖動比看平均數可靠。

但它的價值不在「省時間」,而在同樣的計算成本下畫質損失比較小

720P/124 幀,畫面 SSIM 以原生 20 步為基準
跑法時間SSIM
原生 20 步(基準)208.2s1.000
Spectrum 20 步(實算 14 次)186.6s0.9348
原生 14 步(同樣算 14 次)183.9s0.7769
原生 13 步181.4s0.7071
同一幀的三聯對照:左為原生 20 步、中為 Spectrum、右為差異熱圖
差異最大的那一幀(SSIM 0.8927)。左:原生 · 中:Spectrum · 右:差異放大 6 倍。 看髮流——這不是畫質變差,是走了不同的路:表情、手勢、指甲都在,但頭髮整個重畫。
時間軸圖:上為逐幀 SSIM,下為音訊相關係數
把畫面差異與音訊差異疊在同一條時間軸上。 兩者在同一個時間點一起走鐘、又一起收斂——前段與尾段被 warmup 與強制原生的尾巴錨住, 中間那段才是預測區。單看任一條曲線都看不出這個形狀。

付一樣多的 transformer 呼叫,Spectrum 的畫質明顯高一截。 拿它跟「原生跑滿」比速度會低估它;正確的對照組是同計算成本的原生縮步

⚠️ 什麼時候不能開 —— 前提比結論重要 H3 是影音同源,加速器改動 hidden feature 軌跡會讓音訊本身被重新生成—— 實測整體相關係數僅 0.385,互相關的最佳位移是 0 ms不是聲音晚了,是內容真的不同
但這條的前提是「音訊要跟外部參考音硬對齊」,也就是 TTS 精確對嘴模式。 聲線範本模式(模型自己說新台詞)不受此限——音訊本來就是模型生的, 被重寫之後仍然是模型生的,沒有「對不上外部音檔」這回事。
另外低步數時它的施展空間會被壓縮:20 步能預測 6 步,14 步只剩 3 步。
260 幀/720P/20 步/聲線範本模式・同 seed 同提示詞(見下方註記)
條件ASR 相似度削波嘴型
無 Spectrum(對照組)0.9720正常開合、露齒
有 Spectrum(首次測試)0.9721正常開合、露齒
有 Spectrum(嚴格對照)1.0000正常開合、露齒
無 Spectrum · 0.972對照組。
有 Spectrum · 0.972台詞、語速、音色都守住了。
嘴型對照:上排無 Spectrum,下排有 Spectrum,各取四個時間點
放大嘴部的四點對照(上:無 Spectrum/下:有)。 兩邊都正常開合、都有露齒、都在正確的時間閉嘴。 畫面構圖不同是預期的——加速器本來就不可重現,同 seed 也會走不同軌跡。

相似度一模一樣,連 ASR 的錯誤形狀都相同。

兩支都把同一句台詞聽成加引號的版本,所以檢查工具跳的 長度比 1.058 警報兩邊都會跳——那是 ASR 的標點習慣, 跟加速器無關。指標報警時先確認它的前提還成不成立, 這個工具的判準原本是為了抓 TTS 爆音而設計的。

結論:fastmode 不再只限純動作片。有對白只要走聲線範本模式, 一樣吃得到那 63%。

第一次測試不夠嚴謹,所以重做了一次 首次測試的 seed、提示詞、幀數、步數、解析度全部相同, 但參考圖與參考音不是同一份檔案——產生對照組的腳本會先用 ffmpeg 轉檔 (參考音從 129KB 被重編碼成 43KB),而實驗組直接用了原檔。 當時我們把它寫成「單變因對照」,那是錯的。

重做的方式是:把對照組實際送出的那份 graph 從 /history/{prompt_id} 撈回來, 只改掛上加速器的那兩條線,並改用對照組實際用過的參考圖與參考音檔。 這一次才是真的只差加速器。
嚴格對照:上排無 Spectrum,下排有 Spectrum,各取四個時間點的全身畫面
嚴格對照(上:無加速器/下:有)。構圖、服裝、背景、動作幾乎完全一致。 而 ASR 相似度反而是 1.000——比對照組的 0.972 還高。

對話類影片的偏離,比動作片小得多。

加速器的官方說明寫著「快速或短暫的動作會偏離軌跡」, 本文前面那組 124 幀動作片的 SSIM 也確實掉到 0.9348。 但這支單人說話、動作簡單的片子,嚴格對照下畫面幾乎沒有差別。
偏離程度取決於畫面裡有多少快速動作,不是取決於有沒有開加速器。 所以對話類影片是它最安全的應用場景之一——這跟我們原本的直覺相反。

首次測試那支出現的服裝結構錯誤(裙子接在胸線上), 在嚴格對照裡沒有出現 → 那是參考素材不同造成的,與加速器無關。

變因三:步數

21.2%

20 步降到 14 步,其他全部固定(720P/362 幀/同 seed/Spectrum 開/purge 開), 連提示詞改寫都不影響時間——提示詞不參與計算量,所以修劇情可以搭便車。

單變因:唯一差異是步數
步數總時間採樣VAE實算/預測
20858.2s713s145.2s14 / 6
14676.6s548s128.6s11 / 3

有一個對照很漂亮:採樣時間比 1.301、實算次數比 1.273(14 次 vs 11 次), 兩者幾乎重合。時間跟著「實際 transformer 呼叫次數」走,不是跟著「步數」走。

變因四:一個 ComfyUI 的記憶體問題

40.7%

同一支工作流,兩次執行差了 464 秒。 拆開看,慢的那次不是採樣慢,是 VAE 解碼從 2 分鐘變成 9~10 分鐘

log 每一輪都寫著同一行:

[INFO] Spectrum H3 run teardown
[INFO] Model MiniMaxH3VideoVAE prepared for dynamic VRAM loading. 4965MB Staged.
[INFO] 0 models unloaded.

採樣結束、UNet 的活全幹完了,ComfyUI 一個模型都沒卸。 那 19995MB 的 H3 UNet 原封不動佔著 VRAM,而 VAE 解碼完全用不到它—— 於是 VideoVAE 只能拿剩下的空間做 dynamic loading,把 4965MB 硬擠進去。

解法是在 SamplerCustomAdvanced 與兩個 VAEDecode 之間插一個 VRAM_Debug(KJNodes),latent 從 any_input 穿過去:

VRAMdebug: free memory before:  6.21 GB
VRAMdebug: free memory after:  30.01 GB
VRAMdebug: freed memory:     23.80 GB (耗時 6 秒)
720P/362 幀/14 步,唯一差異是有沒有 purge
條件總時間採樣VAE
無 purge1140.8s~9 分9~10 分
有 purge676.6s9.1 分2.1 分
另一支剛好沒卡的694.7s9.6 分2.0 分

這是偶發的,不是可預測的規律。

採樣完只剩約 6GB 時,VAE 擠不擠得下是碰運氣——擠得下 2 分鐘, 擠不下多花八分鐘搬資料。purge 把碰運氣變成一定夠。

不要花力氣找「誰有罪」。我們先後歸因給「參考圖尺寸讓採樣變慢」和 「參考圖尺寸讓 VAE 變慢」,兩次都被實測推翻(三張參考圖那支反而快 45%)。 ComfyUI 生態裡有五十幾個記憶體清理節點,這件事的普遍性寫在工具的數量上。

取捨非常不對稱,所以預設偏向 purge:

要不要 purge
情境做法理由
連續生成多支短片不 purgeUNet 常駐,每支省 63~95 秒重載
長片(≥15 秒/720P)一定 purge1 分鐘重載換 6~8 分鐘卡頓
不確定purge輸只輸 1 分鐘,贏能贏 6 分鐘

六次被推翻的推論

Method

這份筆記真正的成本不是 GPU 時間,是六次看起來很合理、數據也支持、 結果全錯的推論。它們的形狀一模一樣:拿一個解釋力很強的模型去套數字, 卻沒有先確認那個模型的前提成不成立。

  1. 「直接減步數比加速器划算」——時間確實差不多,但畫質從 0.935 崩到 0.777。 比較速度時忘了另一軸。
  2. 「固定成本 130 秒、採樣優化天花板 37.6%」——用 20/14/13 三個點擬合直線, 回代誤差全部小於 1 秒。但三點擬合兩參數,貼合是必然。 跑一個區間外的 6 步去外插,模型預測 153.4s、實測 141.2s,假設當場崩掉。
  3. 「模型總量 39.55GB 塞不進 31.8GB,所以一直換入換出」—— log 裡寫著 current: cpu,text encoder 根本不在 VRAM; 而且每輪都是 0 models unloaded反證一直印在畫面上,我沒讀。
  4. 「參考圖尺寸讓採樣變慢」——採樣只差 1 分鐘,差的是 VAE 那 6 分鐘。
  5. 「超線性懲罰變小了(×3.32→×2.02)」——拿今天的 720P 比昨天的 480P, 把 SageAttention 的功勞算到超線性頭上。用同一天的數字重算是 ×3.18。
  6. 「Spectrum 省 15%」——用不同幀數線性外推。 同一支影片的 260 幀每幀 2.104s、294 幀每幀 2.218s,差 17%, 外推出來的數字全是垃圾。

從這六次裡長出來的四條規矩:

擬合誤差小 ≠ 模型正確,一定要用區間外的點外插驗證。
指標算出壞消息時,先檢查指標本身——那個 0.385 量的是「與參考音的相符度」, 只有硬對齊模式才有意義。
有實測數字時不要用外推,尤其在超線性系統裡。
規則要連前提一起記:「有對白 → 10 秒內」的前提是「用 TTS 精確對齊」; 換成聲線範本模式後前提消失,規則卻還在執行。

最後一條是最貴的 第四條不是技術問題。規則一旦脫離前提獨立存在,就會變成凝固的觀念—— 新知已經讀進來了,舊規則照樣執行。 所以本文所有規則都標了前提,前提不成立時該條自動作廢。

怎麼照做

Reproduce

上面那些百分比不是本文的重點,能自己量到才是。 這節把三個變因的取得、安裝、接線、以及「怎麼確認它真的生效」全部寫出來。 前提:你已經能在本地跑起 MiniMax H3(配置見 前篇)。

① SageAttention −36%

這是啟動參數,不是節點——工作流裡看不到它,最容易被漏掉。

# 1. 裝套件(用 ComfyUI 自己的 python,不要用系統 python)
.\python_embeded\python.exe -m pip install sageattention

# 2. 啟動時加參數(改你的 run_nvidia_gpu.bat)
.\python_embeded\python.exe -s ComfyUI\main.py --windows-standalone-build --use-sage-attention
怎麼確認生效 最可靠的做法是準備兩個啟動批次檔——一個有 --use-sage-attention、一個沒有—— 跑同一個工作流比較。本文那 36.4% 就是這樣量的(480P/260 幀/20 步,其餘全部固定)。 不要只看啟動 log,載入訊息不保證它在採樣時真的被用上。

② Spectrum 加速器 −29%

# 裝到 custom_nodes,零依賴、不需要 pip install 任何東西
cd ComfyUI\custom_nodes
git clone https://github.com/xmarre/ComfyUI-Spectrum-MiniMax-H3.git
# 重啟 ComfyUI

節點名稱 Spectrum Apply MiniMax H3,在 sampling/spectrum 分類下。 接法是把它插在 UNet 與取樣之間,MODEL 穿過去:

UNETLoader ──→ SpectrumApplyMiniMaxH3 ──┬──→ BasicGuider.model
                    └──→ BasicScheduler.model
參數:直接用預設,只改一個
參數說明
全部參數維持預設blend_weight 0.5/degree 4/warmup_steps 5⋯ 官方保守設定,本文數據就是用預設量的
debug改成 True唯一要改的。不開就無法確認它有沒有生效
history_storagesystem_ram放 RAM,別跟 latent 搶 VRAM
⚠️ 三個會讓它靜默失效的坑 1. 取樣器選錯:只吃 EulerRES multistepRES multistep CFG++ancestral 系列會靜默走回原生——不報錯、不提示,你會以為「這節點沒用」。
2. ComfyUI 太舊:需要 2026-08-03 的 commit e377e263 之後的版本。 (實測 08-02 的版本也能跑,因為它檢查的是 API 屬性而非 commit hash,但那是未驗證區間。)
3. 步數太低:warmup 佔前 5 步、RES 又強制保留最後 3 步原生, 14 步只剩 3 步能預測。步數越低它能幫的忙越少。
怎麼確認生效 開了 debug 之後,console 每次跑完會印一行總結:
Spectrum H3 run summary ... steps=20 actual_steps=14 forecast_steps=6 fallbacks=0
fallbacks=0 是關鍵——不是 0 就代表它中途退回原生了。
另一個更直覺的指紋:看 s/it 的抖動。有生效時它會在 6~91 秒之間跳(實算步與預測步交錯, tqdm 顯示的是移動平均);沒生效時是穩定單值。

③ 採樣完 purge VRAM 最多 −40%

需要 ComfyUI-KJNodesVRAM_DebugKJNodes/memory 分類)。 把它卡在取樣與解碼之間,latent 從 any_input 穿過去

SamplerCustomAdvanced ──→ VRAM_Debug ──┬──→ VAEDecode.samples
                      └──→ VAEDecodeAudio.samples

參數: empty_cache=True gc_collect=True unload_all_models=True
怎麼確認生效 這個節點自帶量測,console 會直接印出來:
VRAMdebug: free memory before: 6.21 GB
VRAMdebug: free memory after: 30.01 GB
VRAMdebug: freed memory: 23.80 GB
本文那次清出 23.8GB,耗時 6 秒。如果 freed 只有幾百 MB,代表你的 VRAM 本來就夠寬鬆,這一項對你沒用。

完整接線(把三項都加上去的樣子)

UNETLoader ──→ SpectrumApplyMiniMaxH3 ─┬→ BasicGuider ──┐
                     └→ BasicScheduler ─┤
CLIPLoader ─┐                         ├→ SamplerCustomAdvanced
VAELoader ──┼→ MiniMaxH3ReferenceToVideo ──────────────┘     │
LoadImage ──┘    (ref_images 可接多張)            ↓
                              VRAM_Debug
                                │
                   ┌───────────────┴──────────────┐
                 VAEDecode          VAEDecodeAudio
                   └──────→ CreateVideo ←────────┘
                          ↓
                        SaveVideo

最高效能的設定,取決於你在拍什麼——先看下一節的分流表。

純動作片可以三項全開+14 步;有對白就要跑滿 20 步, 而且能不能開 Spectrum 取決於你用哪種音訊模式。 沒有一組設定適合所有情況,這也是為什麼本文每個數字都標了對照條件。

現在的產線

Pipeline

用今天測到的係數重排 30 秒成品的時程:

720P 30 秒(2 段 × 15.08 秒)
階段時間備註
生成 ×2 段(20 步+Spectrum+purge)28.6 分有對白就跑滿 20 步
RTX Super Res → 1080P1.7 分40~50 秒/支,幾乎免費
ForcedAligner 字幕~1 分逐段真對齊
合計約 31 分第一天的推估是 43 分
走完整條產線的成品:聲線範本模式兩段 + 超解析度到 1080P + 逐段對齊字幕。 23 秒、沒有用到任何 TTS 音檔——台詞直接寫在提示詞裡。
分流:先確認你要的是哪一種,工具和代價都不同
你要拍的怎麼跑備註
純動作、無對白 14 步 + Spectrum + purge 15.08 秒單段沒問題
有對白(預設走這條) 聲線範本模式、20 步、可開 Spectrum 長度不受 10 秒限制,準確度 1.000
有對白・要一字不差
(人名/日期/數字)
TTS 硬對齊、20 步、不開 Spectrum 切 10 秒一段;非必要不用
唱歌 不要用這個模型 見下

說話這件事,已經可以幾乎完全放棄 TTS 硬對齊了。

聲線範本模式沒有長度綁定、沒有 TTS 爆音風險、可以開加速器, 而內容準確度在配方齊全時是 1.000。 硬對齊只剩「台詞必須一字不差」這一個理由還站得住。

唱歌是另一回事:歌不能讓模型自己重唱(旋律會跑掉), 所以只能走硬對齊;而硬對齊又受 10 秒限制,一首歌要切成一堆碎段, 接縫多、漂移累積。這個用途應該回去用分段錨定的舊管線—— 每一段各自錨定一張乾淨參考圖、段長依樂句切而不是均分, 抗漂移抗 morph。H3 在唱歌這件事上沒有優勢。

Reproducibility

環境

RTX 5090(31.8GB)/ComfyUI 0.30.0 本地/--cuda-malloc --use-sage-attention/ 取樣器 res_multistep/模型 minimax_h3_fl2vaminimax_h3_ref2va(int8)/文字編碼器 qwen3vl_32b(在 CPU)/ 2026-08-05 同日測得。

所有百分比皆為單變因對照。跨硬體與跨 ComfyUI 版本不保證可複製, 但控制變因的設計與各項 Pitfall 應該可以移轉。 SageAttention 那一項的舊值取自 2026-08-03 的實測,當時未開啟該參數。