WatermarkDetector counts repeated token windows when deduplication is enabled

这个报错通常出现在使用 WatermarkDetector 并启用 ignore_repeated_ngrams=True 时,检测器仍把重复的 token 窗口计入 num_tokens_scored ,导致重复 bigram 被重复统计。优先排查检测器是否对重复 n-gram 做了预期中的去重处

快速结论:这个报错通常出现在使用 WatermarkDetector 并启用 ignore_repeated_ngrams=True 时,检测器仍把重复的 token 窗口计入 num_tokens_scored,导致重复 bigram 被重复统计。优先排查检测器是否对重复 n-gram 做了预期中的去重处理。

适用环境:Transformers 5.19.0.dev0,baseline source commit 469230357aab0f2b303b0d638c1f8d06edb14184;Windows-11-10.0.26100-SP0;Python 3.12.0;PyTorch 2.14.0+cpu,CUDA unavailable;huggingface_hub 1.33.0;Safetensors 0.8.0;未安装 Accelerate、DeepSpeed;单进程 CPU 检测,单输入行;pytest 8.4.2;Ruff 0.14.10。补充 Linux 检查使用 Python 3.12.3 和同一 source baseline。

最快修复方案:暂无确认的一步修复方案。Issue 中维护者已确认这是 bug,报告者随后提交了修复草案 PR #49315,包含本地修复和 24 个回归用例;在 PR 合入前,可优先尝试临时避免依赖 ignore_repeated_ngrams=True 的计数结果,或跟踪 #49315 的合并状态。

注意事项:#49315 在 issue 关闭时是 draft,issue 正文也明确说明本地 checkout 的修复不在 baseline commit 中,因此不能把该草案当作已发布版本行为。该问题只涉及计数逻辑,不要在没有证据的情况下推断其他 watermark 指标也一定受影响。

问题场景

用户在 CPU 上直接调用 Transformers 的公共 WatermarkDetector API,使用 GPT2Config 和 WatermarkingConfig 做检测,不需要模型权重、tokenizer 或模型下载。输入是一个合成 token 序列:10 个 token 3,vocab size 128,BOS/EOS 为 127,context_width=1,greenlist_ratio=0.25,z_threshold=3.0。用户分别以 ignore_repeated_ngrams=True 和 False 运行,并期望重复 bigram 的去重计数分别为 1 和 9。结果启用了去重时,num_tokens_scored 仍然按重复窗口计数,导致 count check 失败。

报错原文

WatermarkDetector counts repeated token windows when deduplication is enabled

ignore_repeated_ngrams=True
num_tokens_scored=[...]
FAIL: expected_count=1, actual_count=...

Failed count checks: 1/2

Issue 正文中给出的断言期望为:

expected_counts = {True: len(set(bigrams)), False: len(bigrams)}
assert expected_counts == {True: 1, False: 9}

原因分析

最可能的原因是:WatermarkDetector 在计算 num_tokens_scored 时,没有在启用 ignore_repeated_ngrams=True 的情况下正确排除或折叠重复的 token 窗口。对于输入 [3, 3, 3, 3, 3, 3, 3, 3, 3, 3],相邻 bigram 共有 9 个,但唯一内容只有 (3, 3) 一个。Issue 中的维护者回复确认这是 bug,因此该行为不是预期结果,而是计数逻辑缺陷。

环境排查

  • 确认 Transformers 版本是否为 5.19.0.dev0,或是否处于 commit 469230357aab0f2b303b0d638c1f8d06edb14184 的源码状态;若已包含 #49315 的修复,则现象可能不同。
  • 确认 Python 版本,Issue 中为 3.12.0,补充 Linux 检查为 3.12.3。
  • 确认 PyTorch 版本,Issue 中为 2.14.0+cpu,CUDA unavailable,且为单进程 CPU 检测。
  • 确认 WatermarkingConfig 参数:seeding_scheme、context_width=1、greenlist_ratio=0.25、z_threshold=3.0。
  • 确认 WatermarkDetector 参数:ignore_repeated_ngrams 分别设为 True 与 False。
  • 确认输入 input_ids 为 [3] * 10、dtype=torch.long、device="cpu"、vocab_size=128、bos_token_id=127、eos_token_id=127。
  • 确认 huggingface_hub 1.33.0、Safetensors 0.8.0;Accelerate 与 DeepSpeed 未安装。

解决步骤

  1. 使用 Issue 中的复现脚本,在未修改的 baseline commit 上运行,确认 ignore_repeated_ngrams=True 时 num_tokens_scored 是否等于 1。
  2. 同时运行 ignore_repeated_ngrams=False 的对照路径,确认其 num_tokens_scored 是否为 9,以排除环境或输入构造错误。
  3. 检查本地 transformers/generation/watermarking.py 中重复 n-gram 的计数逻辑,确认去重分支是否被正确应用。
  4. 如需修复,可优先尝试参考或跟踪 #49315 中的本地修复和 24 个回归用例;在 issue 关闭时该 PR 仍为 draft。
  5. 修复后重新运行复现脚本,并至少覆盖 Issue 中提到的 focused tests、watermark generation integration test 和仓库检查。
  6. 注意 Issue 中说明完整的 505-file dependency-map selection 尚未运行,如需合并修复,需要按维护者要求补齐剩余测试范围。

验证方法

重新运行 Issue 复现脚本,确认输出中 Failed count checks: 0/2,即 ignore_repeated_ngrams=True 时 num_tokens_scored 等于 1,ignore_repeated_ngrams=False 时等于 9。若使用 #49315 的回归测试,确认对应的 count checks 全部通过,并观察 watermark generation integration test 是否通过。

参考来源

huggingface/transformers #49299

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27586

发表回复

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