DLLXW / baby-llama2-chinese

用于从头预训练+SFT一个小参数量的中文LLaMa2的仓库;24G单卡即可运行得到一个具备简单中文问答能力的chat-llama2.
MIT License
2.47k stars 305 forks source link

总结下几个问题 #35

Open Vincent-ZHQ opened 1 year ago

Vincent-ZHQ commented 1 year ago

很有意思的工作,作为LLM的小白了解到了很多,整个流程很明了。但跑了两天,没跑出比较好的结果,在这总结下遇到的几个问题,后来大佬有能解决的可以相互讨论下 (环境: A100-40G, CUDA11.6,PyTorch2.0,实际使用代码稍微放大了下模型)。

  1. Flash attention问题。这个只有Pytorch2.0以上版本才能用,速度看了下比一般attention能快小一倍,占用显存也稍微少了一些,能用则用吧。Pytorch2.0的话亲测CUDA11.6也是可以安装官网CUDA11.7版本的,可以正常使用。
  2. Loss NAN问题。预训练过程,使用float16,大概几千step就会出现,尝试降低学习率等方法无法解决。回答说使用老版本PyTorch可以避免。
  3. Loss 增加。后来看了其他论坛,说改用bfloat16更加稳定,然而实际使用却出现loss短暂下降后持续上涨的现象,改变学习率,仍然无效。进而继续尝试使用float32,loss也是先下降后上涨,改变学习率亦无效,有点奇怪,遂暂时放弃。
jh01231230 commented 1 year ago
  1. 这个模型支持flash attention,如果torch.nn版本支持就会自动使用。Torch已经可以支持cuda12了,小版本的兼容一直都很模糊。如果需要用最新cuda12我这有一个安装命令可以参考 pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu121

  2. 还是检查一下自己的参数设置,优化器,以及训练的数据整个pipeline。或是用原本给的参数和数据跑一跑。也不排除是版本问题,我这用的是Torch2.2.0 + cu12, 没有出现训练问题。

  3. bfloat16的数值范围大一些,感觉不会是loss增加的原因,正常训练过程中也用了lr衰减的操作。可能是其它的改动导致了loss不降反增,数据不对也有可能导致这个问题所以还是重点查一下数据吧。

nzinfo commented 1 year ago

我刚才实验了一下,在当前的数据和代码组合下,V100 的卡,如果使用 bfloat16 会出现 Loss 增加。 如果 改回 float16,目前看还是收敛的

nzinfo commented 1 year ago

当前项目效果不好的一种可能的原因是直接使用了 chatglm 的 tokenizer,百科数据并不需要那么大的编码空间。重新训练一个可能会比较好。