Large Language Model

模型

架构

位置编码

激活函数

归一化层

训练数据

训练数据量

模型参数量

词表大小

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]但是因为指令微调策略的问题,在实践中经常出现指令微调后复读机问题加重的情况。

另外,可能出现重复用户问题的情况,原因未知。

  1. 如何缓解复读机问题? 解码方式里增加不确定性,既然容易复读那我们就增加随机性,开启do_sample选项,调高temperature。

如果学的太烂,do_sample也不顶用呢?加重复惩罚,设置repetition_penalty,注意别设置太大了。不然你会发现连标点符号都不会输出了。

  1. 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,其实也是可以训练的)

  1. 建议用什么显卡? 最好用 8*A100,保证显存充足。V100下不要进行 8bit 模式的训练,alpaca_lora的复现上很多人遇到了loss突变为0的bug。

  2. 如果想要在某个模型基础上做全参数微调,究竟需要多少显存?

一般 n B的模型,最低需要 16-20 n G的显存。cpu offload基本不开的情况下

vicuna-7B为例,官方样例配置为 4*A100 40G,测试了一下确实能占满显存。(global batch size 128,max length 2048)当然训练时用了FSDP、梯度累积、梯度检查点等方式降显存。

  1. 推理速度上,int8和fp16比起来怎么样?

根据实践经验,int8模式一般推理会明显变慢(huggingface的实现)

  1. 如果就是想要试试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。

  1. SFT(有监督微调)的数据集格式?

一问一答

  1. RM(奖励模型)的数据格式?

一个问题 + 一条好回答样例 + 一条差回答样例

  1. PPO(强化学习)的数据格式?

理论上来说,不需要新增数据。需要提供一些prompt,可以直接用sft阶段的问。另外,需要限制模型不要偏离原模型太远(ptx loss),也可以直接用sft的数据。

  1. 奖励模型需要和基础模型一致吗?

不同实现方式似乎限制不同。(待实践确认)colossal-ai的coati中需要模型有相同的tokenizer,所以选模型只能从同系列中找。在ppo算法实现方式上据说trlx是最符合论文的。

应用构建 如何给LLM注入领域知识? 第一种办法,检索+LLM,先用问题在领域数据库里检索到候选答案,再用LLM对答案进行加工。

第二种方法,把领域知识构建成问答数据集,用SFT让LLM学习这部分知识。[7]

  1. 为什么SFT之后感觉LLM傻了?

原版答案:

SFT的重点在于激发大模型的能力,SFT的数据量一般也就是万恶之源alpaca数据集的52k量级,相比于预训练的数据还是太少了。如果抱着灌注领域知识而不是激发能力的想法,去做SFT的话,可能确实容易把LLM弄傻。

新版答案:[3]

指令微调是为了增强(或解锁)大语言模型的能力。 其真正作用:

指令微调后,大语言模型展现出泛化到未见过任务的卓越能力,即使在多语言场景下也能有不错表现 。 微调数据集:

应该选择多个有代表性的任务,每个任务实例数量不应太多(比如:数百个)否则可能会潜在地导致过拟合问题并影响模型性能 。

同时,应该平衡不同任务的比例,并且限制整个数据集的容量(通常几千或几万),防止较大的数据集压倒整个分布。

  1. 如果想要快速体验各种模型,该怎么办?

推荐fastchat[4],集成了各路开源模型,从自己的vicuna到stable AI的stableLM。

  1. 找数据集哪里找?

推荐Alpaca-COT[8],数据集整理的非常全,眼花缭乱。

Reference