草庐IT

训练ChatGPT的必备资源:语料、模型和代码库完全指南

夕小瑶 2024-05-27 原文

文|python

前言

近期,ChatGPT成为了全网热议的话题。ChatGPT是一种基于大规模语言模型技术(LLM, large language model)实现的人机对话工具。但是,如果我们想要训练自己的大规模语言模型,有哪些公开的资源可以提供帮助呢?在这个github项目中,人民大学的老师同学们从模型参数(Checkpoints)、语料和代码库三个方面,为大家整理并介绍这些资源。接下来,让我们一起来看看吧。

资源链接:
https://github.com/RUCAIBox/LLMSurvey

论文地址:
https://arxiv.org/pdf/2303.18223.pdf

各个大模型的研究测试传送门:

百度文心一言传送门:

https://yiyan.baidu.com/

​阿里通义千问传送门:

https://tongyi.aliyun.com/chat

ChatGPT传送门(免墙,可直接注册测试):

https://wowchat.cn

GPT-4传送门(免墙,可直接注册测试):

https://gpt4test.com

模型参数

从已经训练好的模型参数做精调、继续训练,无疑可以极大地降低计算成本。那目前有哪些开源的大模型参数,可以供我们选择呢?

第一类是100~1000亿参数的模型。这类模型除了LLaMA(650亿)之外,参数范围都集中在100~200亿之间。具体而言,包括:LLaMA[1], mT5[2], T0[3], GPT-NeoX-20B[4], CodeGen[5], UL2[6], Flan-T5[7], mT0[8], PanGu-α[9]。

其中,Flan-T5经过instruction tuning的训练;CodeGen专注于代码生成;mT0是个跨语言模型;PanGu-α有大模型版本,并且在中文下游任务上表现较好。

第二类是超过1000亿参数规模的模型。这类模型开源的较少,包括:OPT[10], OPT-IML[11], BLOOM[12], BLOOMZ[13], GLM[14], Galactica[15]。参数规模都在1000亿~2000亿之间。

其中,OPT是专为开源和大模型复现提出的;BLOOM 和 BLOOMZ具有跨语言能力;Galactica, GLM, 和 OPT-IML都是经过instruction tuning的。

这些模型参数大多使用几百到上千块显卡训练得到。比如GPT-NeoX-20B(200亿参数)使用了96个A100-SXM4-40GB GPU,LLaMA(650亿参数)使用了2048块A100-80G GPU学习了21天,OPT(1750亿参数)使用了992 A100-80GB GPU,GLM(1300亿参数)使用了768块DGX-A100-40G GPU训练了60天。

除了这些可供公开下载参数的模型之外,OpenAI还提供在他们的服务器上精调GPT-3模型的服务,可以选择的初始模型参数包括babbage(GPT-3 1B), curie(GPT-3 6.7B)和 davinci(GPT-3 175B)。

上图中,标黄的模型均为开源模型。

语料

训练大规模语言模型,训练语料不可或缺。主要的开源语料可以分成5类:书籍、网页爬取、社交媒体平台、百科、代码。

书籍语料包括:BookCorpus[16] 和 Project Gutenberg[17],分别包含1.1万和7万本书籍。前者在GPT-2等小模型中使用较多,而MT-NLG 和 LLaMA等大模型均使用了后者作为训练语料。

最常用的网页爬取语料是CommonCrawl[18]。不过该语料虽然很大,但质量较差。大模型大多采用从其中筛选得到的子集用于训练。常用的4个子集包括:C4[19], CC-Stories, CC-News[20], 和 RealNews[21]。CC-Stories的原版现在已不提供下载,一个替代选项是CC-Stories-R[22]。

社交媒体平台语料主要获取自Reddit平台。WebText包含了Reddit平台上的高赞内容,然而现在已经不提供下载,现在可以用OpenWebText[23]替代。此外,PushShift.io[24]提供了一个实时更新的Reddit的全部内容。

百科语料就是维基百科(Wikipedia[25])的下载数据。该语料被广泛地用于多种大语言模型(GPT-3, LaMDA, LLaMA 等),且提供多种语言版本,可用于支持跨语言模型训练。

代码语料主要来自于GitHub中的项目,或代码问答社区。开源的代码语料有谷歌的BigQuery[26]。大语言模型CodeGen在训练时就使用了BigQuery的一个子集。

除了这些单一内容来源的语料,还有一些语料集。比如 the Pile[27]合并了22个子集,构建了800GB规模的混合语料。而 ROOTS[28]整合了59种语言的语料,包含1.61TB的文本内容。

上图统计了这些常用的开源语料。目前的预训练模型大多采用多个语料资源合并作为训练数据。比如GPT-3使用了5个来源3000亿token(word piece),包含开源语料CommonCrawl, Wikipedia 和非开源语料(WebText2,Books1, Books2)。

代码库

