ChatGLM-6B icon indicating copy to clipboard operation
ChatGLM-6B copied to clipboard

[BUG/Help] <采用P-tuning 中的Web_demo为何微调后,丧失了原有的对话功能>

Open blankxyz opened this issue 2 years ago • 31 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

Current Behavior

p-tuning 后,对于训练内容是有反馈的,但是原有模型的对话功能基本丧失。如何才能在保留对话功能的基础上,追加新的内容? 图片1

Expected Behavior

No response

Steps To Reproduce

采用例子中ptuning v2方案

使用 train.sh训练 数据使用的是示例广告数据

微调后,丧失了原有的对话功能。

Environment

- OS: linux
- Python: 3.9
- Transformers: 4.27.1
- PyTorch: 1.13.1
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) : true

Anything else?

No response

blankxyz avatar May 30 '23 00:05 blankxyz

我的也是这样,基本上原有的知识都遗忘了; 另外,你训练的PRE_SEN_LEN,学习率设置的多少?训练了多少步?loss最终下降到多少?

niexufei avatar May 30 '23 01:05 niexufei

我的也是这样,基本上原有的知识都遗忘了; 另外,你训练的PRE_SEN_LEN,学习率设置的多少?训练了多少步?loss最终下降到多少?

PRE_SEN_LEN 这个参数具体是什么意思能解释下吗?

dangzheng0430 avatar May 30 '23 01:05 dangzheng0430

PRE_SEN_LEN = save_prefixencoder

blankxyz avatar May 30 '23 01:05 blankxyz

@

我的也是这样,基本上原有的知识都遗忘了; 另外,你训练的PRE_SEN_LEN,学习率设置的多少?训练了多少步?loss最终下降到多少?

我就是按照sample给出的样式训练的,只是修改了最大输入和最大输出,3000 loss 4.xxx

blankxyz avatar May 30 '23 01:05 blankxyz

我训练出来也是4.0左右,这个值是不是有点高啊,我感觉应该下降到0.XXX是不是才比较合理? 训完之后,除了服装的问题,其他的问题都回答不了了。。 因为我的硬件不行,我量化到了4位,不知道跟这个是否有关系?

另外PRE_SEN_LEN 这个长度是不是input的最大长度,如果超过这个,input就会被截断?不知道理解的是否正确?

niexufei avatar May 30 '23 02:05 niexufei

我训练出来也是4.0左右,这个值是不是有点高啊,我感觉应该下降到0.XXX是不是才比较合理? 训完之后,除了服装的问题,其他的问题都回答不了了。。 因为我的硬件不行,我量化到了4位,不知道跟这个是否有关系? 4.xx 是 百分之4

另外PRE_SEN_LEN 这个长度是不是input的最大长度,如果超过这个,input就会被截断?不知道理解的是否正确? 不是

blankxyz avatar May 30 '23 02:05 blankxyz

使用自己数据训练,微调int4版本模型出现同样问题。

XiongfeiQin avatar May 30 '23 02:05 XiongfeiQin

神经网络灾难性遗忘 这个问题现在解决不了 甭讨论了

vs0533 avatar May 30 '23 03:05 vs0533

PRE_SEN_LEN = save_prefixencoder

我理解pre_seq_len不只是save_prefixencoder,pre_seq_len的用处有多个地方: 1、save_prefixencoder=model_args.pre_seq_len is not None save_prefixencoder只是一个标志位,是个bool,将来使用的地方,根据这个标志来决定是存储所有参数(全量微调)还是前缀部分参数(ptuningv2); 2、真正使用pre_seq_len的值的地方: if self.pre_seq_len is not None: for param in self.parameters(): param.requires_grad = False self.prefix_tokens = torch.arange(self.pre_seq_len).long() self.prefix_encoder = PrefixEncoder(config) self.dropout = torch.nn.Dropout(0.1) 这块就是建立了一个包含从0到self.pre_seq_len-1递增整数的张量,保存在prefix_tokens 中,这个是初始化。

