转录运行时基准测试¶
状态: 历史基准测试方法和 2026-07-16 的临时 M2 Max 结果。这些测量结果并非当前的模型选择决策。
后来的 9 月 4 日侦察 测量了当前模型的推理阶段,并进行了探索性的线程数扫描。它没有改变生产环境的性能默认设置。
以下命令运行的是当前测试框架,而非固定的历史运行时。截至 2026-09-01,省略 --model 会选择编译默认的 GGUF 模型 Parakeet Unified English,而不是应用保存的选择或此处测量的 Parakeet v2 模型。请显式传入 --model 来选择所需的 GGUF;输出文件名不会选择模型。复现存档中的对比结果还需要其原始的运行时修订版本、模型工件、语料库和硬件。有关当前模型设置,请参阅项目 README。
所有命令都从仓库根目录运行。
目标¶
比较 Hex 在相同 M2 Max 输入上的转录运行时,而不基于其他机器发布的结果更改生产后端。
主要性能指标是预热后的实时因子中位数(median_rtf),越低越好。次要指标包括模型加载时间、每片段延迟的中位数和 p95、外部测量的峰值内存,以及聚合词错误率。
语料库¶
词汇语料库 增加了一套已提交的合成术语/干扰项集合、一个公开的普通语音防护抓取器,以及私有清单组合。可选的清单 vocabulary、每个片段的 expected_terms 和 group 字段支持召回率和误插入评分。vocabulary 仅作为评分列表;它不会改变识别结果,也不表示支持 Parakeet 提示。
该语料库位于本地,并被 Git 忽略,因为 Hex 默认不保留听写音频。创建 perf/transcription-corpus/manifest.json,并将 WAV 文件放在其旁边:
{
"clips": [
{
"id": "short-product-name",
"audio": "short-product-name.wav",
"expected": "OpenCode should keep this sentence concise."
}
]
}
每个片段录制一次,手动转录口语真实文本,然后在所有后端运行中保持两者固定不变。不要从任一模型推导参考文本。使用单声道或多声道 PCM WAV 文件;测试框架会在计时推理之前将它们下混并重采样为相同的 16 kHz 单声道输入。
构建一个至少包含 12 个片段的代表性听写语料库,覆盖以下内容:
- 单短语、单句和多句听写
- 清晰语音和普通房间或键盘噪音
- 说话立即开始和说话前有自然停顿
- 产品名称、技术性文本、数字和标点要求
- 更正、犹豫和重复的词语
- 片段时长大约 1 到 20 秒
生产运行时会为短于 1.5 秒的片段填充。测试框架应用相同的填充,但在计算 RTF 时使用原始语音时长。
命令¶
使用发布构建并保存生产环境 transcribe.cpp 的 JSONL 输出:
cargo run --release -- benchmark-transcription \
perf/transcription-corpus/manifest.json \
> perf/transcription-corpus/transcribe-cpp-metal-v2-q8.jsonl
该命令默认使用已安装的 GGUF 模型。仅在测试不同 GGUF 时传入 --model。对同一清单运行可选的旧版 ONNX 后端:
cargo run --release --features onnx-benchmark -- \
benchmark-transcription perf/transcription-corpus/manifest.json \
--backend onnx \
> perf/transcription-corpus/transcribe-rs-onnx-int8.jsonl
临时 M2 Max 对比¶
2026-07-16,从现有本地麦克风录音中截取的十个片段被用来运行两个后端。这些片段包含 127 秒的技术术语、普通散文、犹豫和重复词元失败案例。每个后端先运行两次全语料库预热,然后进行七次测量。Metal 实验在另一次 ONNX 运行后重复进行。
| 指标 | ONNX Int8 | transcribe.cpp Metal Q8 |
|---|---|---|
| 模型加载(缓存的 Metal 库) | 620 ms | 269-277 ms |
| 模型加载(构建后首次启动) | 未观察到 | 9,921 ms |
| 首个片段 | 296 ms | 142-150 ms |
| 语料库中位时间 | 3,703 ms | 2,056-2,318 ms |
| 片段中位时间 | 368 ms | 216-234 ms |
| p95 片段时间 | 509 ms | 303-356 ms |
| 最大片段时间 | 551 ms | 356-567 ms |
| 峰值常驻内存 | 1.73 GB | 1.05 GB |
| 临时 WER | 8.07% | 9.82% |
在两个后端都禁用原生诊断的情况下,Metal Q8 将推理时间中位数降低了约 37-44%,p95 延迟降低了约 30-40%,峰值常驻内存降低了 40%。与 285 个参考词相比,其转录结果多出了五个词编辑差异。其中一些差异是明显的改进,另一些则是回退。
新链接的 Metal 二进制文件的首次启动花费了大约 9.9 秒来初始化其嵌入的 Metal 库。紧接着的后续启动在大约 270 ms 内加载模型。生产环境中的尖峰测试必须考虑这种安装时的冷启动成本,并且在模型和 Metal 流水线可用之前不得报告监听器已就绪。
该语料库对于运行时比较很有用,但不适用于迁移质量门禁。其参考文本来自较早的 ONNX 会议转录,片段是在模型生成的片段边界处截取的,并且语音不是具有代表性的按住以听写输入。在选择生产后端之前,请记录独立的人工参考文本。
默认设置为一次不计入汇总统计的全语料库预热,随后进行七次测量。预热行保留冷推理成本,模型行报告冷加载时间,片段行保留第一遍转录文本和质量计数,测量行和运行行展示分布范围,最终汇总包含对比指标。
测试框架验证¶
2026-07-16,ONNX 后端在 M2 Max 上针对一段现有的 8.38 秒麦克风录音运行,以端到端验证发布模式下的测试框架:
- 模型加载:706.8 ms
- 热推理中位数:275.5 ms
- 中位 RTF:0.0329(30.4 倍实时)
- p95 推理:333.0 ms
- 参考文本:19 个词,完全一致复现
这并非迁移证据。该音频片段是会议语音,而非具有代表性的听写语料库;其参考文本来自同一 ONNX 后端的先前一次运行。它仅证明了解码、预处理、重复测量、JSONL 报告和质量统计能够协同工作。
请单独测量该命令运行期间的峰值常驻内存,因为分配器和后端持有的内存在进程内部并非总是可靠可见的:
cargo build --release
/usr/bin/time -l target/release/hex benchmark-transcription \
perf/transcription-corpus/manifest.json \
> perf/transcription-corpus/transcribe-cpp-metal-v2-q8.jsonl
迁移所用的决策规则¶
生产运行时已迁移到 transcribe.cpp;ONNX 现在仅通过 benchmark 功能可用。迁移时的规则是:保留 ONNX,直到 transcribe.cpp 使用具有独立参考的按住说话听写语音完成测量;并且仅当质量没有实质性回退,且延迟和内存方面的优势在打包、签名和前台应用冒烟测试中经受住考验时,才保留此次迁移。
记录每个后端修订版本、模型与量化方式、macOS 版本、电源状态和结果文件名。进行对比测试时,请插上电源,不要运行其他推理进程;重复实验时,请交替后端顺序。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 hex19/hex