草庐IT

ColossalChat:使用完整的 RLHF Pipeline复现ChatGPT 的开源解决方案

qq_41771998 2023-08-22 原文

        ChatGPT、GPT-4等大型AI模型和应用在全球范围内风靡一时,成为技术产业革命和AGI(Artificial General Intelligence)发展的基础。 不仅科技巨头竞相发布新品,许多来自学术界和产业界的人工智能专家也加入了相关的创业浪潮。 生成式 AI 每天都在快速迭代,不断完善!

       然而,OpenAI 并没有将其模型开源,这让许多人对它们背后的技术细节感到好奇。

  1. 我们如何才能跟上潮流并参与这一技术发展浪潮?
  2. 如何降低构建和应用大型人工智能模型的高成本?
  3. 如何保护核心数据和IP不被第三方大模型API泄露?

      作为当今领先的开源大型人工智能模型解决方案,Colossal-AI 率先开源了完整的 RLHF 流水线,包括监督数据收集、监督微调、奖励模型训练和强化学习微调,基于 LLaMA预训练模型,分享最实用的开源项目ColossalChat,最接近ChatGPT原技术方案!

开源地址:https://github.com/hpcaitech/ColossalAI

 它包括以下内容:

Demo:无需注册或加入等候名单即可在线试用的交互式演示。
训练代码:开源完整的RLHF训练代码,包括7B和13B模型。
数据集:开源的104K中英文双语数据集。
推理:70 亿参数模型的 4 位量化推理,仅需要 4GB GPU 内存。
模型权重:在单台服务器上仅需少量算力即可实现快速复现。
将快速更新和添加其他更大的模型、数据集和其他优化。

可用模型,强大的功能(Affordable models, powerful capabilities)

ColossalChat只需要不到100亿个参数就可以达到中英文双语能力,通过在大语言模型基础上的RLHF微调,达到了与ChatGPT和GPT-3.5相当的效果。

例如,

一般知识测验

用中文回答 

写邮件 

 写一个算法

完整的 ChatGPT 克隆解决方案

虽然 GPT 系列中的模型,例如 ChatGPT 和 GPT-4,非常强大,但它们不太可能完全开源。 幸运的是,开源社区一直在努力解决这个问题。

例如,Meta 开源了 LLaMA 模型,它提供的参数大小从 70 亿到 650 亿不等。 在大多数基准测试中,一个 130 亿参数的模型可以胜过 1750 亿个 GPT-3 模型。 但是由于没有instruct tuning stage,实际生成的结果并不尽如人意。

斯坦福的AIpaca通过调用 OpenAI 的 API 以自我指导的方式生成训练数据。 这个轻量级模型只有 70 亿个参数,可以用一小部分成本进行微调,以实现类似于具有 1750 亿个参数的超大型语言模型(如 GPT-3.5)的会话性能。

然而,现有的开源解决方案在 RLHF(人类反馈强化学习)的第一阶段只能被视为有监督的微调模型,而不会执行后续的对齐和微调阶段。 此外,Alpaca 的训练数据集仅限于英语,这在一定程度上限制了模型的性能。

然而,ChatGPT 和 GPT-4 令人印象深刻的效果是由于在训练过程中引入了 RLHF,这增加了生成内容与人类价值观的一致性。

RLHF的三个阶段

ColossalChat基于LLaMA模型,是第一个包含完整RLHF过程复制ChatGPT-like模型的实用开源项目,是最接近ChatGPT原技术路线的项目!

训练数据集开源
ColossalChat 发布了一个双语数据集,其中包含大约 100,000 个中英文问答对。 该数据集是从社交媒体平台上的真实问题场景中收集和清理的,作为种子数据集,并使用自指导技术进行扩展,注释成本约为 900 美元。 与其他自我指导方法生成的数据集相比,该数据集包含更真实和多样化的种子数据,涵盖更广泛的主题。 该数据集适用于微调和 RLHF 训练。 在提供优质数据的情况下,ColossalChat 可以实现更好的对话交互,同时也支持中文。

ColossalChat 数据集收集过程

RLHF 算法fux

RLHF 算法复制涉及三个阶段:

在 RLHF-Stage1 中,使用前面提到的数据集进行监督指令微调以微调模型。

在 RLHF-Stage2 中,奖励模型被训练为通过手动对同一提示的不同输出进行排序来分配相应的分数,然后监督奖励模型的训练。

在 RLHF-Stage3 中,使用了强化学习算法,这是训练过程中最复杂的部分: 

在PPO部分,ColossalChat遵循两个阶段的过程:首先是make experience阶段,使用SFT(Supervised Fine-Tuning)、Actor、RM(Reward Model)和Critic模型计算生成的体验并存储在 缓冲。 然后是参数更新阶段,利用经验计算策略损失和价值损失。

在 PTX 部分,ColossalChat 计算了 Actor 的输出响应与输入语料库的响应部分之间的交叉熵损失。 这个loss用来在PPO梯度上加入预训练梯度,保持语言模型原有的性能,防止遗忘。 最后,将策略损失、价值损失和 PTX 损失相加用于反向传播和参数更新。

快速开始

ColossalChat开源了基于LLaMA模型分三阶段低成本复制ChatGPT的完整代码。

ColossalChat开源了基于LLaMA模型分三阶段低成本复制ChatGPT的完整代码。

在第 1 阶段,训练 SFT 模型: 

