本文翻译自英文原文,如有出入,以英文原文为准。

ArtifactNet 研究 · 第 5 篇 · 2/3 · 2026 年 5 月

迈向实时

蒸馏与运行时——轻量 ≠ 快速

Intrect Research 2026 年 5 月 28 日 研究ArtifactNet

ArtifactNet 研究历程第 5 篇。这是 2026 年 5 月的记录:当时我们想把 SOTA 检测精度从 4 秒批量推理搬到流式实时处理。模型缩小了,反而更慢了;我们用 28 种方式更换运行时,撞上了硬件下限;也学到了代价高昂的一课:“实时模型”并不等同于“检测模型”。下面是把一个追求精度的模型硬塞进实时约束的工程过程——成功与失败,一并如实写出。

TL;DR

想看看当前模型的实际效果? 用免费演示处理任意曲目——与下文所述相同的取证流程,无需账号。


1. 起点:为什么需要“实时”

ArtifactNet 的检测流程本质上是离线的。

audio → STFT → ArtifactUNet (residual extraction) → HPSS → 7-channel forensic features
     → ResidualCNN → per-segment P(AI) → per-track median verdict

判断一首曲目时,我们抽取七个 4 秒片段,作为一个批次一起运行。每首曲目 0.58s,这已经绰绰有余;而且用户只想要结果,所以延迟从来不是问题。

问题来自方向相反的孪生研究。用同样的残差物理来去除 AI 音频里的 RVQ 鬼影,就得到一个音质修复工具(de-artifact)。我们还想把它做成音频插件(VST3)。插件必须对宿主送来的每个 256/512 采样点的块当场处理并返回——它看不到未来的帧(因果),也不能等上 4 秒。

换句话说,同一个 ArtifactUNet 主干网络必须同时活在两个世界里:

检测 de-artifact 实时
处理单位 4s 片段批处理 数十毫秒的块流式处理
未来帧 允许(双向) 禁止(因果)
延迟 无关紧要 几百毫秒以内
输出 P(AI) 还原后的波形

5 月的工作,就是为弥合这道鸿沟所做的工程。而在这个过程中,“模型越小越快”的直觉被打破了三次。


2. 第一次尝试——ArtifactUNetLite,轻量 ≠ 快速

第一版设计是 ArtifactUNetLite:1.85M 参数(3.6M Teacher 的一半)、在单一模型中同时处理 44.1/48/96 kHz 的多采样率架构,以及面向插件的因果流式处理。

有几项设计决策被明确定了下来:

8 项单元测试全部通过——多采样率下的 hop 在 44.1/48/96 上都稳定在 2.90ms,残差+干净信号重建输入的误差为 8.94e-08,因果性也成立。

接着,速度测试的结果令人震惊。在 CPU 上,Lite 比现有的检测 UNet 慢 2.5 倍——尽管参数已经减半。

深入排查后,原因很清楚:

  1. hop=128 意味着每个片段的帧数是 4 倍(T=200 对 48)。决定计算量的是帧数,而不是参数。
  2. 每一级的激活张量都几乎保持不变,C×F×T ≈ 1.7M 个单元。现有的检测 UNet 每经过一级,张量就减半(798k→98k),累计开销因此很低;而 Lite 禁止在时间轴上下采样,较大的 T 因此一直保持到最后。
  3. 减少参数节省的是权重内存,而不是 FLOPs。即使把 T 拆成 50–100 并多次调用,也只带来了 24% 的提升(1085ms→824ms)。

第一课:参数量不能代表速度。实时速度来自两点:(a) 用较大的 hop 减少帧数,(b) 向解码器一侧逐级收窄通道数以降低累计开销——Lite 两样都放弃了。

我们没有抛弃 Lite。单一的多采样率模型、零前瞻的因果流式处理,以及较小的权重内存(对移动端和存储友好),依然是真正的价值。但我们明确定下:它不会再被当作“RT 加速”路线提出。


3. ArtifactUNetRT 系列——短帧因果,对检测而言却是另一种语言

接下来是面向真正实时去除的 ArtifactUNetRT 系列。它不再处理 4 秒片段,而是流式处理短帧:

名称 T 帧数 片段长度 用途
RT8 8 ~93ms 最低延迟
RT16 16 ~186ms 推荐的低延迟档
RT24 24 ~278ms
RT48 48 ~557ms 标准模式

两项关键技术:

RT 系列使用 N_FFT=1024(117K 参数)——这是为低延迟而优化的小型频谱输入。它非常适合 VST3 的实时去除。

但我们在这里掉进了一个陷阱。“能不能把这个很快的 RT 模型也直接用在检测流程里?”我们提取了它的残差,送进现有的检测 CNN——结果 CNN 兼容性骤降到 30%。

原因简单而根本。检测 CNN 是在 N_FFT=2048 的频谱基底上训练的。RT 模型使用 N_FFT=1024,输入空间完全不同。残差的频率分辨率只有一半,CNN 看到的是它从未见过的分布。两个输入空间不同的模型,甚至无法直接比较。

第二课:为实时而更改的频谱基底,与下游模型不兼容。为速度而降低 N_FFT,是一个只适用于去除的选择,无法迁移到检测上。


4. ArtifactUNetFast——Teacher 蒸馏,可直接替换的答案

第三个模型成了连接两个世界的桥梁。ArtifactUNetFast 是一个 534K 的模型,比 Teacher(3.6M)小 6.7 倍,并且保留了 N_FFT=2048。由于频谱基底相同,它可以直接接入检测流程,同时还支持因果流式处理。

项目 规格
参数量 534K(比 Teacher 小 6.7 倍)
架构 CausalDSConv + CausalCLN,4 级 U-Net,base_channels=24
输入 (B, 2, 1025, T)——cat([H_mag, P_mag]),单次前向(Teacher 要做两次)
输出 (B, 2, 1025, T)——[mask_H, mask_P] ∈ [0, 0.5]²
训练 从冻结的 Teacher 进行知识蒸馏
损失 1.0 × MSE(mask) + 0.1 × spectral_convergence
数据 AIME + Jamendo + lo-fi hiphop(12K 个文件,60K 个片段,SR 池 44.1/48k)

蒸馏的核心是模仿 Teacher 的掩码,同时把输入打包成 2 个通道,使 H/P 在一次前向中处理完(Teacher 要把 H 和 P 分两次运行)。在收敛到最佳损失 0.06645 之后,我们在 10 首曲目上与 Teacher 做了对比:

指标 数值
掩码 Pearson 相关 H=0.84,P=0.86(强相关)
掩码 MAE H=0.080,P=0.073
掩码分布 Student 0.28 对比 Teacher 0.31
频谱收敛 0.38(残差特性得以保留)

掩码比 Teacher 的略粗糙,但分布和特性都得以保留——残差提取能正确运作。

速度才是重头戏。在 PyTorch 上,它与 Teacher 相近,但换到 ONNX Runtime 上,情况就完全不同了:

模型 ORT CPU 4 线程 p50 RTF 总延迟
Teacher(PyTorch,2 次前向) ~998ms 0.25 ~4s
Fast(PyTorch,1 次前向) ~1066ms 0.27 ~4s
Fast ORT T=16 18.5ms 0.10 204ms ✅
Fast ORT T=24 27.8ms 0.10 306ms

ORT 相比 PyTorch 加速 50 倍。在 T16 下,片段(186ms)加推理(18.5ms)合计 204ms 的总延迟——处在实时插件的预算之内。

我们导出了三种产物——原始 ONNX(供 ORT 运行时使用)、CausalCLN 图手术版本(仅限 Rust/tract 的自定义算子),以及经 onnxsim 优化的版本。注意,图手术版本在 ORT 上创建会话会失败(不支持该自定义算子),因此它只能用于 Rust/tract。这个分叉引出了下一节的运行时之战。


5. 运行时之战——从 tract 到 TensorRT,全部试遍

模型确定之后,问题变成了该用哪个运行时来跑它。为了压缩 de-artifact 实时去除(RT48 立体声)的延迟,我们几乎试遍了所有推理引擎和设置。

