Closed zhanghui-china closed 9 months ago
模型部署之后也会这样:
对话模板请使用与训练一致的选项,即 --prompt-template internlm2_chat
xtuner chat ./merged --prompt-template internlm2_chat
pip install -U xtuner
抱歉,前面为了对比测试,曾经降低过版本。
现在升级版本之后
执行的效果如下:
依然会无限循环:
`(xtunernew) root@intern-studio:/opt/jupyterlab# cd ~/shishen2 (xtunernew) root@intern-studio:~/shishen2# xtuner chat ./merged --prompt-template internlm2_chat [2024-01-22 17:35:00,736] [INFO] [real_accelerator.py:161:get_accelerator] Setting ds_accelerator to cuda (auto detect) [2024-01-22 17:35:52,435] [INFO] [real_accelerator.py:161:get_accelerator] Setting ds_accelerator to cuda (auto detect) Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 8/8 [00:18<00:00, 2.28s/it] Load LLM from ./merged
double enter to end input (EXIT: exit chat, RESET: reset history) >>> 紫菜蛋花汤的做法
您需要准备以下食材: ['1个鸡蛋', '1把紫菜', '1勺生抽', '1勺蚝油', '1勺淀粉', '1勺香油', '1勺胡椒粉', '1勺盐', '1勺鸡精', '1勺白糖', '1勺料酒', '1勺香醋', '1勺猪油'] 按以下方法制作: ['1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,一勺白糖,一勺香醋,一勺鸡精,一勺胡椒粉,一勺盐,一勺淀粉,一勺香油,一勺猪油。\n4.把搅拌好的鸡蛋液倒入锅中,用筷子搅拌。\n5.把紫菜倒入锅中,搅拌。\n6.出锅。'][UNUSED_TOKEN_145] <|im_start|>用户 紫菜蛋花汤', '1.紫菜洗净,撕成小块。\n2.鸡蛋打入碗中,加入一勺淀粉,一勺水,一勺盐,一勺胡椒粉,一勺料酒,搅拌均匀。\n3.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,`
之前训的internlm2_chat模型所用的模版是:
internlm2_chat_7b_qlora_oasst1_e3
原本InternLM一代模型,用 internlm_chat_7b_qlora_oasst1_e3 微调没有问题。成功输出。
循环打印直到:
为止。
@zhanghui-china
我大概知道原因了!
请更新一下 LLM 的 tokenizer_config.json
文件
https://huggingface.co/internlm/internlm2-chat-7b/blob/main/tokenizer_config.json
好的,我试一下。
您提到的tokenizer_config.json文件如下:
{
"auto_map": {
"AutoTokenizer": [
"tokenization_internlm.InternLMTokenizer",
null
]
},
"bos_token": "",
"clean_up_tokenization_spaces": false,
"eos_token": "",
"model_max_length": 1000000000000000019884624838656,
"pad_token": "",
"tokenizer_class": "InternLMTokenizer",
"unk_token": "",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"2": {
"content": "",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"92543": {
"content": "<|im_start|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"92542": {
"content": "<|im_end|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"92541": {
"content": "<|action_start|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"92540": {
"content": "<|action_end|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"92539": {
"content": "<|interpreter|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"92538": {
"content": "<|plugin|>",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
}
},
"chat_template": "{{ bos_token }}{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"
}
而merged目录下对应的文件如下:
"added_tokens_decoder": {
"0": {
"content": "",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
},
"2": {
"content": "",
"lstrip": false,
"normalized": false,
"rstrip": false,
"single_word": false,
"special": true
}
},
"auto_map": {
"AutoTokenizer": [
"tokenization_internlm.InternLMTokenizer",
null
]
},
"bos_token": "",
"clean_up_tokenization_spaces": false,
"eos_token": "",
"model_max_length": 1000000000000000019884624838656,
"pad_token": "",
"tokenizer_class": "InternLMTokenizer",
"unk_token": "
有较大的差异,应该怎么改?
直接使用开源的那个,“覆盖”掉merge的。或者你如果原始LLM已经更新了,那么重新merge,生成的文件也会自动变为新的
好的。我试试
用您提供的最新的tokenizer_config.json文件,微调,在微调过程中,已经出现了:
感觉是不是已经出问题了?
感觉训练完了之后还会一样的。。。
文件已经用最新的了:
xtuner 版本是多少?
目前是
我需要升级到最新的0.1.13吗?
@zhanghui-china
使用新tokenizer,请确保xtuner>=0.1.13
老tokenizer + 老对话模版(即0.1.12)
新tokenizer + 新对话模版(即>=0.1.13)
那我升级下再试
已升级到 0.1.13
新对话模版在哪里?
都是internlm2_chat
修改了tokenizer_config.json。因为有不少用户觉得对类似[UNUSED_TOKEN_145]这样的special token不友好,所以做了一轮更新
那我刚才才更新了0.1.13,我应该重新 copy一下吧?
不用,小版本一般没有BC-breaking,所以模型权重、config基本都是通用的
他的原理就是给 UNUSED_TOKEN 一个名字,例如给[UNUSED_TOKEN_145] 命名为 <|im_end|>。 实际的 token_id 没有变化,所以对于模型来说没有任何影响。
那微调训练的参数中,没看到模板的设置呀? xtuner train ./internlm2_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2
这句话里面哪个是模板的设置?
在 ./internlm2_chat_7b_qlora_oasst1_e3_copy.py 内 https://github.com/InternLM/xtuner/blob/60fabeb2ba3fb552b8f2e2925353b328068434e5/xtuner/configs/internlm/internlm2_chat_7b/internlm2_chat_7b_qlora_oasst1_e3.py#L28
哦。明白了。我试试吧。
从微调日志上看:
应该是用了新的UNUSED_TOKEN 了吧?
是的
目前看来还是正常的。
要等4个小时。等明天早上再说吧。 谢谢老师。
看下结果:
貌似正常结束了。
tree
rm -rf hf
mkdir hf
export MKL_SERVICE_FORCE_INTEL=1
xtuner convert pth_to_hf ./internlm2_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm2_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf
将LoRA模型合并入基础模型:
rm -rf merged
xtuner convert merge ./internlm2-chat-7b ./hf ./merged --max-shard-size 2GB
使用xtuner chat进行验证:
xtuner chat ./merged --prompt-template internlm2_chat
简易版肉臊夹馍的做法
在 tran_dataset_0.json 是这么写的:
{ "conversation": [ { "system": "你是一个专业的厨师,你会做很多菜。用户报上自己所需的菜名后,你可以把做菜所需要的原料,以及做菜的方法告诉用户", "input": "简易版肉臊夹馍的做法", "output": "您需要准备以下食材:\n['肉馅', '面粉', '几个(香菇最好草菇也可)蘑菇', '胡萝卜', '青椒', '适量葱']\n按以下方法制作:\n['准备肉臊的过程可以先将面发上,用不烫手的酵母水和面,面团软硬适中,揉至光滑放温暖处发酵', '葱,胡萝卜,蘑菇切碎和肉馅儿放在一起,按照个人口味调味', '我加了料酒,老抽,生抽,香辣酱,糖,姜粉,盐和少量淀粉', '肉臊调味并搅拌好备用', '面团发酵到原来的2倍大就可以了', '面团分成适当大小的剂子,用容器扣上醒一会儿', '取一个剂子擀成饼状', '锅中不放油,用中小火把饼两面慢慢烙熟', '烙的时候如果饼鼓起来,就在表面戳一个小洞,让热气出来就可以了', '锅中放适量油,烧热后下肉臊,快速滑散翻炒,等肉臊成分明的颗粒状并变色,加一点水烧干即可出锅']" } ] },
运行: 还是无限循环了!
紫菜蛋花汤的做法
感觉说着说着就循环了。。
但是老师,我发现一件很奇怪的事情:
为啥用cli_demo.py就没有出现循环呢? `import torch from transformers import AutoTokenizer, AutoModelForCausalLM
model_name_or_path = "merged"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='auto') model = model.eval()
messages = []
print("=============Welcome to InternLM chatbot, type 'exit' to exit.=============")
while True: input_text = input("User >>> ") if input_text == "exit": break response, history = model.chat(tokenizer, input_text, history=messages) messages.append((input_text, response)) print(f"robot >>> {response}")` 同样是 merged文件夹:
两个差异,一是generate超参数没有对齐,二是 model.chat() 拥有默认的 meta_instruction (类似system) https://huggingface.co/internlm/internlm2-chat-7b/blob/2292b86b21cb856642782cebed0a453997453b1f/modeling_internlm2.py#L1156-L1160
temperature: float = 0.8,
top_p: float = 0.8,
使用命令
xtuner chat XXXXXX --temperature 0.8 --top-p 0.8
xtuner chat XXXXXX --system "你是一个专业的厨师,你会做很多菜。用户报上自己所需的菜名后,你可以把做菜所需要的原料,以及做菜的方法告诉用户"
也可使用其他任意文本
试了一下:modeling_internlm2.py
命令: xtuner chat ./merged --prompt-template internlm2_chat --temperature 0.8 --top-p 0.8 --system "你是一个专业的厨师,你会做很多菜。用户报上自己所需的菜名后,你可以把做菜所需要的原料,以及做菜的方法告诉用户"
好像并没有解决问题。
是不是还有别的什么原因?
传到modelscope可以吗?
传到modelscope可以吗?
可以
好的。稍等
@zhanghui-china 我测了一下 cli_demo 也会有概率重复。
不过无所谓了,已经找到了解决办法,我们需要在 generate 时借助 repetition_penalty 来惩罚重复。
https://github.com/InternLM/xtuner/pull/351
我提个一个PR来支持这个功能,明天会推进该PR merge到主分支。在此之前,你可以参考这个PR进行修改,并尝试使用 xtuner chat xxxxx --repetition-penalty 1.002
来对话,查看效果~
好的。看样子只需要改一个xtuner/tools/chat.py吧?
在InternStudio上使用xtuner 0.1.12
食谱数据集
对 Internlm2-7b-chat模型进行微调: xtuner train ./internlm2_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2
然后生成HF格式文件: mkdir hf
export MKL_SERVICE_FORCE_INTEL=1
xtuner convert pth_to_hf ./internlm2_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm2_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf
将LoRA模型合并入基础模型:
xtuner convert merge ./internlm2-chat-7b ./hf ./merged --max-shard-size 2GB
使用xtuner chat进行验证:
xtuner chat ./merged --prompt-template internlm_chat
紫菜蛋花汤的做法
会无限循环。并食材在每轮循环的数据末尾出现 [UNUSED_TOKEN_145]字样。
有时候也会像一下这种方式无限循环:
软中带脆的干锅花菜的做法
水煮鱼的做法
InternLM-7b-chat 一代模型微调后没有这个问题。
具体参见: