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

[BUG] 在全量finetune的时候,loss第一步有输出,接下来全部为nan

Open xiongma opened this issue 1 year ago • 10 comments

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

xiongma avatar Apr 01 '23 09:04 xiongma

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的,有代码参考么

zhangzai666 avatar Apr 01 '23 14:04 zhangzai666

代码参考是指? 下面是我代码的主要逻辑:

  1. 加载模型
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True, cache_dir='pretrain_models').half()
  1. 模型训练,我的单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, ...]
  1. 训练参数
lr=3e-5
batch_size=4
optimizer=Adamw
loss=CrossEntropy

每个step进行梯度计算,Loss在第一个step时为10左右,在第二个step时直接为nan,模型中所有的Hidden states直接全部为nan

xiongma avatar Apr 03 '23 02:04 xiongma

@zhangzai666

xiongma avatar Apr 03 '23 10:04 xiongma

@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?

ChenLLong avatar Apr 06 '23 06:04 ChenLLong

@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?

+1

terrifyzhao avatar Apr 13 '23 09:04 terrifyzhao

您的邮件已经收到~

ChenLLong avatar Apr 13 '23 09:04 ChenLLong

@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?

+1

修改为fp32能正常训练了

terrifyzhao avatar Apr 17 '23 07:04 terrifyzhao

代码参考是指? 下面是我代码的主要逻辑:

  1. 加载模型
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True, cache_dir='pretrain_models').half()
  1. 模型训练,我的单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, ...]
  1. 训练参数
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有什么差异,没有去探究,有心人可以研究下,期待有大佬可以解释下。楼主可以看下是不是有同样的问题。

pokerc avatar Apr 19 '23 06:04 pokerc

@xiongma 遇到了同样的问题,想请教下有解决方法了嘛?

+1

修改为fp32能正常训练了

归根结底是梯度爆炸了,做梯度裁剪也可以解决

terrifyzhao avatar Apr 25 '23 11:04 terrifyzhao

@xiongma 碰到了同样的问题,第一个epoch=2.3,然后loss=0,加载权重后发现很多层都变成了nan。我感觉是FP16在全量微调下不稳定可能造成了梯度爆炸。我在模型初始化后加了一步model.float(), 把模型参数调整成了FP32,再进行微调loss就正常了。但确实是既慢。。。又大。。。。

DSXiangLi avatar Apr 27 '23 07:04 DSXiangLi

代码参考是指? 下面是我代码的主要逻辑:

  1. 加载模型
model = AutoModel.from_pretrained(model_card, use_cache=False, trust_remote_code=True, cache_dir='pretrain_models').half()
  1. 模型训练,我的单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, ...]
  1. 训练参数
lr=3e-5
batch_size=4
optimizer=Adamw
loss=CrossEntropy

每个step进行梯度计算,Loss在第一个step时为10左右,在第二个step时直接为nan,模型中所有的Hidden states直接全部为nan

为什么labels也用, 不应该是错开吗?input的对应label的target_token1...然后input的<target_tokenn>对应target_token1的

whalefa1I avatar May 09 '23 04:05 whalefa1I

@DSXiangLi 请教一下,你的显存是多大? 在A100-40G上会OOM (模型设置成fp32, .float() )

nghuyong avatar May 09 '23 17:05 nghuyong

@DSXiangLi 请教一下,你的显存是多大? 在A100-40G上会OOM (模型设置成fp32, .float() )

会的,我跑最少3卡A100 80G

DSXiangLi avatar May 09 '23 23:05 DSXiangLi

同问

victorShawFan avatar Jun 07 '23 12:06 victorShawFan

您的邮件已经收到~

ChenLLong avatar Jun 07 '23 12:06 ChenLLong

您的邮件已经收到~

ChenLLong avatar Jun 28 '23 08:06 ChenLLong

@xiongma 碰到了同样的问题,第一个epoch=2.3,然后loss=0,加载权重后发现很多层都变成了nan。我感觉是FP16在全量微调下不稳定可能造成了梯度爆炸。我在模型初始化后加了一步model.float(), 把模型参数调整成了FP32,再进行微调loss就正常了。但确实是既慢。。。又大。。。。

我调整成fp32之后又说我输入也要保持一致,但是input_ids, attention_mask也没办法是float32呀

PhilrainV avatar Jun 28 '23 08:06 PhilrainV

@xiongma 碰到了同样的问题,第一个epoch=2.3,然后loss=0,加载权重后发现很多层都变成了nan。我感觉是FP16在全量微调下不稳定可能造成了梯度爆炸。我在模型初始化后加了一步model.float(), 把模型参数调整成了FP32,再进行微调loss就正常了。但确实是既慢。。。又大。。。。

我用peft模块的lora微调的时候,用fp16加载的模型会运行失败,我推测应该lora部分的参数是fp32导致最终merge的模型参数精度不一致然后失败的。我就用fp32加载的glm模型,然后用lora微调也会出现loss一开始的几个step是十几,然后就变成nan了。。。

Doufanfan avatar Sep 04 '23 06:09 Doufanfan

您的邮件已经收到~

ChenLLong avatar Sep 04 '23 06:09 ChenLLong