草庐IT

ChatGPT低成本复现流程开源!任意单张消费级显卡可体验,显存需求低至1.62GB

AbnerAI 2023-09-02 原文

首个开源的ChatGPT低成本复现流程来了!

预训练、奖励模型训练、强化学习训练,一次性打通。

最小demo训练流程仅需1.62GB显存,随便一张消费级显卡都能满足了。单卡模型容量最多提升10.3倍

相比原生PyTorch,单机训练速度最高可提升7.73倍,单卡推理速度提升1.42倍,仅需一行代码即可调用

对于微调任务,可最多提升单卡的微调模型容量3.7倍同时保持高速运行,同样仅需一行代码。

要知道,ChatGPT火是真的火,复现也是真的难。

毕竟ChatGPT是不开源的,市面上至今没有开源预训练权重、完全开源的低成本训练流程,而且千亿级别大模型的训练本身就是个难题。

但ChatGPT军备赛已经愈演愈烈,为了抓住趋势,如谷歌等都在打造对标竞品。快速复现ChatGPT是应趋势所需。

开源加速方案Colossal-AI正是为此而来。

并且在提供开源完整复现流程的同时,把成本降了下来!

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

降显存开销是关键

ChatGPT的效果好,主要是由于在训练过程中引入了人类反馈强化学习(RLHF),但这也直接导致ChatGPT的复现训练难度飙升。

其训练流程主要分为三个阶段:

1、监督微调:从Prompt库中采样,收集其人工回答,利用这些数据来微调预训练大语言模型;

2、奖励模型:从Prompt库中采样,使用大语言模型生成多个回答,人工对这些回答进行排序后,训练奖励模型(RM),来拟合人类的价值判断。

3、基于第一阶段的监督微调模型和第二阶段的奖励模型,利用强化学习算法对大语言模型进一步训练。

RLHF的三个阶段

对于ChatGPT训练而言,第三阶段是核心部分。

OpenAI采用了强化学习中近端策略优化算法(PPO),借此引入奖励信号,使得语言模型生成内容更加符合人类评判标准。

但强化学习的引入,也意味着更多模型调用

例如,使用基于Actor-Critic(AC)结构的PPO算法,需要在训练时进行Actor、Critic两个模型的前向推理和反向传播,以及监督微调模型、奖励模型的多次前向推理。

在ChatGPT基础的InstructGPT论文中,Actor和监督微调模型都使用了1750亿参数的GPT-3系列模型,Critic和奖励模型则使用了60亿参数的GPT-3系列模型。

如此大规模的模型参数,意味着想要启动原始ChatGPT训练流程,需要数千GB的显存开销,单张GPU显然无法容纳,常见的数据并行技术也不能搞定。

即便引入张量并行、流水并行对参数进行划分,也需要至少64张80GB的A100作为硬件基础。而且流水并行本身并不适合AIGC的生成式任务,bubble和调度复杂会导致效率受限。

单张消费级显卡都能体验

Colossal-AI基于ZeRO,Gemini, LoRA, Chunk-based内存管理等方法,提出了一系列单卡、单机多卡、大规模并行解决方案。

对于基于GPT-3系列模型的ChatGPT,Colossal-AI能用原本一半的硬件资源启动1750亿参数模型训练,从64卡降低到32卡

如果继续用64卡,则将训练时间压缩到更短,节省训练成本、加速产品迭代。

而为了能让更大范围的开发者体验复现ChatGPT,除了1750亿参数版本外,Colossal-AI还提供单卡单机4/8卡的类ChatGPT版本,以降低硬件限制。

要知道,在单机多卡服务器上,即便把显卡规格提升为A100 80GB,由于ChatGPT的复杂性和内存碎片,PyTorch最大也只能启动基于GPT-L(774M)这样的小模型ChatGPT。

用PyTorch原生的DistributedDataParallel (DDP) 进行多卡并行扩展至4卡或8卡,性能提升有限。

Colossal-AI最高可提升单机训练速度7.73倍,单卡推理速度1.42倍,还可继续扩大规模并行。

为了尽可能降低训练成本和上手门槛,Colossal-AI还提供了在单张GPU上即可尝试的ChatGPT训练流程。

相比于PyTorch在约10万元的A100 80GB上,最大仅能启动7.8亿参数模型,Colossal-AI将单卡容量提升10.3倍至80亿参数

