赞
踩
知乎:suc16
链接:https://zhuanlan.zhihu.com/p/624918286
折腾大模型(small LLM)一段时间了,以下是平民版的LLM学习记录,记录了自己遇到的问题,以及给出不完美的解答。
ChatGLM-6B
LLaMA-7B
ChatGLM-6B是Prefix LM(PLM),LLaMA-7B是Causal LM(CLM)。
(参考google的论文《UL2: Unifying Language Learning Paradigms》)
Causal LM,GPT系列就是Causal LM。
python版本建议使用python3.9以上。
cuda版本建议使用cuda-11.7以上。
c++版本建议升级到c++9.1.0以上。
建立虚拟环境以便隔离多组实验,推荐使用conda管理环境。
单卡条件下,显存大小至少满足加载完整模型(fp16),每10亿(Billion)参数需要2GB,因为fp16精度1个参数要占16bits,2bytes。
ChatGLM-6B官方说,fp16下最低需要13GB显存。这基本符合上面的计算结果。
尽量选择大显存和新一代的显卡,比如A100/A6000。
A100的新特性,支持bf16、tf32。
可以选择对模型进行量化(8bit或4bit)甚至更低。
ChatGLM-6B官方说,在int8和int4模式下的推理最低显存要求会从13GB降到10GB和6GB。
或者使用cpu进行推理,例如:llama.cpp,或者最近很火的MLC LLM?
llama.cpp作者在M1 pro mac上的测试结果是61.41 ms per token(基于LLaMA-7B),但是有能力的还是上GPU吧。
不是,需要特殊的量化手段,大模型通常使用GPTQ量化。
LLM.int8()的BLOOM-176B比FP16版本慢了大约15%到23%。小模型下,int8推理会更慢。
ChatGLM-6B官方支持的p-tuning-v2,以及最常见的LoRA方式都可以微调,节省显存又高效。
很常见的是原有能力受损,或者出现循环输出重复性文本的问题。
考虑到循环输出是概率问题,而ChatGPT中默认开启do_sample,增加随机性。所以尽量在测试微调后模型时也开启这一模式。
根据LoRA的论文,训练得到低秩的权重delta矩阵,所以支持合并。
另外,参考刘聪NLP同学的一个微调实验结果,LoRA可调参数仅为0.0586%,所以它的参数文件很小。
似乎新版的peft库已经支持只切换LoRA的参数,而非每次重新加载整个模型。
finetune阶段的batch size通常远小于pretrain阶段,微调的数据量也远小于预训练的数据量。(参考MPT-7B模型的实验)
可以理解为,指令微调是为了获得执行指令的能力,而不是从头学习。
参考LLaMA论文,使用更高效更节省显存的attention实现,比如:xformers库。
SFT: 问答对,RM: 问+正负回答对,PPO: 复用前两阶段数据即可。
开源框架有很多:
ColossalChat支持LLaMA但更新很慢。
TRL也通过StackLLaMA给出了RLHF的示例。
还有号称能加速RLHF训练很多倍的DeepSpeed-Chat。
参考InstructGPT论文,建议选择同一系列的小模型做奖励模型,太大的模型在奖励模型阶段可能有收敛性问题。
有很多开源项目,比如:llama-index(原gpt-index)做文档式的对话系统。
或者使用MOSS的思路,把大语言模型做成各种插件。
理论上支持无限长度,根据空门大佬的实验,用滑动窗口的持续采样似乎可以在A6000单卡上无限采样下去。(LLaMA-65B量化版本的推理)
不过默认还是2k窗口,GPT4的8k窗口和高级版的32k窗口的实现方式令人好奇,真的是原生的32k窗口吗?
参考开源仓库,大模型参考LLM-Zoo(达摩院的)和数据集参考Alpaca-COT。
LLaMA的限制在于模型数据,似乎无论是不同结构的模型,还是用其他数据训练的open_llama都能作为可以商用的底座。
进NLP群—>加入NLP交流群
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。