UserWarning: Could not find response key `[/INST]` in the following instance: [INST] ...


在微调模型的时候遇到该问题,log文件如下:
This instance will be ignored in loss calculation. Note, if this happens often, consider increasing the max_seq_length.
warnings.warn(/home/wanglinjie/anaconda3/envs/chatkbqa/lib/python3.9/site-packages/trl/trainer/utils.py:110: UserWarning: Could not find response key [/INST] in the following instance: [INST] << SYS>><< SYS>>

找到的解决方案:

  1. https://github.com/huggingface/trl/issues/980
  2. https://discuss.huggingface.co/t/zero-loss-while-finetuning-llama2-usin-sft-trainer-and-the-use-of-collator/63831

这两个都提出,将collator进行修改:
变成response_template = “Answer: [/INST]”
collator = DataCollatorForCompletionOnlyLM(tokenizer.encode(response_template, add_special_tokens = False)[2:], tokenizer=tokenizer)

原因:
在NLP任务尤其是生成式任务中,通常会有一个响应模板,用于标记模型的输出部分,这个模板用于知识模型生成的答案部分
分词器处理文本时,可能会根据文本上下文生成不同token ID,当文本中包含更多单词时,分词器可能产生不同token id,这导致在预处理数据时,响应模板中的token id与实际数据中的不匹配,从而导致模型无法正确识别响应部分

如果响应模板在数据中找不到,模型会忽略这些样本,因为它们无法正确计算损失值

解决:
确保在预处理数据时,响应模板的token id与实际数据中的token id一致。可通过以下步骤实现:

  1. 定义一个响应模板
  2. 创建数据整理器

add_special_tokens=False:
在编译文本时,分词器不会添加任何特殊标记。
把特殊标记禁止,就能解决该问题。

默认为True的话,就会在里面有一些< SEP>什么的,导致识别失败。

添加完这个,就没问题了,有loss了

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