对于基于1.2亿参数小模型的ChatGPT训练,最低仅需1.62GB显存任意单张消费级GPU即可满足。

此外,Colossal-AI也致力于降低基于预训练大模型的微调任务成本。以ChatGPT可选的开源基础模型OPT为例,相比PyTorch,Colossal-AI可将提升单卡微调模型容量3.7倍(原始计算量显著增大),同时保持高速运行。

一行代码快速上手

到了具体操作部分,如上复现流程中的多个步骤,基于Colossal-AI开源方案,都能实现一行代码快速上手。

先看模型使用方面。

尽管ChatGPT背后的大语言模型GPT-3.5不开源,但如GPT、OPT、BLOOM等主流开源模型可作为替代。

Colossal-AI为Hugging Face社区的这些模型,提供了开箱即用的ChatGPT复现代码,可覆盖三个阶段的训练。

以GPT为例,添加一行代码指定使用Colossal-AI作为系统策略即可快速使用。

from chatgpt.nn import GPTActor, GPTCritic, RewardModel
from chatgpt.trainer import PPOTrainer
from chatgpt.trainer.strategies import ColossalAIStrategy

strategy = ColossalAIStrategy(stage=3, placement_policy='cuda')

with strategy.model_init_context():
    actor = GPTActor().cuda()
    critic = GPTCritic().cuda()
    initial_model = deepcopy(actor).cuda()
    reward_model = RewardModel(deepcopy(critic.model)).cuda()

trainer = PPOTrainer(strategy, actor, critic, reward_model, initial_model, ...)
trainer.fit(prompts)

使用下列命令,即可快速启动单卡、单机多卡、1750亿版本训练,并测试各种性能指标(包括最大显存占用、吞吐率和TFLOPS等):

# 使用单机单卡训练GPT2-S,使用最小的batch size,Colossal-AI Gemini CPU策略
torchrun --standalone --nproc_pero_node 1 benchmark_gpt_dummy.py --model s --strategy colossalai_gemini_cpu --experience_batch_size 1 --train_batch_size 1
# 使用单机4卡训练GPT2-XL,使用Colossal-AI Zero2策略
torchrun --standalone --nproc_per_node 4 benchmark_gpt_dummy.py --model xl --strategy colossalai_zero2
# 使用4机32卡训练GPT-3,使用Colossal-AI Gemini CPU策略
torchrun --nnodes 4 --nproc_per_node 8 \
 --rdzv_id=$JOB_ID --rdzv_backend=c10d --rdzv_endpoint=$HOST_NODE_ADDR \
 benchmark_gpt_dummy.py --model 175b --strategy colossalai_gemini_cpu --experience_batch_

背后原理如何?

核心方案还是Colossal-AI

它从诞生起就面向大模型应用,可基于PyTorch高效快速部署AI大模型训练和推理,是这一领域的明星项目了,GitHub Star超八千颗,并成功入选SC、AAAI、PPoPP、CVPR等国际AI与HPC顶级会议的官方教程。

目前,Colossal-AI已成功帮助一家世界五百强企业,开发具备在线搜索引擎能力增强的类ChatGPT聊天机器人模型

此前,它们还为Stable Diffusion、OPT、AlphaFold等前沿模型,提供了多样高效的大规模多维并行分布式解决方案。

主创人员为加州伯克利大学杰出教授James Demmel和新加坡国立大学校长青年教授尤洋。

Colossal-AI与当今主要开源项目同期开源数据对比

具体到细节原理上,LoRA、ZeRO+Gemini是关键。

低成本微调的LoRA

在微调部分,Colossal-AI支持使用低秩矩阵微调(LoRA)方法。

LoRA方法认为大语言模型是过参数化的,其在微调中的参数改变量是一个低秩的矩阵,可以将其分解为两个更小的的矩阵的乘积,即

在微调时,固定大模型参数,只调整低秩矩阵参数,从而显著减小训练参数量。在微调之后,进行推理部署之前,只需要将参数加回原有矩阵即可,即

,不增加模型的推理延迟。

LoRA示意图,仅需训练A、B

减少内存冗余的ZeRO+Gemini

