跳转至

转录运行时基准测试

状态: 历史基准测试方法和 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