ChatGLM-Tuning icon indicating copy to clipboard operation
ChatGLM-Tuning copied to clipboard

finetune数据样本不需要增加[MASK]标记吗?

Open superhg opened this issue 1 year ago • 7 comments

finetune Belle数据集的时候遇到了一个问题:

File "/tal-vePFS/LLM/hegang/workspace/ChatGLM-chinese-insturct/modeling_chatglm.py", line 836, in forward mask_position = seq.index(mask_token) ValueError: 150000 is not in list 1%| | 1448/203736 [48:57<113:59:24, 2.03s/it]finetune1.sh: line 71: run_cmd: command not found

分析了一下,是说input_ids中没有mask_token or gmask_token导致了报错

代码中处理数据的时候是在最后增加了一个eos_token ‘ def preprocess(tokenizer, example, max_seq_length): prompt = example["context"] target = example["target"] prompt_ids = tokenizer.encode(prompt, max_length=max_seq_length, truncation=True) target_ids = tokenizer.encode( target, max_length=max_seq_length, truncation=True, add_special_tokens=False ) input_ids = prompt_ids + target_ids + [tokenizer.eos_token_id] return {"input_ids": input_ids, "seq_len": len(prompt_ids)} ’

superhg avatar Mar 25 '23 08:03 superhg

@mymusise 帮忙看一下

superhg avatar Mar 25 '23 08:03 superhg

应该是数据预处理的问题,可以参考下 tokenize_dataset_rows.py 的逻辑

mymusise avatar Mar 25 '23 13:03 mymusise

我在试验belle开源的中文数据集的时候,也遇到了这个问题

franklyd avatar Mar 28 '23 02:03 franklyd

这个问题在输入内容长度太长时会出现,原因是在encode时先做了特殊token的拼接再截断,导致截断后,拼接的特殊token 150001 150004丢掉了。快速的修复方式是直接在tokenize_dataset_rows.py preprocess函数中将 prompt_ids处理下,把最后2个id改为150001 150004 prompt_ids[-2] = 150001 prompt_ids[-1] = 150004

Aloha0424 avatar Mar 28 '23 03:03 Aloha0424

prompt_ids[-2] = 150001 prompt_ids[-1] = 150004

谢谢!!

superhg avatar Mar 28 '23 10:03 superhg

Belle数据集中有一些样例包含了'[MASK]'字符,和chatGLM中的特殊字符重合了,并且在ChatGLMTokenizer.build_inputs_with_special_tokens()中,期望逻辑是在如果token_ids中没有mask_token=150000或gMASK_token=150001,则在token_ids末尾插入[gMASK_token, bos_token],即[150001, 150004]。如果token_ids中存在mask_token=150000(即[MASK]),在增加特殊字符时会跳过插入mask_token的步骤。这样无法保证prompt_ids是以[150001,150004]结尾。也会导致后续计算attention_mask和position_ids时出现问题。

处理方式: 1、替换数据集中的[MASK]<MASK>; 或2、去除prompt_ids最后两个元素不是[150001,150004]的样例;

XingLuxi avatar Mar 29 '23 02:03 XingLuxi

这个问题在输入内容长度太长时会出现,原因是在encode时先做了特殊token的拼接再截断,导致截断后,拼接的特殊token 150001 150004丢掉了。快速的修复方式是直接在tokenize_dataset_rows.py preprocess函数中将 prompt_ids处理下,把最后2个id改为150001 150004 prompt_ids[-2] = 150001 prompt_ids[-1] = 150004

请问是这样改吗,还是报错... 哦哦 我傻了。。数据处理的代码改过之后数据要重新处理一遍/(ㄒoㄒ)/~~ ValueError: 150001 is not in list

def preprocess(tokenizer, config, example, max_seq_length):
    prompt = example["context"]
    target = example["target"]
    prompt_ids = tokenizer.encode(prompt, max_length=max_seq_length, truncation=True)
    prompt_ids[-2] = 150001
    prompt_ids[-1] = 150004
    target_ids = tokenizer.encode(
        target,
        max_length=max_seq_length,
        truncation=True,
        add_special_tokens=False)
    input_ids = prompt_ids + target_ids + [config.eos_token_id]
    
    return {"input_ids": input_ids, "seq_len": len(prompt_ids)}

starplatinum3 avatar Apr 11 '23 02:04 starplatinum3