sunzeyeah / RLHF

Implementation of Chinese ChatGPT
282 stars 36 forks source link

RLHF第三步进行训练时,在modeling_glm.py如下代码位置会显示“size mismatch, got 1028, 1028x1024,0” #14

Closed IconShan closed 1 year ago

IconShan commented 1 year ago

logits, hidden_layers = transformer_output

outputs = hidden_layers

    if self.output_predict:
        # Parallel logits.
        # logits_parallel = mpu.copy_to_model_parallel_region(
        #     logits)
        logits = F.linear(logits, self.word_embeddings.weight)

去modeling_glm.py中打印logits.size() 和self.word_embeddings.weight.size()时发现后者的shape为:torch.size([0]), 其中SFT和Reward的模型我在step1,step2中已经do_pred测试通过了,请问这种mismatch的问题有没有解决方案?感谢感谢~~

sunzeyeah commented 1 year ago

你好,这个bug目前只在GLM类模型中出现,Pangu和ChatGLM可以正常运行。

出现原因是GLM类模型使用torch.nn.Parameter来初始化word embedding的权重,具体见modeling_glm.py line 175。在使用deepspeed.initialize()进行初始化之后,似乎torch.nn.Parameter()的tensor就会丢失,造成word_embeddings.weight的shape为0。

目前还没有开始解决这个问题,但解决思路有2个:

  1. 参考Pangu类模型,用torch.nn.Embedding替换torch.nn.Parameter,具体见modeling_gptpangu.py
  2. 参考ChatGLM,加入weight=torch.Tensor(self.num_embeddings, self.embedding_dim); self.register_buffer('weight', weight),具体见modeling_chatglm.py
sunzeyeah commented 1 year ago

已验证方案2可以解决该问题,具体可参见modeling_glm.py line 175-L176

把modeling_glm.py文件复制到模型目录行替换即可

IconShan commented 1 year ago

感谢解答,已经跑通了,牛的牛的

Bo396543018 commented 1 year ago

用上述方法2确实解决了这个问题。但是开启zero3不用hybrid_engine,glm10b在make_experience的时候结果是乱的,想问下你们有遇到类似问题吗。