CPU 阶梯

阶段 RTF(立体声)
tract 顺序执行(起点) 0.416
tract 并行 L‖R 0.218
迁移到 ORT FP32 4‖4 0.031
ORT 配置调优 0.029
CausalCLN→LayerNorm ONNX 图手术 0.023
理论最小值(需要自定义算子) ~0.018

仅仅从 tract 换到 ONNX Runtime,RTF 就从 0.416 改善到 0.031——提升了 18 倍(tract 的顺序执行,对比 ORT 的 MLAS 优化加上 L/R 会话并行)。图手术把它降到了 0.023。CPU 的绝对下限(Ryzen 5800X,AVX2 FP32)是立体声 11.9ms,RTF 0.022。

GPU 阶梯

设置 延迟(p50) RTF 相对 CPU
CPU 立体声 4‖4T 12.2ms 0.0223 1×
CUDA 顺序 L→R 3.9ms 0.0072 3.1×
CUDA Graph FP16 2.52ms 0.0046 4.8×
TRT FP16 顺序 1.71ms 0.0031 7.1×
TRT FP16 batch=2 1.44ms 0.0026 8.5×

GPU(RTX 3060)的最终下限是 TensorRT FP16 batch=2,1.44ms(RTF 0.0026)。把立体声的 L+R 合并进单次前向的 batch 维度,始终比多流更快(TRT 的 batch 融合会以最优方式分配 SM 资源)。强制 LayerNorm 使用 FP16(禁用 FP32 回退),又额外提升了 5%。

替代方案的坟场(实话实说)

看起来很快、却失败或退化的路线:

试遍 ORT SessionBuilder 的全部 28 个选项之后,我们得出结论:11.5–12.3ms 就是这套硬件的绝对下限。想再降下去,就得重新训练模型(缩小)或换新硬件。这不是失败,而是划定了边界——知道什么是可能的,才能决定在这条线之上放弃什么。


6. CausalCLN → LayerNorm 图手术——数值不变,速度更快

补充说明一下贯穿整条运行时阶梯、反复出现的 CausalCLN→LayerNorm 图手术。它是最小、却最干净的一项优化。

训练时的 CausalChannelLayerNorm 是一个自定义算子,逐帧计算 (C,F) 统计量。它能保证因果性,但在推理图中无法干净地映射到标准 ONNX 算子。于是我们直接对计算图动手术,把它换成数值等价的标准 LayerNorm + 转置模式。

关键在于,输出逐位完全一致,只有运行时变快了——因为 ORT 会把标准的 LayerNorm 模式识别为融合内核。在 ORT 1.24.x 上重新验证,图手术实测带来 +3.69ms 的收益;在性能剖析中,LayerNorm 占总耗时的 20.1%,图手术新增的 Transpose 占 16.8%——但整体仍是净收益。

一个有意思的反例:把同样的 LayerNorm 直接实现为 Rust 自定义算子,反而让单声道退化了 1.3ms。对于较小的 T=48 循环,ORT 的 MLAS 融合实现胜过了带循环转置的 Rust 实现。“手写内核总是更快”同样是一种错误的直觉。


7. 检测流程的答案——Teacher ONNX

实时去除分叉为 RT/Fast 两条路线的同时,我们也检查了检测流程本身能否迁移到 ORT。答案是直接把 Teacher 导出为 ONNX。

项目 结果
ORT 4 线程,单声道 275.8ms(达到 <500ms 的目标)
CNN 判定一致率 100% (9/9)
数值误差 最大 2.56e-06
参数量 3.6M
ONNX 节点数 76(简单的 UNet 结构)

保留 N_FFT=2048,使其与检测 CNN 的判定达到 100% 一致(数值误差 2.56e-06)。这正是它与 RT 模型的决定性区别:

模型 ORT 速度 CNN 兼容性 用途
RT(N_FFT=1024,117K) 立体声 12.3ms 30% 仅限 VST3
Teacher(N_FFT=2048,3.6M) 单声道 275.8ms 100% 检测流程

对检测而言,答案是大的 Teacher,而不是小的 RT 模型——判断标准是兼容性,而不是速度。