Colossal-AI 支持使用无冗余优化器 (ZeRO) 来优化内存使用,这种方法可以有效减少内存冗余,并且相比传统的数据并行策略,不会牺牲计算粒度和通信效率,同时可以大幅提高内存使用效率。

为了进一步提升 ZeRO 的性能,Colossal-AI 引入了自动Chunk机制

通过将运算顺序上连续的一组参数存入同一个 Chunk中(Chunk 是一段连续的内存空间),可以确保每个 Chunk 的大小相同,从而提高内存使用效率。

使用Chunk 方式组织内存可以保证 PCI-e 和 GPU-GPU之间的网络带宽得到有效利用,减小通信次数,同时避免潜在的内存碎片。

Chunk机制

此外,Colossal-AI的异构内存空间管理器Gemini支持将优化器状态从 GPU 卸载到 CPU ,以节省 GPU 内存占用。

可以同时利用 GPU 内存、CPU 内存(由 CPU DRAM 或 NVMe SSD内存组成)来突破单GPU内存墙的限制,进一步扩展了可训练模型规模。

通过ZeRO+Gemini提升硬件的模型容量

传送门:

开源地址:

https://github.com/hpcaitech/ColossalAI

参考链接:

https://www.hpc-ai.tech/blog/colossal-ai-chatgpt

有关ChatGPT低成本复现流程开源!任意单张消费级显卡可体验,显存需求低至1.62GB的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. 亚特兰蒂斯的回声(中文版): chatGPT 的杰作 - 2

    英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古

  3. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  4. ruby-on-rails - 如何将大于 5GB 的文件上传到 Amazon S3? - 2

    我目前正在使用带有Carrierwavegem的Rails3.2将文件上传到AmazonS3。现在我需要能够处理用户提交的大于5GB的文件,同时仍然使用Carrierwavegem。Carrierwave或Fog是否有任何其他gem或分支可以处理5GB以上的文件上传到S3?编辑:我不想重写一个完整的Rails上传解决方案,所以像这样的链接没有帮助:https://gist.github.com/908875. 最佳答案 我想出了如何做到这一点,并且现在可以正常工作了。在正确的config/environment文件中,添加以下内容以

  5. ruby - 从任意哈希初始化 Ruby 类,但仅具有匹配访问器的键 - 2

    有没有一种简单的方法可以列出已在Ruby类中设置的访问器/读取器?classTestattr_reader:one,:twodefinitialize#DosomethingenddefthreeendendTest.new=>[one,two]我真正想做的是允许初始化接受具有任意数量属性的哈希,但只提交已经定义了读者的那些。像这样的东西:definitialize(opts)opts.delete_if{|opt,val|notthe_list_of_readers.include?(opt)}.eachdo|opt,val|eval("@#{opt}=\"#{val}\"")end

  6. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  7. 【ChatGPT】ChatGPT 的 N 种用法 - 2

    目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans

  8. ruby - Ruby 的任意精度算术 - 2

    Ruby到底是怎么做到的?Jörg或其他人是否知道幕后发生的事情?不幸的是,我不太了解C,所以bignum.c对我帮助不大。我只是有点好奇有人可以解释(用简单的英语)它使用的任何神奇算法背后的理论。irb(main):001:0>999**99936806348825922326789470084006052186583833823203735320465595962143702560930047223153010387361450517521869134525758989639113039318944796977164583238219236607653663113200177617

  9. ruby:如何在调试时进入任意函数 - 2

    假设我在调试时停在了点上:defget_databyebug=>@cache||=calculate_dataend而@cache有值,所以step函数calculate_data不会被执行。但是我需要在这个确切的运行时点检查calculate_data内部发生了什么。我可以只执行calculate_data并在控制台输出中查看其结果,但是我可以从调试控制台执行函数并同时进入它?(使用byebug或其他一些调试工具)。目标-是在任意时间检查calculate_data逻辑,特别是当get_data调用时@cache已填充。 最佳答案

  10. 「想体验ChatGPT中文聊天?」那快进来,你用不上算我输 - 2

    ♥️作者:白日参商🤵‍♂️个人主页:白日参商主页♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!「想体验ChatGPT中文聊天?」那快进来,你用不上算我输项目场景:项目条件一、那就开始吧1、安装ChatGPT-Desktop2、OpenAPI设置二、使用实例恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!项目场景:近几个月可以说ChatGPT是火得一

随机推荐