# Training with a 4-GPU servers
colossalai run — nproc_per_node=4 train_sft.py \
— pretrain “/path/to/LLaMa-7B/” \
— model ‘llama’ \
— strategy colossalai_zero2 \
— log_interval 10 \
— save_path /path/to/Coati-7B \
— dataset /path/to/data.json \
— batch_size 4 \
— accimulation_steps 8 \
— lr 2e-5

 在第 2 阶段,RM 被训练:

# Training with a 4-GPU servers
colossalai run — nproc_per_node=4 train_reward_model.py \
— pretrain “/path/to/LLaMa-7B/” \
— model ‘llama’ \
— strategy colossalai_zero2 \
— dataset /path/to/datasets

一旦得到微调后的模型权重,就可以通过量化降低推理的硬件成本,并可以推出在线推理服务,仅需单GPU约4GB显存即可部署70亿参数模型推理服务。第 3 阶段,使用 RL 算法进行训练:

# Training with a 8-GPU servers
colossalai run — nproc_per_node=8 train_prompts.py prompts.csv \
— strategy colossalai_zero2 \
— pretrain “/path/to/Coati-7B” \
— model ‘llama’ \
— pretrain_dataset /path/to/dataset

一旦得到微调后的模型权重,就可以通过量化降低推理的硬件成本,并可以推出在线推理服务,仅需单GPU约4GB显存即可部署70亿参数模型推理服务。

python server.py /path/to/pretrained — quant 4bit — gptq_checkpoint /path/to/coati-7b-4bit-128g.pt — gptq_group_size 128

系统性能优化与开发加速
 

ColossalChat能够快速跟进ChatGPT复制的完整RLHF流程,很大程度上得益于Colossal-AI的基础设施和相关优化技术的底层支持。 在同等条件下,ColossalChat 的训练速度与 Alpaca 使用的 FSDP(Fully Sharded Data Parallel)相比可以提升近三倍。

系统基础设施Colossal-AI


AI大模型开发系统Colossal-AI为该项目提供了基础支持。 可高效快速部署基于PyTorch的AI大模型训练和推理,降低AI大模型应用成本。 Colossal-AI 是基于加州大学伯克利分校特聘教授 James Demmel 教授和新加坡国立大学校长青年教授杨佑教授的专业知识开发的。 自开源以来,Colossal-AI以约20000个GitHub star多次登上GitHub Trending榜首,并成功被SC、AAAI、PPoPP、CVPR、 和国际学习中心。

零+Gemini 减少内存冗余

Colossal-AI 支持 ZeRO(零冗余优化器)以提高内存使用效率,能够以更低的成本容纳更大的模型,同时不影响计算粒度和通信效率。 自动分块机制可以通过提高内存使用效率、降低通信频率、避免内存碎片,进一步提升ZeRO的性能。 异构内存空间管理器Gemini支持将优化器状态从GPU内存卸载到CPU内存或硬盘空间,以克服GPU内存容量的限制,扩大可训练模型的规模,降低大型AI模型应用的成本。

LoRA的低成本微调

Colossal-AI 包括用于对大型模型进行低成本微调的低秩适应 (LoRA) 方法。 LoRA 方法假设大型语言模型是过度参数化的,并且微调期间的参数变化是一个低秩矩阵。 因此,这个矩阵可以分解为两个更小的矩阵的乘积。 fine-tuning时固定大模型的参数,只调整低秩矩阵的参数,显着减少训练所需的参数数量,降低成本。

Low-cost Quantized Inference

GPTQ quantization

为了降低推理部署的成本,Colossal-AI 使用 GPTQ 4 位量化推理。 在 GPT/OPT/BLOOM 模型上,它可以获得比传统 RTN(round-to-nearest)量化技术更好的 Perplexity 结果。 与普通的 FP16 推理相比,它可以减少 75% 的内存消耗,同时只牺牲少量的吞吐速度和 Perplexity 性能。

例如,使用ColossalChat-7B,使用4位量化推理,70亿参数模型只需要大约4GB的GPU内存就可以完成短序列(128长度生成)推理,这可以在普通的消费级GPU上完成 就像只有一行代码的 RTX 3060。

if args.quant == ‘4bit’:
model = load_quant(args.pretrained, args.gptq_checkpoint, 4, args.gptq_group_size)

 ColossalChat 与Alpaca

 ColossalChat 是第一个开源完整的 RLHF 流水线的,而斯坦福大学的 Alpaca 还没有实现 RLHF,这意味着他们不包括 Stage 2 和 Stage 3。
ColossalChat 展示了卓越的性能和更广泛的会话覆盖范围。 它的显着改进是由于使用了更大和更高质量的数据集,以及实施强化学习以使响应更接近于类人答案。
ColossalChat 的训练过程结合了 Colossal-AI 的各种系统优化,在使用相同的数据集和模型大小时,训练时间比 Alpaca 快约三倍。 这使研究人员和中小型企业能够独立训练和部署自己的聊天机器人。
ColossalChat 团队收集了一个更大的训练数据集,包括大约 2400 万个英文词条和 3000 万个中文词条,总共约 5400 万个词条。 值得注意的是,ColossalChat 独立收集了 600 万个英文代币和 1800 万个中文代币。
以下是 ColossalChat 和 Alpaca 在语言对话方面的一些性能对比。

 写一封电子邮件给教授以获得推荐信

局限性

虽然进一步引入了RLHF,但受限于算力和数据集,在某些场景下实际性能仍有提升空间。

有关ColossalChat:使用完整的 RLHF Pipeline复现ChatGPT 的开源解决方案的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