def get_prompt(self, batch_size, device, dtype=torch.half): prefix_tokens = self.prefix_tokens.unsqueeze(0).expand(batch_size, -1).to(device) past_key_values = self.prefix_encoder(prefix_tokens).type(dtype) past_key_values = past_key_values.view( batch_size, self.pre_seq_len, self.num_layers * 2, self.num_attention_heads, self.hidden_size // self.num_attention_heads ) # seq_len, b, nh, hidden_size past_key_values = self.dropout(past_key_values) past_key_values = past_key_values.permute([2, 1, 0, 3, 4]).split(2) # past_key_values = [(v[0], v[1]) for v in past_key_values] return past_key_values 后面的对 past_key_values 进行视图变换(view)和维度重排(permute),使得其形状符合后续计算的需求

niexufei avatar May 30 '23 03:05 niexufei

神经网络灾难性遗忘 这个问题现在解决不了 甭讨论了

这个灾难性遗忘,如果我理解的没错的话,是不是只有通过使用更大规模的模型,提高脑容量才能解决了?

runzhi214 avatar May 30 '23 03:05 runzhi214

为什么我的模型 Pt的时候 会出现这个错误: RuntimeError: Default process group has not been initialized, please make sure to call init_process_group.

sssssshf avatar May 30 '23 03:05 sssssshf

模型 Pt的时候 会出现这个错误:

PRE_SEN_LEN = save_prefixencoder

我理解pre_seq_len不只是save_prefixencoder,pre_seq_len的用处有多个地方: 1、save_prefixencoder=model_args.pre_seq_len is not None save_prefixencoder只是一个标志位,是个bool,将来使用的地方,根据这个标志来决定是存储所有参数(全量微调)还是前缀部分参数(ptuningv2); 2、真正使用pre_seq_len的值的地方: if self.pre_seq_len is not None: for param in self.parameters(): param.requires_grad = False self.prefix_tokens = torch.arange(self.pre_seq_len).long() self.prefix_encoder = PrefixEncoder(config) self.dropout = torch.nn.Dropout(0.1) 这块就是建立了一个包含从0到self.pre_seq_len-1递增整数的张量,保存在prefix_tokens 中,这个是初始化。

def get_prompt(self, batch_size, device, dtype=torch.half): prefix_tokens = self.prefix_tokens.unsqueeze(0).expand(batch_size, -1).to(device) past_key_values = self.prefix_encoder(prefix_tokens).type(dtype) past_key_values = past_key_values.view( batch_size, self.pre_seq_len, self.num_layers * 2, self.num_attention_heads, self.hidden_size // self.num_attention_heads ) # seq_len, b, nh, hidden_size past_key_values = self.dropout(past_key_values) past_key_values = past_key_values.permute([2, 1, 0, 3, 4]).split(2) # past_key_values = [(v[0], v[1]) for v in past_key_values] return past_key_values 后面的对 past_key_values 进行视图变换(view)和维度重排(permute),使得其形状符合后续计算的需求

特别有道理

blankxyz avatar May 30 '23 05:05 blankxyz

造成遗忘我理解是不是就prefix_encoder这一部分参数放进来之后造成的?所以我在尝试如何把这部分参数失效,将past_key_value值为None,但是发现就无法生成了,没有生成任何内容,如果能成功把prefix_encoder这部分参数卸载下来,是不是就可以使用原模型的参数了

Hansen06 avatar May 30 '23 09:05 Hansen06

我在广告中加了几条自己的数据,结果完全没学到,预测的还是广告的东西,完全不可用

haha010508 avatar May 31 '23 02:05 haha010508

我是菜鸟,看各位大神都说得很高深.问了一下claude。差不多就几个意思,1、需要更大的数据集。2、数据太少。3、数据精度不够。4、调教方法有问题。。。。。。感觉好有道理,和没说一样!!!!!

maxadc avatar May 31 '23 06:05 maxadc

我是菜鸟,看各位大神都说得很高深.问了一下claude。差不多就几个意思,1、需要更大的数据集。2、数据太少。3、数据精度不够。4、调教方法有问题。。。。。。感觉好有道理,和没说一样!!!!!

哈哈,使用这个p tuning v2精调方法,加上广告数据,究竟有没有人调出来,既能回答广告数据,又不遗忘老的知识呢?有人调出来了吗?这个问题帖子人气高,希望有调试出来的上来吱一声~~

niexufei avatar May 31 '23 06:05 niexufei

https://github.com/liucongg/ChatGLM-Finetuning 这个号称调出来了。我们没有验证过,你可以试试

haha010508 avatar May 31 '23 07:05 haha010508

我是菜鸟,看各位大神都说得很高深.问了一下claude。差不多就几个意思,1、需要更大的数据集。2、数据太少。3、数据精度不够。4、调教方法有问题。。。。。。感觉好有道理,和没说一样!!!!!

哈哈,使用这个p tuning v2精调方法,加上广告数据,究竟有没有人调出来,既能回答广告数据,又不遗忘老的知识呢?有人调出来了吗?这个问题帖子人气高,希望有调试出来的上来吱一声~~

我试过用LoRA微调,遗忘问题要轻很多,p-tuning v2遗忘严重

HIT-Owen avatar Jun 01 '23 01:06 HIT-Owen

我也遇到同样的问题,就去了解了一下p-tuning的本质,发现其本质是prompt-tuning 就是虚假提示词的微调;通过提示词的调参,找到最合适的提示词参数,然后反馈给LLm;以上面的逻辑来说,当输入内容后,内容就会套了一个prompt的模版,输入给LLm,所以则会丧失语音能力;【以上个人建解,如有理解错误请指出】ps参考资料

jaikensai888 avatar Jun 02 '23 06:06 jaikensai888

请教一下,pre_seq_len设置后,哪里会固定住原有模型的参数?

zhohn0 avatar Jun 02 '23 08:06 zhohn0

PRE_SEN_LEN = save_prefixencoder

我理解pre_seq_len不只是save_prefixencoder,pre_seq_len的用处有多个地方: 1、save_prefixencoder=model_args.pre_seq_len is not None save_prefixencoder只是一个标志位,是个bool,将来使用的地方,根据这个标志来决定是存储所有参数(全量微调)还是前缀部分参数(ptuningv2); 2、真正使用pre_seq_len的值的地方: if self.pre_seq_len is not None: for param in self.parameters(): param.requires_grad = False self.prefix_tokens = torch.arange(self.pre_seq_len).long() self.prefix_encoder = PrefixEncoder(config) self.dropout = torch.nn.Dropout(0.1) 这块就是建立了一个包含从0到self.pre_seq_len-1递增整数的张量,保存在prefix_tokens 中,这个是初始化。

def get_prompt(self, batch_size, device, dtype=torch.half): prefix_tokens = self.prefix_tokens.unsqueeze(0).expand(batch_size, -1).to(device) past_key_values = self.prefix_encoder(prefix_tokens).type(dtype) past_key_values = past_key_values.view( batch_size, self.pre_seq_len, self.num_layers * 2, self.num_attention_heads, self.hidden_size // self.num_attention_heads ) # seq_len, b, nh, hidden_size past_key_values = self.dropout(past_key_values) past_key_values = past_key_values.permute([2, 1, 0, 3, 4]).split(2) # past_key_values = [(v[0], v[1]) for v in past_key_values] return past_key_values 后面的对 past_key_values 进行视图变换(view)和维度重排(permute),使得其形状符合后续计算的需求

请教一下,pre_seq_len设置后,哪里会固定住原有模型的参数?

zhohn0 avatar Jun 02 '23 08:06 zhohn0

我觉得是优化器和学习率的问题。

cywjava avatar Jun 03 '23 00:06 cywjava

请教一下,pre_seq_len设置后,哪里会固定住原有模型的参数?

在chatglm-6b/modeling_chatglm.py中,如下代码: image

niexufei avatar Jun 05 '23 02:06 niexufei

遗忘原来的内容这个问题没有解决,ptuning的意义就不大了。希望能解决。

tianlichunhong avatar Jun 05 '23 13:06 tianlichunhong

我是菜鸟,看各位大神都说得很高深.问了一下claude。差不多就几个意思,1、需要更大的数据集。2、数据太少。3、数据精度不够。4、调教方法有问题。。。。。。感觉好有道理,和没说一样!!!!!

哈哈,使用这个p tuning v2精调方法,加上广告数据,究竟有没有人调出来,既能回答广告数据,又不遗忘老的知识呢?有人调出来了吗?这个问题帖子人气高,希望有调试出来的上来吱一声~~

昨天使用adgen数据集,把p_tuning的学习率调小后得到一个看起来效果还行的结果 效果:https://blog.csdn.net/bmfire/article/details/131064677

bmfire1 avatar Jun 06 '23 01:06 bmfire1

遗忘原来的内容这个问题没有解决,ptuning的意义就不大了。希望能解决。

这个问题恐怕解决不了,token长度问题,这和模型规模有关。就算可以增加,我看chatglm的说法,是增加之后,效率会急剧下降。唯一的解决方案就是大概特改,不是改模型的问题了,是改架构。也就是说,这个项目可以直接关了。不过在应用端,应该可以适量优化,就是使用向量技术,优化压缩token。但解决不了本质问题。除非是外挂知识库,并且修改架构

maxadc avatar Jun 07 '23 02:06 maxadc

遗忘原来的内容这个问题没有解决,ptuning的意义就不大了。希望能解决。

这个问题恐怕解决不了,token长度问题,这和模型规模有关。就算可以增加,我看chatglm的说法,是增加之后,效率会急剧下降。唯一的解决方案就是大概特改,不是改模型的问题了,是改架构。也就是说,这个项目可以直接关了。不过在应用端,应该可以适量优化,就是使用向量技术,优化压缩token。但解决不了本质问题。除非是外挂知识库,并且修改架构

如果这样,真是一个悲伤的消息。至于外挂知识库,这个好像也有限制,比如知识库的大小似乎是有限制的,并不能做得很大。而且效率也低。最大的问题还是准确度不高。

tianlichunhong avatar Jun 08 '23 09:06 tianlichunhong

为什么我的模型 Pt的时候 会出现这个错误: RuntimeError: Default process group has not been initialized, please make sure to call init_process_group.

我也是遇到,不知怎么解决

juesuchen avatar Jun 11 '23 15:06 juesuchen

我是菜鸟,看各位大神都说得很高深.问了一下claude。差不多就几个意思,1、需要更大的数据集。2、数据太少。3、数据精度不够。4、调教方法有问题。。。。。。感觉好有道理,和没说一样!!!!!

哈哈,使用这个p tuning v2精调方法,加上广告数据,究竟有没有人调出来,既能回答广告数据,又不遗忘老的知识呢?有人调出来了吗?这个问题帖子人气高,希望有调试出来的上来吱一声~~

按照上面的方法,调低学习率到1e-4。这样,不会遗忘正常的对话,还能回答广告问题。 贴出我的train.sh

PRE_SEQ_LEN=128
LR=1e-4

CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_train \
    --train_file AdvertiseGen/train.json \
    --validation_file AdvertiseGen/dev.json \
    --prompt_column content \
    --response_column summary \
    --overwrite_cache \
    --model_name_or_path ../../chatglm-6b \
    --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_train_batch_size 16 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 1 \
    --predict_with_generate \
    --max_steps 3000 \
    --logging_steps 10 \
    --save_steps 1000 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN \

贴出损失:

***** train metrics *****
  epoch                    =       0.42
  train_loss               =     5.3553

然后推理。附上结果图 image

Guo986 avatar Jun 16 '23 02:06 Guo986

调低学习率到1e-4。这样,不会遗

与学习效率有关吗?学习效率不是只是影响训练的时间,以及train_loss的收敛吗?为何对训练的结果有影响?我反而觉得PRE_SEQ_LEN这个参数比较重要,是决定多少参数参与训练。可惜没有一个详细的解释train.sh每个参数的意义和影响分别是什么,希望有人能整理出来。

tianlichunhong avatar Jun 16 '23 09:06 tianlichunhong