使用代码库,可以帮助你快速搭建模型结构,而不用一个个矩阵乘法地搭建transformers结构。具体而言,包括以下7个:

  1. Transformers[29]是Hugging Face构建的用来快速实现transformers结构的库。同时也提供数据集处理与评价等相关功能。应用广泛,社区活跃。

  2. DeepSpeed[30]是一个微软构建的基于PyTorch的库。GPT-Neo,BLOOM等模型均是基于该库开发。DeepSpeed提供了多种分布式优化工具,如ZeRO,gradient checkpointing等。

  3. Megatron-LM[31]是NVIDIA构建的一个基于PyTorch的大模型训练工具,并提供一些用于分布式计算的工具如模型与数据并行、混合精度训练,FlashAttention与gradient checkpointing等。

  4. JAX[32]是Google Brain构建的一个工具,支持GPU与TPU,并且提供了即时编译加速与自动batching等功能。

  5. Colossal-AI[33]是EleutherAI基于JAX开发的一个大模型训练工具,支持并行化与混合精度训练。最近有一个基于LLaMA训练的对话应用ColossalChat就是基于该工具构建的。

  6. BMTrain[34] 是 OpenBMB开发的一个大模型训练工具,强调代码简化,低资源与高可用性。在其ModelCenter中,已经构建好如Flan-T5 与 GLM等模型结构可供直接使用。

  7. FastMoE[35] 是一个基于pytorch的用于搭建混合专家模型的工具,并支持训练时数据与模型并行。

结束语

通过使用以上提到的模型参数、语料与代码,我们可以极大地方便自己实现大规模语言模型,并搭建出自己的对话工具。但是,尽管数据资源相对容易获取,计算资源却十分稀缺。想要获得足够的显卡资源以训练/调整大规模模型,仍然是一件非常困难的事情。因此,私有化ChatGPT的道路任重而道远。在计算资源相对匮乏的情况下,我们更是要利用好手头的模型参数、语料与代码等资源,以有限的计算量取得最好的表现。

附:各个大模型的研究测试传送门:

百度文心一言传送门:

https://yiyan.baidu.com/

​阿里通义千问传送门:

https://tongyi.aliyun.com/chat

ChatGPT传送门(免墙,可直接注册测试):

https://wowchat.cn

GPT-4传送门(免墙,可直接注册测试):

https://gpt4test.com

卖萌屋作者:python

北大毕业的NLP博士。日常写点论文,码点知乎,刷点leetcode。主要关注问答、对话、信息抽取、预训练、智能法律等方向。力扣国服第一python选手(经常掉下来)。知乎 ID 是 Erutan Lai, leetcode/力扣 ID 是 pku_erutan,欢迎没事常来逛逛。

作品推荐

  1. 恕我直言,你的实验结论可能严重依赖随机数种子!

  2. AllenAI 发布万能问答系统 MACAW!各类题型样样精通,性能大幅超越 GPT-3!

  3. 吐血整理:论文写作中注意这些细节,能显著提升成稿质量

  4. 恕我直言,你的模型可能并没看懂 prompt 在说啥

后台回复关键词【入群

加入卖萌屋NLP、CV、搜推广与求职讨论群

 

[1]https://github.com/facebookresearch/llama

[2]https://huggingface.co/google/mt5-xxl/tree/main

[3]https://huggingface.co/bigscience/T0

[4]https://huggingface.co/EleutherAI/gpt-neox-20b/tree/main

[5]https://huggingface.co/Salesforce/codegen-16B-nl

[6]https://github.com/google-research/google-research/tree/master/ul2

[7]https://github.com/google-research/t5x/blob/main/docs/models.md#flan-t5-checkpoints

[8]https://github.com/bigscience-workshop/xmtf

[9]https://openi.pcl.ac.cn/PCL-Platform.Intelligence/PanGu-Alpha

[10]https://github.com/facebookresearch/metaseq/tree/main/projects/OPT

[11]https://huggingface.co/facebook/opt-iml-30b

[12]https://huggingface.co/bigscience/bloom

[13]https://github.com/bigscience-workshop/xmtf

[14]https://github.com/THUDM/GLM-130B

[15]https://huggingface.co/facebook/galactica-120b

[16]https://huggingface.co/datasets/bookcorpus

[17]https://www.gutenberg.org/

[18]https://commoncrawl.org/

[19]https://www.tensorflow.org/datasets/catalog/c4

[20]https://huggingface.co/datasets/cc_news

[21]https://github.com/rowanz/grover/tree/master/realnews

[22]https://huggingface.co/datasets/spacemanidol/cc-stories

[23]https://skylion007.github.io/OpenWebTextCorpus/

[24]https://files.pushshift.io/reddit/

[25]https://dumps.wikimedia.org/

[26]https://cloud.google.com/bigquery/public-data?hl=zh-cn

[27]https://pile.eleuther.ai/

[28]https://arxiv.org/abs/2303.03915

[29]https://huggingface.co/

[30]https://github.com/microsoft/DeepSpeed

[31]https://github.com/NVIDIA/Megatron-LM

[32]https://github.com/google/jax

[33]https://github.com/hpcaitech/ColossalAI

[34]https://github.com/OpenBMB/BMTrain

[35]https://github.com/laekov/fastmoe

有关训练ChatGPT的必备资源:语料、模型和代码库完全指南的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby - 完全离线安装RVM - 2

    我打算为ruby​​脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn

  6. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  7. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  8. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  9. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  10. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

随机推荐