InternLM / xtuner

An efficient, flexible and full-featured toolkit for fine-tuning LLM (InternLM2, Llama3, Phi3, Qwen, Mistral, ...)
https://xtuner.readthedocs.io/zh-cn/latest/
Apache License 2.0
4.05k stars 316 forks source link

xtuner 0.1.12微调后,进行chat会出现无限循环直到达到最大长度为止。 #343

Closed zhanghui-china closed 10 months ago

zhanghui-china commented 10 months ago

在InternStudio上使用xtuner 0.1.12 image

image

然后生成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 image

将LoRA模型合并入基础模型:

xtuner convert merge ./internlm2-chat-7b ./hf ./merged --max-shard-size 2GB image

使用xtuner chat进行验证:

xtuner chat ./merged --prompt-template internlm_chat

紫菜蛋花汤的做法

image 会无限循环。并食材在每轮循环的数据末尾出现 [UNUSED_TOKEN_145]字样。 image

image

image

有时候也会像一下这种方式无限循环:

软中带脆的干锅花菜的做法 image

水煮鱼的做法 image

InternLM-7b-chat 一代模型微调后没有这个问题。

具体参见:

zhanghui-china commented 10 months ago

模型部署之后也会这样: image image image

zhanghui-china commented 10 months ago

image image image image

LZHgrla commented 10 months ago

对话模板请使用与训练一致的选项,即 --prompt-template internlm2_chat

xtuner chat ./merged --prompt-template internlm2_chat
zhanghui-china commented 10 months ago
656f09b412e85158e65f931eb861d63
LZHgrla commented 10 months ago
  1. xtuner版本太低,没有支持 internlm2_chat 模版,请安装最新版,pip install -U xtuner
  2. 如果没支持,那之前训的internlm2_chat模型所用的模版是什么?
zhanghui-china commented 10 months ago

抱歉,前面为了对比测试,曾经降低过版本。

151e5484dbd782bc375ef16b605be81

现在升级版本之后

执行的效果如下:

197d93feda78026acb46f4f457e1ad9 9c374a4ab614ea06f183749c56d7497

依然会无限循环:

zhanghui-china commented 10 months ago

`(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.锅中烧开水,加入一勺猪油,一勺生抽,一勺蚝油,`

zhanghui-china commented 10 months ago

之前训的internlm2_chat模型所用的模版是:

internlm2_chat_7b_qlora_oasst1_e3

zhanghui-china commented 10 months ago

image

zhanghui-china commented 10 months ago

原本InternLM一代模型,用 internlm_chat_7b_qlora_oasst1_e3 微调没有问题。成功输出。

zhanghui-china commented 10 months ago

循环打印直到:

dce7302813a5ea1780774fe3d085977

为止。

LZHgrla commented 10 months ago

@zhanghui-china 我大概知道原因了! 请更新一下 LLM 的 tokenizer_config.json 文件 https://huggingface.co/internlm/internlm2-chat-7b/blob/main/tokenizer_config.json

zhanghui-china commented 10 months ago

好的,我试一下。

zhanghui-china commented 10 months ago

您提到的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": "", "added_tokens_decoder": { "0": { "content": "", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true }, "1": { "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 }, "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 %}" }

zhanghui-china commented 10 months ago

而merged目录下对应的文件如下:

"added_tokens_decoder": { "0": { "content": "", "lstrip": false, "normalized": false, "rstrip": false, "single_word": false, "special": true }, "1": { "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": "" }

有较大的差异,应该怎么改?

LZHgrla commented 10 months ago

直接使用开源的那个,“覆盖”掉merge的。或者你如果原始LLM已经更新了,那么重新merge,生成的文件也会自动变为新的

zhanghui-china commented 10 months ago

好的。我试试

zhanghui-china commented 10 months ago

用您提供的最新的tokenizer_config.json文件,微调,在微调过程中,已经出现了:

583dc086c3b51ca8d01fcac70a9a45a

感觉是不是已经出问题了?

zhanghui-china commented 10 months ago
ab9cf2c484ac0b9b811b3fc697fe831

感觉训练完了之后还会一样的。。。

zhanghui-china commented 10 months ago

文件已经用最新的了:

f9887d59164c26a21a83c2788dea365 90b56f7e487e49e6001a701e7f35911
LZHgrla commented 10 months ago

xtuner 版本是多少?

zhanghui-china commented 10 months ago

目前是

95bb6db501ffce3441446bede69860a
zhanghui-china commented 10 months ago

我需要升级到最新的0.1.13吗?

LZHgrla commented 10 months ago

@zhanghui-china 使用新tokenizer,请确保xtuner>=0.1.13 老tokenizer + 老对话模版(即0.1.12) 新tokenizer + 新对话模版(即>=0.1.13)

zhanghui-china commented 10 months ago

那我升级下再试

zhanghui-china commented 10 months ago

已升级到 0.1.13

9243d4d1174081150b62cf832791eb3
zhanghui-china commented 10 months ago

新对话模版在哪里?

LZHgrla commented 10 months ago

都是internlm2_chat

修改了tokenizer_config.json。因为有不少用户觉得对类似[UNUSED_TOKEN_145]这样的special token不友好,所以做了一轮更新

修改历史见 https://github.com/InternLM/xtuner/pull/339

zhanghui-china commented 10 months ago

新tokenizer内容是 您说的那个:https://huggingface.co/internlm/internlm2-chat-7b/blob/main/tokenizer_config.json

zhanghui-china commented 10 months ago

那我刚才才更新了0.1.13,我应该重新 copy一下吧?

LZHgrla commented 10 months ago

不用,小版本一般没有BC-breaking,所以模型权重、config基本都是通用的

LZHgrla commented 10 months ago

他的原理就是给 UNUSED_TOKEN 一个名字,例如给[UNUSED_TOKEN_145] 命名为 <|im_end|>。 实际的 token_id 没有变化,所以对于模型来说没有任何影响。

zhanghui-china commented 10 months ago

那微调训练的参数中,没看到模板的设置呀? xtuner train ./internlm2_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2

这句话里面哪个是模板的设置?

LZHgrla commented 10 months ago

在 ./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

zhanghui-china commented 10 months ago

哦。明白了。我试试吧。

zhanghui-china commented 10 months ago

从微调日志上看:

b40284e07d80efddb53ea2d890a1469

应该是用了新的UNUSED_TOKEN 了吧?

LZHgrla commented 10 months ago

是的

zhanghui-china commented 10 months ago

目前看来还是正常的。

bf9c518a7e8b6ca2c0337829c123b67

要等4个小时。等明天早上再说吧。 谢谢老师。

zhanghui-china commented 10 months ago

看下结果:

image

貌似正常结束了。

tree image

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

image

将LoRA模型合并入基础模型:

rm -rf merged

xtuner convert merge ./internlm2-chat-7b ./hf ./merged --max-shard-size 2GB

image

使用xtuner chat进行验证:

xtuner chat ./merged --prompt-template internlm2_chat

简易版肉臊夹馍的做法

在 tran_dataset_0.json 是这么写的: { "conversation": [ { "system": "你是一个专业的厨师,你会做很多菜。用户报上自己所需的菜名后,你可以把做菜所需要的原料,以及做菜的方法告诉用户", "input": "简易版肉臊夹馍的做法", "output": "您需要准备以下食材:\n['肉馅', '面粉', '几个(香菇最好草菇也可)蘑菇', '胡萝卜', '青椒', '适量葱']\n按以下方法制作:\n['准备肉臊的过程可以先将面发上,用不烫手的酵母水和面,面团软硬适中,揉至光滑放温暖处发酵', '葱,胡萝卜,蘑菇切碎和肉馅儿放在一起,按照个人口味调味', '我加了料酒,老抽,生抽,香辣酱,糖,姜粉,盐和少量淀粉', '肉臊调味并搅拌好备用', '面团发酵到原来的2倍大就可以了', '面团分成适当大小的剂子,用容器扣上醒一会儿', '取一个剂子擀成饼状', '锅中不放油,用中小火把饼两面慢慢烙熟', '烙的时候如果饼鼓起来,就在表面戳一个小洞,让热气出来就可以了', '锅中放适量油,烧热后下肉臊,快速滑散翻炒,等肉臊成分明的颗粒状并变色,加一点水烧干即可出锅']" } ] },

运行: image image 还是无限循环了!

紫菜蛋花汤的做法 image image

感觉说着说着就循环了。。

zhanghui-china commented 10 months ago

但是老师,我发现一件很奇怪的事情:

为啥用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文件夹:

1fef226538480782bb2c212e0a04d28
LZHgrla commented 10 months ago

两个差异,一是generate超参数没有对齐,二是 model.chat() 拥有默认的 meta_instruction (类似system) https://huggingface.co/internlm/internlm2-chat-7b/blob/2292b86b21cb856642782cebed0a453997453b1f/modeling_internlm2.py#L1156-L1160

  1. 与 model.chat 对齐生成超参数,
    temperature: float = 0.8,
    top_p: float = 0.8,

使用命令

xtuner chat XXXXXX --temperature 0.8 --top-p 0.8
  1. 同时,在对话时增加 system 文本,即
    xtuner chat XXXXXX --system "你是一个专业的厨师,你会做很多菜。用户报上自己所需的菜名后,你可以把做菜所需要的原料,以及做菜的方法告诉用户"

也可使用其他任意文本

zhanghui-china commented 10 months ago

试了一下:modeling_internlm2.py

f3a178810e6cdeed1604469a88a1af9

命令: xtuner chat ./merged --prompt-template internlm2_chat --temperature 0.8 --top-p 0.8 --system "你是一个专业的厨师,你会做很多菜。用户报上自己所需的菜名后,你可以把做菜所需要的原料,以及做菜的方法告诉用户"

b03fc11a987efd915341a7189459c34

好像并没有解决问题。

zhanghui-china commented 10 months ago

是不是还有别的什么原因?

LZHgrla commented 10 months ago
  1. 尝试把 system 换成 model.chat 方法的 meta_instruction,试一下
  2. 如果还不行,不知方便把merged模型传到huggingface吗? 我们这边尝试对齐一下
zhanghui-china commented 10 months ago

传到modelscope可以吗?

LZHgrla commented 10 months ago

传到modelscope可以吗?

可以

zhanghui-china commented 10 months ago

好的。稍等

zhanghui-china commented 10 months ago

模型已上传modelscope https://www.modelscope.cn/models/zhanghuiATchina/zhangxiaobai_shishen3/summary

LZHgrla commented 10 months ago

@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 来对话,查看效果~

zhanghui-china commented 10 months ago

好的。看样子只需要改一个xtuner/tools/chat.py吧?