Avoid repeated Cohere ASR encoder projection during cached generation

该报错涉及 Hugging Face Transformers 中 Cohere ASR 模型在缓存生成(cached generation)阶段反复执行 encoder-to-decoder 投影操作,造成不必要的计算开销。优先排查方案是确认是否使用了 EncoderDecoderCache 以及

快速结论:该报错涉及 Hugging Face Transformers 中 Cohere ASR 模型在缓存生成(cached generation)阶段反复执行 encoder-to-decoder 投影操作,造成不必要的计算开销。优先排查方案是确认是否使用了 EncoderDecoderCache 以及生成阶段是否重复调用 decoder.proj

适用环境:Hugging Face Transformers 仓库(CohereAsrDecoder.forward());Issue 中测试环境为 RTX 3060 12 GB、BF16、batch 24、SDPA、max_new_tokens=445,涉及 500 段阿拉伯语音频(5,032.699 秒)。Python、CUDA、PyTorch 具体版本未在 Issue 中明确。

最快修复方案:暂无确认的一步修复方案——该优化目前以 PR 形式存在(分支 AliOsm:optimize-cohere-asr-encoder-projection,commit 52d19f812c),尚未合并到上游主线;如需修复请等待合入或自行应用该 commit。

注意事项:该优化方案仅影响跨注意力(cross-attention)缓存已全部初始化后的生成阶段;训练、use_cache=False、新缓存或部分初始化缓存行为不变。基准测试为生产环境单次观测,非统计性结论。

问题场景

在 Hugging Face Transformers 中使用 Cohere ASR 模型进行批量推理(batch inference)时,用户发现在缓存生成(cached generation)阶段,CohereAsrDecoder.forward() 在每一步自回归解码调用中都会重复执行 encoder-to-decoder 投影(`decoder.proj`)。实际上,在 prefill 之后,每一层解码器的 encoder K/V 状态已缓存,后续步骤不再消费投影后的 encoder 数值,仅需要 source-shape 和 mask 元数据。该冗余计算导致生成延迟增加,但对输出结果无影响。

报错原文

Avoid repeated Cohere ASR encoder projection during cached generation

(注:Issue 标题即为核心报错描述;Issue 内未包含具体堆栈或异常文本,而是性能优化提案。)

原因分析

主要原因(在 Issue 中已验证):CohereAsrDecoder.forward() 在每次自回归解码调用时无条件执行共享投影(shared projection)。当 EncoderDecoderCache.is_updated[layer_idx] 在 prefill 后全部为 true 时,该投影不再被跨注意力层实际消费,但仍被重复计算。可能原因:实现未利用现有 cache 生命周期判断投影是否需要执行,导致缓存阶段产生不必要的计算。

环境排查

  • 确认 Transformers 版本是否包含 CohereAsrDecoderEncoderDecoderCache 相关实现。
  • 确认生成时是否显式设置 use_cache=True(默认值取决于模型配置)。
  • 确认 encoder/decoder 宽度是否不同(如 24 -> 16),以验证跳过投影是否影响数值精度。
  • 若复现性能问题,可统计单次生成中 decoder.proj 被调用的次数(Issue 中实测为 3,224 -> 21 次)。

解决步骤

  1. 确认当前 Transformers 是否已合入该优化(检查 commit 52d19f812c 或分支 AliOsm:optimize-cohere-asr-encoder-projection)。
  2. 如未合入,可优先尝试自行 cherry-pick 该 commit 或修改 CohereAsrDecoder.forward():仅在至少一个跨注意力缓存层未初始化时执行投影;当所有 EncoderDecoderCache.is_updated[layer_idx]true 后跳过共享投影。
  3. 跳过投影时,使用缓存的第一层 K 张量作为零拷贝 mask 元数据,确保 source length 和投影/KV dtype 在混合精度下保持一致。
  4. 验证训练、直接 forward、use_cache=False、新缓存和部分初始化缓存行为不变(保留原投影逻辑)。
  5. 如需合入上游,按仓库 agentic-contribution 政策提交 PR(需注明 AI 辅助披露)。

验证方法

跑通完整 Cohere ASR 模型测试套件及仓库一致性检查(make stylemake check-repopytest -q tests/models/cohere_asr/test_modeling_cohere_asr.py,Issue 中验证结果为 128 passed, 131 skipped)。另外可采用以下方法:

  • 对比跳过投影前后生成结果的 bit-exact 一致性(Issue 中 max_abs_diff=0.0)。
  • 统计解码过程中 decoder.proj 调用次数是否从每个 token 一次降至每个 generation batch 一次。
  • 对比生成阶段耗时(Issue 实测提升约 3.47% / 1.036x)。

参考来源

huggingface/transformers #47272

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19629

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注