Batch Decoding of LMs will cause different outputs with different batch size

当使用 Hugging Face Transformers 的 model.generate() 对 Llama 等语言模型进行批量解码时,即使 do_sample=False 使用 greedy 搜索,不同 batch size 下相同输入的第一个样本输出结果可能不一致。优先确认 padding_

快速结论:当使用 Hugging Face Transformers 的 model.generate() 对 Llama 等语言模型进行批量解码时,即使 do_sample=False 使用 greedy 搜索,不同 batch size 下相同输入的第一个样本输出结果可能不一致。优先确认 padding_side 设置是否左对齐,并注意 attention mask 可能被意外截断或遗漏。

适用环境:Transformers 4.31;PyTorch 2.01;CUDA 11.8;Python 3.10;NVIDIA A100 80GB GPU。

最快修复方案:暂无确认的一步修复方案。该 Issue 虽已关闭(标签 WIP),但未提供官方明确的修复代码或补丁。可优先尝试将所有输入补全至相同长度(同 batch 内 padding 对齐)并确保 attention_mask 正确传递。

注意事项:此问题在相同输入文本(identical prompts)下仍可复现,说明与 left padding 本身无关,可能涉及 batch 张量计算中的数值差异或缓存机制。社区讨论中尚未给出最终结论。

问题场景

用户在使用 yahma/llama-7b-hf 模型进行批量文本生成时,将相同的问题列表分为不同 batch size(例如 8 条与 4 条),并比较各 batch 中第一个样本的生成结果。在 do_sample=False(greedy 解码)下,期望相同输入的输出应完全一致,但实际出现差异。即使将 batch 内所有输入字符串设为完全相同,问题依然存在。

报错原文

Batch Decoding of LMs will cause different outputs with different batch size

具体表现为:对相同问题(如 “Can you explain to me what is the concept of deep learning and how it can be applied to NLP?”),在 batch size=8 时生成结果截断于 “The idea is that”,而在 batch size=4 时生成完整句子。输出结果不一致,且不固定于特定 token。

原因分析

可能原因:

  • 在 batch 解码过程中,attention_mask 的计算或传递存在条件分支差异,导致不同 batch size 下模型内部状态(KV cache)的初始化不同。
  • Transformers 的 PreTrainedModel.generate() 在内部根据 batch size 动态调整某些优化(如 flash attention 或 tensor parallelism),可能引入非确定性。
  • 尽管设置 padding_side="left",但 pad_token_id 的设置或 tokenizer 的 padding 行为在不同 batch size 下对输入序列的截断/对齐方式不一致。

注意:Issue 评论确认即使所有样本完全相同,问题仍可复现,因此不能归因于 padding 对齐差异。

环境排查

  • Python 版本:3.10
  • PyTorch 版本:2.01
  • CUDA 版本:11.8
  • Transformers 版本:4.31
  • 模型:yahma/llama-7b-hf(Llama-7B)
  • GPU:NVIDIA A100 80GB
  • 生成配置:do_sample=False, max_new_tokens=50

如果遇到类似问题,请先确认上述版本是否完全一致,尤其是 Transformers 版本。同时检查 padding_side 是否为 "left",以及 pad_token_id 是否正确设置。

解决步骤

  1. 确保所有输入序列长度一致(可选尝试):在生成前将所有输入文本通过 tokenizer 单独处理并截断/填充到相同长度,然后再组成 batch。此方法可能提供稳定的 attention mask 结构。
  2. 升级 Transformers 版本:截至 Issue 关闭日(2026-07-28),该标签为 WIP,可能已在更高版本(如 4.32+)中修复。建议升级并重新测试。
  3. 使用单条生成并手动循环:作为临时 workaround,对 batch 内每条数据单独调用 model.generate(),避免 batch 内差异。
  4. 切换至早于 4.31 的版本:若升级后问题仍存在,可尝试降级至 Transformers 4.30 或之前版本,确认是否为 4.31 引入的回归。

注意:以上步骤均基于社区推测,尚未在 Issue 中经过官方验证。可优先尝试第 1 步(长度对齐)。

验证方法

分别使用不同 batch size(例如 1、2、4、8)对相同的前 N 个问题运行生成脚本,对比第一个样本的输出字符串。如果输出完全相同,则问题修复。建议在固定随机种子(torch.manual_seed(0))下重复测试以排除随机性干扰。

参考来源

huggingface/transformers #25921

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 15733

发表回复

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