自從Meta發布「開源版ChatGPT」LLaMA之後,學界可謂是一片狂歡。
先是史丹佛提出了70億參數Alpaca,緊接著是UC伯克利聯手CMU、史丹佛、UCSD和MBZUAI發布的130億參數Vicuna,在超過90%的情況下實現了與ChatGPT和Bard相匹敵的能力。
今天,「卷王」UC伯克利LMSys org又發布了70億參數的Vicuna——
不僅體積小、效率高、能力強,而且只要兩行指令就能在M1/M2晶片的Mac上運行,還能開啟GPU加速!
計畫網址:https://github.com/lm-sys/FastChat/#fine-tuning
正好在今天,Hugging Face的研究人員也發布了一個70億參數的模型-StackLLaMA。這是一個透過人類回饋強化學習在LLaMA-7B微調而來的模型。
Vicuna-7B:真·單GPU,Mac就能跑
距離模型的發布不到一周,UC伯克利LMSys org便公佈了Vicuna-13B的權重。
其中,單GPU運作需要大約28GB的顯存,而在僅使用CPU的情況下需要大約60GB的記憶體。
而這次發布的70億參數版本,則要小巧得多——需求直接砍半。
也就是說,用單一GPU運行Vicuna-7B,只需14GB 記憶體;而純CPU運行的話,只需30GB 記憶體。
不僅如此,我們還可以透過Metal後端,在配備了蘋果自研晶片或AMD GPU的Mac上啟用GPU加速。
之前在13B模型發佈時,有不少網友吐槽道:
我以為的單一GPU: 4090
實際上的單一GPU:28GB顯存及以上
現在,這個問題也有了新的解決方案-利用8位元壓縮直接減少一半左右的記憶體用量,只不過模型的品質會略微下降。
13B機型28GB顯存瞬間變14GB;7B機型14GB顯存瞬間變7GB,有沒有! (但由於activation的緣故,實際佔用會比這個高)
對此,LMSys org的研究人員表示,如果遇到內存或顯存不夠用的情況,可以通過在上述指令中加入--load-8bit來啟用8位元壓縮。
而且,無論是CPU、GPU或Metal,是7B模型或13B模型,通通適用。
python3 -m fastchat.serve.cli --model-name /path/to/vicuna/weights --load-8bit
#今天,Hugging Face研究人員發布了一篇部落格StackLLaMA:用RLHF訓練LLaMA的實踐指南。
當前大型語言模型ChatGPT、GPT-4和Claude都使用了人類回饋強化學習(RLHF)來微調模型的行為,以產生更符合用戶意圖的回應。
在此,HF研究者透過以下方式組合使用,訓練了LlaMa模型使用RLHF回答Stack Exchange上的所有步驟:
· 監督微調(SFT)
#· 奖励/偏好建模(RM)
· 人类反馈强化学习 (RLHF)
要注意了!
训练StackLLaMA的主要目标是提供一个教程和指南,介绍如何使用RLHF来训练模型,而不是主要关注模型的性能表现。
换句话说,该模型在生成答案方面非常滑稽,比如问它「我的花园里有一只骆驼,怎样才能把它赶走?」
StackLLaMA最后给出的一个总括「如果以上方法都不奏效,就要召集增援了。如果有不止一个人想抓住这个奇特的小家伙,为什么不召集一个团队呢?齐心协力,集中力量,这个问题应该很快就解决了」。
在进行RLHF时,最重要的是从一个强有力的模型开始。因为RLHF只是一个微调步骤,以便让模型与我们期望的互动方式和响应方式相一致。
当前,Meta开源的LLaMA模型参数大小从7B到65B不等,并且在1T到1.4T的token上进行了训练,是目前开源比较强大的模型。
因此,研究人员使用7B模型作为后续微调的基础。
在数据集选用上,研究人员使用了StackExchange数据集,包括所有的问题和答案(还有StackOverflow和其他主题)。
选用该数据集的好处是,答案伴随着点赞数和接受答案的标签一起给出。
研究人员根据A General Language Assistant as a Laboratory for Alignment论文中描述的方法,给每个答案打分:
score = log2 (1 + upvotes) rounded to the nearest integer, plus 1 if the questioner accepted the answer (we assign a score of −1 if the number of upvotes is negative).
对于奖励模型,始终需要每个问题两个答案来进行比较。
而有些问题有几十个答案,导致可能存在许多的可选对。因此,研究者对每个问题最多采样十个答案对,以限制每个问题的数据点数。
最后,通过将HTML转换为Markdown来清除格式,使模型输出更可读。
即使训练最小的LLaMA模型也需要大量的内存。通过计算7B 参数模型将使用(2+8)*7B=70GB 内存空间。当计算注意力分数等中间值时,可能需要更多。因此,即使在单个80GB的A100上也无法训练该模型。
一种方法是使用更高效的优化器和半精度训练,将更多信息压缩到内存中,但内存仍旧不够用。
另一种选择是使用参数高效微调(PEFT)技术,例如PEFT库,它可以在8位模型上执行低秩适应(LoRA)。
线性层的低秩适应: 在冻结层(蓝色)旁边添加额外参数(橙色),并将结果编码的隐藏状态与冻结层的隐藏状态相加。
以8位加载模型大大减少了内存占用,因为每个参数只需要一个字节的权重。比如,7B LLaMA在内存中是7 GB。
LoRA不直接训练原始权重,而是在一些特定的层 (通常是注意力层) 上添加小的适配器层,因此可训练参数的数量大大减少。
在这种情况下,一个经验法则是为每十亿参数分配约1.2-1.4GB的内存(取决于批次大小和序列长度),以适应整个微调设置。
这可以以较低成本微调更大的模型(在NVIDIA A100 80GB上训练高达50-60B规模的模型)。这些技术已经能够在消费级设备,比如树莓派、手机,和GoogleColab上对大型模型进行微调。
研究人员发现尽管现在可以把非常大的模型放入当个GPU中,但是训练可能仍然非常缓慢。
在此,研究人员使用了数据并行策略:将相同的训练设置复制到单个GPU中,并将不同的批次传递给每个GPU。
在开始训练奖励模型并使用RL调整模型之前,若要模型在任何情况下遵循指令,便需要指令调优。
实现这一点最简单的方法是,使用来自领域或任务的文本继续训练语言模型。
为了有效地使用数据,研究者使用一种称为「packing」的技术:在文本之间使用一个EOS标记连接许多文本,并切割上下文大小的块以填充批次,而无需任何填充。
通过这种方法,训练效率更高,因为通过模型的每个token也进行了训练。
原则上,研究人员可以使用RLHF直接通过人工标注对模型进行微调。然而,这需要在每次优化迭代之后将一些样本发送给人类进行评级。
由于需要大量的训练样本来实现收敛,人类阅读和标注速度固有的延迟,不仅昂贵,还非常缓慢。
因此,研究人员在RL调整模型之前,在收集的人工标注上训练一个奖励模型。奖励建模的目的是模仿人类对文本的评价,这一方法比直接反馈更有效。
在实践中,最好的方法是预测两个示例的排名,奖励模型会根据提示X提供两个候选项,并且必须预测哪一个会被人类标注员评价更高。
通过StackExchange 数据集,研究人员根据分数推断出用户更喜欢这两个答案中的哪一个。有了这些信息和上面定义的损失,就可以修改transformers.Trainer 。通过添加一个自定义的损失函数进行训练。
class RewardTrainer(Trainer):def compute_loss(self, model, inputs, return_outputs=False): rewards_j = model(input_ids=inputs["input_ids_j"],attention_mask=inputs["attention_mask_j"])[0] rewards_k = model(input_ids=inputs["input_ids_k"], attention_mask=inputs["attention_mask_k"])[0] loss = -nn.functional.logsigmoid(rewards_j - rewards_k).mean() if return_outputs: return loss, {"rewards_j": rewards_j, "rewards_k": rewards_k} return loss
研究人员利用100,000对候选子集,并在50,000对候选的支持集上进行评估。
训练通过Weights & Biases进行记录,在8-A100 GPU上花费了几个小时,模型最终的准确率为67%。
虽然这听起来分数不高,但是这个任务对于人类标注员来说也非常困难。
有了经过微调的语言模型和奖励模型,现在可以运行RL循环,大致分为以下三个步骤:
· 根据提示生成响应
· 根据奖励模型对回答进行评分
· 对评级进行强化学习策略优化
在对查询和响应提示进行标记并传递给模型之前,模板如下。同样的模版也适用于SFT,RM 和RLHF阶段。
Question: <Query> Answer: <Response>
使用RL训练语言模型的一个常见问题是,模型可以通过生成完全胡言乱语来学习利用奖励模型,从而导致奖励模型得到不合实际的奖励。
为了平衡这一点,研究人员在奖励中增加了一个惩罚:保留一个没有训练的模型进行参考,并通过计算 KL散度将新模型的生成与参考模型的生成进行比较。
在训练期间对每个步骤进行批次奖励,模型的性能在大约1000个步骤后趋于稳定。
以上是ChatGPT平替「小羊駝」Mac可跑! 2行程式碼單GPU,UC柏克萊再發70億參數開源模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!