8. 代价最高的一课——“实时模型”不是“检测模型”

这是本文的核心。整个 5 月,我们一直被一个诱惑缠着:把这些快模型直接用在检测流程里。结果失败了三次,每次的原因都不同。

(1) ArtifactUNetRT——频谱基底不匹配。N_FFT=1024,因此 CNN 兼容性只有 30%。(§3)

(2) ArtifactUNetLite——参数量倒挂。1.85M,在 CPU 上却比检测 UNet 慢 2.5 倍。(§2)

(3) ArtifactUNetFast——双层陷阱。

Fast 保留了 N_FFT=2048,所以不存在 RT 那样的兼容性问题。这就引出了一个自然的问题:“如果在 Fast 上重新训练检测 CNN 会怎样?”对残差的比较揭示了两件事:

UNet 路径 TPR(AI) FPR(真实)
codec4(当前生产) 98.0% 0.0%
phase2(Fast 的 teacher) 100.0% 55.0%
Fast(直接替换) 98.0% 52.5%

正确的顺序很清楚——要用 Fast 做检测,必须先从感知编解码器的 teacher(codec4)重新蒸馏,再在其上叠加 CNN。而且如果目标不是实时流式处理,检测就不需要因果约束,那么一个双向的轻量 student 在精度和效率上都占优。

第三课,也是最大的一课:实时约束(因果、短 hop、小 N_FFT、2 通道融合)与检测的精度和速度正面冲突。想让同一个主干网络兼顾两个世界的野心,每一次都付出了不同的代价。结论是分工:去除用 Fast/RT,检测用 Teacher/codec4。


9. 附记——对抗性规避与轻量 SOTA 对比

这个月还有两项检查作为收尾。

对抗性规避测试。de-artifact 的目的是提升音频质量,而不是规避检测。尽管如此,作为尽职调查,我们自查了这款抑制工具是否可能被滥用于规避——把原始音频以及抑制强度 α=0.5/1/2/4 下的输出分别送过检测流程,测量 P(AI) 的变化。(检测的鲁棒性会在后续的一篇中讨论。)

轻量 SOTA 对比。大约同一时期,我们在一个小子集上(SONICS 伪造 150 + 真实 150),与一个外部基线(基于 MERT 的 2 阶段模型,174M 参数)做了对比。4.2M 的 ArtifactNet 以TPR 100%、FPR 10.7%、F1 0.949 领先,胜过 174M 的模型(F1 0.929),速度快 4.5 倍——每首曲目 0.58s,对比 2.62s。考虑到子集规模,重点不在绝对数字,而在于参数量相差 40 倍却仍占优势——这再次印证了本系列的前提:小模型是走向实时的起点。


10. 经验总结与后续计划

参数量不等于速度。两次倒挂——Lite(2.5 倍)和 Fast(3.44 倍)——指向同一个事实:实时速度取决于 hop 大小、通道收窄方式、激活张量大小和内核启动次数。在缩小模型之前,先对真正慢的地方做性能剖析。

实时优化会破坏下游兼容性。降低 N_FFT(RT)以及因果/2 通道融合(Fast),都与下游的检测 CNN 发生了冲突。要让同一个主干网络服务多个用途,必须先决定哪些维度共享、哪些维度分叉。我们共享了频谱基底(N_FFT=2048),并把因果性和通道融合分叉出去。

把运行时试遍不是失败,而是划定边界。依次试过 tract→ORT→TVM→OpenVINO→TensorRT,钉死了硬件下限(CPU 11.9ms,GPU 1.44ms),让我们得以在这条下限之上,合理地决定该放弃什么、该重新训练什么。

下一篇中,我们会把这个打磨过的 SOTA 拿出去攻击它的剩余弱点——结果反而开始怀疑我们自己的评估方法。


ArtifactNet 研究团队 · 2026 年 5 月

← 第 4 篇:基准饱和陷阱 全部文章 第 6 篇:超越 SOTA →

用你自己的曲目试用检测器

上传任意文件——使用本系列所述的同一套取证流程。