ChatGLM-6B
ChatGLM-6B copied to clipboard
[BUG] 在全量finetune的时候,loss第一步有输出,接下来全部为nan
Is there an existing issue for this?
- [X] I have searched the existing issues
Current Behavior
loss第一步有输出,接下来全部为nan
Expected Behavior
No response
Steps To Reproduce
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True).half()
outputs = model(**inputs)
Environment
scikit-learn
transformers
tensorflow==2.5.0
icetk
datasets==2.10.1
git+https://github.com/huggingface/peft.git
protobuf>=3.19.5,<3.20.1
bitsandbytes==0.37.1
accelerate==0.17.1
cpm_kernels==1.0.11
torch>=1.13.1
Anything else?
No response
Is there an existing issue for this?
- [x] I have searched the existing issues
Current Behavior
loss第一步有输出,接下来全部为nan
Expected Behavior
No response
Steps To Reproduce
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True).half() outputs = model(**inputs)
Environment
scikit-learn transformers tensorflow==2.5.0 icetk datasets==2.10.1 git+https://github.com/huggingface/peft.git protobuf>=3.19.5,<3.20.1 bitsandbytes==0.37.1 accelerate==0.17.1 cpm_kernels==1.0.11 torch>=1.13.1
Anything else?
No response
请问i您如何全量finetuning的,有代码参考么
代码参考是指? 下面是我代码的主要逻辑:
- 加载模型
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True, cache_dir='pretrain_models').half()
- 模型训练,我的单case模型输入类型类似于这样
optimizer.zero_grad()
outpus = model(**inputs)
loss = outputs.loss
loss.backward()
optimizer.step()
# input中各个value细节
inputs = {'input_ids': input_ids, 'labels': labels}
input_ids: [input_token1, input_token2, ...., [gMASK], <sop>, target_token1, target_token2,...., <eop>, <pad>, <pad>, ...]
labels: [-100, -100, ...., [gMASK], <sop>, target_token1, target_token2,...., <eop>, -100, -100, ...]
- 训练参数
lr=3e-5
batch_size=4
optimizer=Adamw
loss=CrossEntropy
每个step进行梯度计算,Loss在第一个step时为10左右,在第二个step时直接为nan,模型中所有的Hidden states直接全部为nan
@zhangzai666
@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?
@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?
+1
您的邮件已经收到~
@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?
+1
修改为fp32能正常训练了
代码参考是指? 下面是我代码的主要逻辑:
- 加载模型
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True, cache_dir='pretrain_models').half()
- 模型训练,我的单case模型输入类型类似于这样
optimizer.zero_grad() outpus = model(**inputs) loss = outputs.loss loss.backward() optimizer.step() # input中各个value细节 inputs = {'input_ids': input_ids, 'labels': labels} input_ids: [input_token1, input_token2, ...., [gMASK], <sop>, target_token1, target_token2,...., <eop>, <pad>, <pad>, ...] labels: [-100, -100, ...., [gMASK], <sop>, target_token1, target_token2,...., <eop>, -100, -100, ...]
- 训练参数
lr=3e-5 batch_size=4 optimizer=Adamw loss=CrossEntropy
每个step进行梯度计算,Loss在第一个step时为10左右,在第二个step时直接为nan,模型中所有的Hidden states直接全部为nan
有遇到同样的问题,定位到是因为optimizer使用的是torch自带的adamw,换成transformers提供的adamw后问题就解决了。至于两个框架的adamw有什么差异,没有去探究,有心人可以研究下,期待有大佬可以解释下。楼主可以看下是不是有同样的问题。
@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?
+1
修改为fp32能正常训练了
归根结底是梯度爆炸了,做梯度裁剪也可以解决
@xiongma 碰到了同样的问题,第一个epoch=2.3,然后loss=0,加载权重后发现很多层都变成了nan。我感觉是FP16在全量微调下不稳定可能造成了梯度爆炸。我在模型初始化后加了一步model.float(), 把模型参数调整成了FP32,再进行微调loss就正常了。但确实是既慢。。。又大。。。。
代码参考是指? 下面是我代码的主要逻辑:
- 加载模型
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True, cache_dir='pretrain_models').half()
- 模型训练,我的单case模型输入类型类似于这样
optimizer.zero_grad() outpus = model(**inputs) loss = outputs.loss loss.backward() optimizer.step() # input中各个value细节 inputs = {'input_ids': input_ids, 'labels': labels} input_ids: [input_token1, input_token2, ...., [gMASK], <sop>, target_token1, target_token2,...., <eop>, <pad>, <pad>, ...] labels: [-100, -100, ...., [gMASK], <sop>, target_token1, target_token2,...., <eop>, -100, -100, ...]
- 训练参数
lr=3e-5 batch_size=4 optimizer=Adamw loss=CrossEntropy
每个step进行梯度计算,Loss在第一个step时为10左右,在第二个step时直接为nan,模型中所有的Hidden states直接全部为nan
为什么labels也用
@DSXiangLi 请教一下,你的显存是多大? 在A100-40G上会OOM (模型设置成fp32, .float() )
@DSXiangLi 请教一下,你的显存是多大? 在A100-40G上会OOM (模型设置成fp32, .float() )
会的,我跑最少3卡A100 80G
同问
您的邮件已经收到~
您的邮件已经收到~
@xiongma 碰到了同样的问题,第一个epoch=2.3,然后loss=0,加载权重后发现很多层都变成了nan。我感觉是FP16在全量微调下不稳定可能造成了梯度爆炸。我在模型初始化后加了一步model.float(), 把模型参数调整成了FP32,再进行微调loss就正常了。但确实是既慢。。。又大。。。。
我调整成fp32之后又说我输入也要保持一致,但是input_ids, attention_mask也没办法是float32呀
@xiongma 碰到了同样的问题,第一个epoch=2.3,然后loss=0,加载权重后发现很多层都变成了nan。我感觉是FP16在全量微调下不稳定可能造成了梯度爆炸。我在模型初始化后加了一步model.float(), 把模型参数调整成了FP32,再进行微调loss就正常了。但确实是既慢。。。又大。。。。
我用peft模块的lora微调的时候,用fp16加载的模型会运行失败,我推测应该lora部分的参数是fp32导致最终merge的模型参数精度不一致然后失败的。我就用fp32加载的glm模型,然后用lora微调也会出现loss一开始的几个step是十几,然后就变成nan了。。。
您的邮件已经收到~