这篇文章主要是对DeepSpeed Chat的功能做了一些了解,然后翻译了几个主要的教程了解了一些使用细节。最后在手动复现opt-13b做actor模型,opt-350m做reward模型进行的chatbot全流程训练时,踩了一些坑也分享出来了。最后使用训练后的模型做serving展示了一下对话效果并简要分析了一下chatbot的推理代码。后续,我会尝试深入到DeepSpeed Chat的三个训练阶段分别进行源码解读和理解,也许也会尝试一下其它的模型或者修改数据集来获得更好的chatbot效果。
在这里插入图片描述
然后,博客给出了DeepSpeed-Chat在RLHF训练的第三步也就是基于人类反馈的强化学习阶段的一个BenchMark测试。
在这里插入图片描述
正如上面截图中非常重要的细节指出的,进行公平的比较对于机器学习社区来说至关重要,特别是在基准测试中。例如,将DeepSpeed-Chat的端到端训练时间与Alpaca和Vicuna(两者都专注于监督指令微调)进行比较是不公平的,因为它们并未包含完整的RLHF训练流程。因此,我们在这里进一步详细说明。
我们从六个开源训练数据集中随机选择了40%的训练数据,即 "Dahoas/rm-static","Dahoas/full-hh-rlhf","Dahoas/synthetic-instruct-gptj-pairwise","yitingxie/rlhf-reward-datasets","openai/webgpt_comparisons",以及 "stanfordnlp/SHP"。我们拥有的总训练样本数是264,292。我们将查询(prompt)序列长度固定为256,并生成固定长度256个token的答案。因此,每个训练阶段的总训练令牌数是135,317,504。在基准测试期间,我们将训练周期数设置为1。
上面对DeepSpeed-Chat的功能以及BenchMark的细节做了介绍,接下来就跟着DeepSpeed-Chat源码里提供的教程来一步步复现模型,先从DeepSpeed-Chat的教程翻译开始。
一个快速、经济、可扩展且开放的系统框架,使得在各种规模上生成高质量ChatGPT风格的端到端基于人类反馈的强化学习(RLHF)模型的训练体验成为可能。
在这里插入图片描述
在推广ChatGPT风格模型及其能力的精神下,DeepSpeed自豪地推出了一个通用系统框架,名为DeepSpeed Chat,以实现ChatGPT-like模型的端到端训练体验。它可以自动地通过OpenAI InstructGPT风格的三个阶段,将你最喜欢的预训练大型语言模型转化为你自己的高质量ChatGPT风格模型。DeepSpeed Chat使得训练高质量的ChatGPT风格模型变得简单、快速、经济并且可扩展。
除了这次发布之外,DeepSpeed 系统非常荣幸地作为系统后端,为一系列正在进行的快速训练/微调聊天风格模型(例如,LLaMA)的工作提供了加速。以下是一些由 DeepSpeed 支持的开源示例:
DeepSpeed Chat的概要包括:
如果你只有大约1-2小时的咖啡或午餐休息时间,你也可以尝试使用 DeepSpeed-Chat 训练一个小型/玩具模型。例如,我们准备了一个针对单个数据集的13亿参数模型的训练示例,以便在你的消费级 GPU 上测试我们的框架。最好的部分是,当你从午餐休息回来时,你将有准备好的模型检查点可以玩。
执行了一下这个命令,有一个报错:
提示accelerate的版本需要>=0.20.3,而当前的版本是0.19.0。通过升级的方式解决了一下这个错误,训练程序就顺利启动起来了。
如果你只有大约半天的时间并且只有一个服务器节点,我们建议使用以下单个脚本中的预训练OPT-13B作为actor模型,OPT-350M作为reward模型,生成一个最终的130亿参数的ChatGPT风格模型:
在这里插入图片描述
想尝试不同的模型大小和配置吗?你可以得到!使用DeepSpeed-Chat,用户可以轻松做到这一点。例如,如果你有多节点集群或云资源的访问权限,而且更愿意为你的研究或业务训练一个更大、更高质量的模型,你可以简单地使用一个类似的脚本,使用你期望的模型大小,例如,66B 和 64个GPU:
在这里插入图片描述
图1:DeepSpeed Chat的RLHF训练流程以及可选特性的插图。
需要注意的一点是,一些数据集可能只有一个回应,而不是两个。对于这些数据集,你只能在第一步中使用它们。在这种情况下,你应该将 dataset_name 添加到 "--sft_only_data_path" 参数中,而不是 "--data_path" 参数中。需要注意的一点是:如果你打算只进行第一步的 SFT,添加更多的单回应数据集肯定是有益的。然而,如果你打算进行第二步和第三步,那么在 SFT 期间添加太多的单回应数据集可能会适得其反:这些数据可能与用于第二步/第三步的数据不同,生成不同的分布,这可能在第二步/第三步期间导致训练不稳定/模型质量下降。这就是我们专注于试验两个回应和偏好的数据集,并总是将一个数据集分割成所有三个步骤的部分原因。(这里的回应就是基于输入prompt给出的respose
如果你有自己的本地文件数据集,你也可以按照以下规则使用它:
此外,当你使用自己的数据集文件并修改其中的一些数据时,要注意 create_prompt_dataset 函数的 "reload" 参数。你应该给它传递一个 True 值,否则缓存文件将不会刷新。
DeepSpeed-Chat允许用户使用我们灵活的API(如下所示)构建他们自己的RLHF训练流程,用户可以利用这些API重构自己的RLHF训练策略。这为创建各种RLHF算法进行研究探索提供了通用的接口和后端。
示例1:从DeepSpeed-Chat训练的1.3B最终模型中获取的问答会话
在这里插入图片描述
示例2:从DeepSpeed-Chat训练的模型中获取的多轮对话
在这里插入图片描述
表1. 在硬件环境从单个消费级GPU (NVIDIA A6000) 到更强大的云设置 (64x A100-80GPUs) 的情况下,针对不同 actor 模型尺寸和固定350M critical模型的端到端RLHF训练(步骤3)。
⭕ 非常重要的实验细节 ⭕ 上表中的数字是针对训练的第3阶段,并基于在DeepSpeed-RLHF精选数据集和训练配方上实际测量的的训练吞吐量,该配方在总计135M个tokens的数据上训练一个epoch(6个开源数据集的40%用于RLHF训练阶段,即Dahoas/rm-static,Dahoas/full-hh-rlhf,Dahoas/synthetic-instruct-gptj-pairwise,yitingxie/rlhf-reward-datasets,openai/webgpt_comparisons,以及Huggingface Datasets的stanfordnlp/SHP)。更具体地说,我们总共有67.5M个查询tokens(131.9k个查询,序列长度为256)和67.5M个生成的tokens(131.9k个答案,序列长度为256),以及每步的最大全局批量大小为0.5M tokens(1024个查询-答案对)。我们强烈建议读者在进行与DeepSpeed-RLHF的成本和端到端时间比较之前,注意这些规格。
(I) 单GPU的模型规模和吞吐量比较
与现有的系统如Colossal-AI或HuggingFace-DDP相比,DeepSpeed-Chat具有更高的一个数量级的吞吐量,解锁了在相同的延迟预算下训练显著更大的actor模型的能力,或以更低的成本训练类似大小的模型。例如,在单个GPU上,DeepSpeed使RLHF训练的吞吐量提高了10倍以上。虽然CAI-Coati和HF-DDP都能运行最大1.3B大小的模型,但DeepSpeed在同样的硬件上可以运行6.5B大小的模型,提高了5倍。
图2:在单个NVIDIA A100-40G商品级GPU上,与其他两个系统框架(Colossal AI的Coati和Huggingface-DDP)进行RLHF训练加速的步骤3吞吐量比较。无图标表示内存溢出的情况。
(II)单节点多GPU模型规模和吞吐量比较
图3. 使用不同模型大小在单个装备有8个NVIDIA A100-40G GPU的DGX节点上进行训练流程步骤3(最耗时部分)的端到端训练吞吐量比较。无图标代表内存溢出(OOM)的情况。
(III)步骤3中卓越的生成阶段加速
图3中显示的关键原因之一是我们的混合引擎在生成阶段的卓越加速性能,如下所示。
图4. DeepSpeed Chat的混合引擎在生成阶段的优越加速性能:在单个配备8个A100-40G GPU的DGX节点上训练OPT-1.3B演员模型和OPT-350M奖励模型的时间/序列分解。
在这里插入图片描述
所有的性能和准确性测试都仅使用了OPT模型家族进行。对于其它模型,如何更改模型家族,请参见我们的训练脚本文件夹。
更多API,示例脚本和评估结果,请参见:
值得注意的是,训练大型语言模型(LLMs)和从人类反馈中学习强化学习(RLHF)仍然是许多未知数的开放问题。DeepSpeed-Chat旨在提供具有高效且快速系统支持的端到端RLHF训练流程,而不是RLHF训练的全面解决方案。由于这个领域相对较新,对于用户和开发者来说,都存在各种未知的情况。
我们鼓励用户尝试这个流程,提供反馈,并提出建议。当用户发现有用且经过测试的用例时,欢迎他们为项目做出贡献。通过共同努力,我们可以推进该项目的发展,并提高我们对LLMs和RLHF训练的理解。
在大型语言模型(LLMs)的领域,监督微调(SFT)确实取得了显著的进展。然而,仍然可能发生意料之外的行为,如重复内容生成和困惑度(PPL)分数与生成能力之间的不一致。
根据我们的测试,有几个因素会影响生成行为:
奖励模型 (RM) 的微调的确与 SFT 类似,主要的不同在于:(1)训练数据集不同 - RM 需要对同一个查询的好响应和坏响应;(2)训练损失不同 - RM 需要将对排名损失作为优化目标。
我们为奖励模型提供了两个指标:(1)接受的响应(和不好的响应)的奖励分数;(2)准确性,即当接受的响应能得到比被拒绝的响应更高的分数时。 有时,我们观察到准确性非常高,但接受的答案的平均奖励分数为负,或被拒绝的答案的分数与接受的答案相似。这会影响第三步的模型质量吗?如果我们用第三步的奖励分数增益作为指标,这可能不会有任何问题。然而,这个机器学习指标(奖励分数增加/增长)并不能真正反映第三步模型的生成质量。因此,我们还没有一个确定的答案。
我们还提供了更多的探索,即使我们并没有将它们设为选项或包含在我们现在的流程中。
在三步训练中,RLHF微调是最复杂的步骤。类似于SFT,奖励得分并不能真正反映模型生成的质量。此外,我们有时观察到奖励得分在某一点跌到初始阶段然后迅速恢复。更糟糕的是,我们也看到训练很容易发散。我们在这里分享我们的设置和观察。
我们对OPT-1.3B(SFT和Actor模型)和OPT-350m(RW和Critic模型)进行了大部分的精度/质量测试。特别是,我们使用了16个V100-32G(DGX-2节点)的GPU来运行我们的实验。
我们脚本中包含的超参数是基于我们自己的测试的。因此,当(但不限于)出现以下情况时,它可能不适用于你的情况:(1)不同数量的GPU,(2)不同大小的模型,(3)不同的模型家族等。
另外请注意,你可能会找到比我们提供的更好的训练配置/配方。由于资源限制,我们并没有对所有的超参数组合进行广泛的测试。
在这里插入图片描述
人类反馈的强化学习(RLHF)训练仍然是一个开放的问题,DeepSpeed-Chat被设计为研究人员和实践者的起点,让他们可以进行高效和快速的训练体验。Hybrid-Engine和其它高效组件,如LoRA,可以从DeepSpeed-Chat继承,使你能够为探索、研究和其他目的开发自己的RLHF训练流程。
使用的命令如下:
问了一下gpt4,-7这个错误码是什么意思:
在这里插入图片描述
在这里插入图片描述
这个网友的提示让我想到了问题的根源,就是在我启动容器的时候忘记设置shm_size了,后面设置之后训练就正常了。docker启动的正确命令我这里也贴一下:
解决了这个问题之后需要注意的是模型和数据都是从huggingface上直接下载的,所以需要合适的代理才能下载得比较快。
在这里插入图片描述
上面的截图显示,在单个8张A100 80G显卡的节点上,以opt-13b作为actor模型,opt-350m作为reward模型,完成监督指令微调,奖励模型和RLHF一共使用了9小时34分59秒。
训练完成之后我们把权重更新过的opt-13b actor模型用来启动一个serving服务来做对话。启动命令如下:
一些对话:
可以看到这个opt13b actor模型具有了对话的能力,但是似乎不具有代码生成的能力。如果你想具有生成代码的能力,你可以尝试把actor模型从opt13b换成codegen模型。DeepSpeed Chat目前支持的模型如下:
在这里插入图片描述
上面就是使用GPT4辅助,然后我refine了一些描述得到的代码解析。
这篇文章主要是对DeepSpeed Chat的功能做了一些了解,然后翻译了几个主要的教程了解了一些使用细节。最后在手动复现opt-13b做actor模型,opt-350m做reward模型进行的chatbot全流程训练时,踩了一些坑也分享出来了。最后使用训练后的模型做serving展示了一下对话效果并简要分析了一下chatbot的推理代码。后续,我会尝试深入到DeepSpeed Chat的三个训练阶段分别进行源码解读和理解,也许也会尝试一下其它的模型或者修改数据集来获得更好的chatbot效果。