# Large Language Model ```{toctree} :hidden: concept llama peft ``` |模型|架构|位置编码|激活函数|归一化层|训练数据|训练数据量|模型参数量|词表大小| |----|----|----|----|----|----|----|----|----| |LLaMA|Casual decoder|RoPE|SwiGLU|Pre RMS Norm|以英语为主的拉丁语系,不包含中日韩文|1T/1.4T tokens|7B、13B、33B、65B|32000| |ChatGLM|Prefix decoder|RoPE|GeGLU|Post Deep Norm|中英双语,中英文比例为1:1|1T tokens|6B|130528 ## Basic LLM两种实现方式: (1)BERT + finetuning,预训练做完形填空,finetune需要修改整个模型的参数。 (2)GPT + prompt,预训练通过左边预测右边,prompt做提示,不修改模型参数也能学习出结果。 1. 最主流的开源模型? ChatGLM-6B[1] prefix LM LLaMA-7B[2] causal LM 2. prefix LM和causal LM的区别? attention mask不同,前者的prefix部分的token互相能看到,后者严格遵守只有后面的token才能看到前面的token的规则。 3. 哪种架构是主流? GPT系列就是Causal LM,目前除了T5和GLM,其他大模型基本上都是Causal LM。 4. 说一下LLM常见的问题? 出现复读机问题。比如:ABCABCABC不断循环输出到max length。 对于这种现象我有一个直观的解释(猜想):prompt部分通常很长,在生成文本时可以近似看作不变,那么条件概率 P(B|A)也不变,一直是最大的。 生成重复内容,是语言模型本身的一个弱点,无论是否微调,都有可能出现。并且,理论上良好的指令微调能够缓解大语言模型生成重复内容的问题。[3]但是因为指令微调策略的问题,在实践中经常出现指令微调后复读机问题加重的情况。 另外,可能出现重复用户问题的情况,原因未知。 5. 如何缓解复读机问题? 解码方式里增加不确定性,既然容易复读那我们就增加随机性,开启do_sample选项,调高temperature。 如果学的太烂,do_sample也不顶用呢?加重复惩罚,设置repetition_penalty,注意别设置太大了。不然你会发现连标点符号都不会输出了。 6. llama 输入句子长度理论上可以无限长吗? 这里引用苏神(RoPE作者)在群里的回复。 限制在训练数据。理论上rope的llama可以处理无限长度,但问题是太长了效果不好啊,没训练过的长度效果通常不好。而想办法让没训练过的长度效果好,这个问题就叫做“长度外推性”问题。 所以接受2k的长度限制吧。 硬件基础 1. 为什么大模型推理时显存涨的那么多还一直占着? 首先,序列太长了,有很多Q/K/V。 其次,因为是逐个预测next token,每次要缓存K/V加速解码。 2. 大模型大概有多大,模型文件有多大? 一般放出来的模型文件都是fp16的,假设是一个 n B的模型,那么模型文件占 2n G,fp16加载到显存里做推理也是占 2n G,对外的pr都是 10n 亿参数的模型。 3. 大模型在gpu和cpu上推理速度如何? 7B量级下,cpu推理速度约10token/s,单卡A6000和8核AMD的推理速度通常为 10:1 推理速度对比 4. 能否用4 * v100 32G训练vicuna 65b? 不能。 首先,llama 65b的权重需要5* v100 32G才能完整加载到GPU。 其次,vicuna使用flash-attention加速训练,暂不支持v100,需要turing架构之后的显卡。 (刚发现fastchat上可以通过调用train脚本训练vicuna而非train_mem,其实也是可以训练的) 5. 建议用什么显卡? 最好用 8*A100,保证显存充足。V100下不要进行 8bit 模式的训练,alpaca_lora的复现上很多人遇到了loss突变为0的bug。 6. 如果想要在某个模型基础上做全参数微调,究竟需要多少显存? 一般 n B的模型,最低需要 16-20 n G的显存。cpu offload基本不开的情况下 vicuna-7B为例,官方样例配置为 4*A100 40G,测试了一下确实能占满显存。(global batch size 128,max length 2048)当然训练时用了FSDP、梯度累积、梯度检查点等方式降显存。 7. 推理速度上,int8和fp16比起来怎么样? 根据实践经验,int8模式一般推理会明显变慢(huggingface的实现) 8. 如果就是想要试试65b模型,但是显存不多怎么办? 最少大概50g显存,可以在llama-65b-int4(gptq)模型基础上LoRA[6],当然各种库要安装定制版本的。 RLHF部分 1. LoRA权重是否可以合入原模型? 可以,将训练好的低秩矩阵(B*A)+原模型权重合并(相加),计算出新的权重。 2. ChatGLM-6B LoRA后的权重多大? rank 8 target_module query_key_value条件下,大约15M。 3. SFT(有监督微调)的数据集格式? 一问一答 4. RM(奖励模型)的数据格式? 一个问题 + 一条好回答样例 + 一条差回答样例 5. PPO(强化学习)的数据格式? 理论上来说,不需要新增数据。需要提供一些prompt,可以直接用sft阶段的问。另外,需要限制模型不要偏离原模型太远(ptx loss),也可以直接用sft的数据。 6. 奖励模型需要和基础模型一致吗? 不同实现方式似乎限制不同。(待实践确认)colossal-ai的coati中需要模型有相同的tokenizer,所以选模型只能从同系列中找。在ppo算法实现方式上据说trlx是最符合论文的。 应用构建 如何给LLM注入领域知识? 第一种办法,检索+LLM,先用问题在领域数据库里检索到候选答案,再用LLM对答案进行加工。 第二种方法,把领域知识构建成问答数据集,用SFT让LLM学习这部分知识。[7] 2. 为什么SFT之后感觉LLM傻了? 原版答案: SFT的重点在于激发大模型的能力,SFT的数据量一般也就是万恶之源alpaca数据集的52k量级,相比于预训练的数据还是太少了。如果抱着灌注领域知识而不是激发能力的想法,去做SFT的话,可能确实容易把LLM弄傻。 新版答案:[3] 指令微调是为了增强(或解锁)大语言模型的能力。 其真正作用: 指令微调后,大语言模型展现出泛化到未见过任务的卓越能力,即使在多语言场景下也能有不错表现 。 微调数据集: 应该选择多个有代表性的任务,每个任务实例数量不应太多(比如:数百个)否则可能会潜在地导致过拟合问题并影响模型性能 。 同时,应该平衡不同任务的比例,并且限制整个数据集的容量(通常几千或几万),防止较大的数据集压倒整个分布。 3. 如果想要快速体验各种模型,该怎么办? 推荐fastchat[4],集成了各路开源模型,从自己的vicuna到stable AI的stableLM。 4. 找数据集哪里找? 推荐Alpaca-COT[8],数据集整理的非常全,眼花缭乱。 ## Reference - [LLM学习记录(一)--关于大模型的一些知识](https://zhuanlan.zhihu.com/p/624918286) - [LLM学习记录(一)--关于大模型的一些知识](https://zhuanlan.zhihu.com/p/616280753) - [人工智能 LLM 革命破晓:一文读懂当下超大语言模型发展现状](https://www.mikecaptain.com/2023/03/06/captain-aigc-2-llm/)