让对齐大模型超简单 这个团队做了OpenAI没Open的技术

机器之心报道

编辑:Panda

随着大型语言模型(LLM)规模不断增大,其性能也在不断提升。尽管如此,LLM 依然面临着一个关键难题:与人类的价值和意图对齐。在解决这一难题方面,一种强大的技术是根据人类反馈的强化学习(RLHF)。

但是,随着模型越来越大,RLHF 通常需要维持多个模型以及越来越复杂的学习流程,这又会导致内存和计算资源需求增长。举个例子,近端策略优化(PPO,这是 RLHF 常用的一种算法)需要在训练过程中维持四个模型。

由此,当语言模型的参数规模超过 700 亿时,为了训练和协调多个模型,所需的计算资源和调度复杂性会显著增长 —— 这是当前的架构设计难以满足的需求。

Transformer 强化学习(TRL)、ColossalChat(CAIChat)和 DeepSpeed-Chat(DSChat)等现有的开源 RLHF 框架是依靠零冗余优化器(Zero Redundancy Optimizer/ZeRO),来将 RLHF 训练涉及的四个模型配置到同一台 GPU 上。这个过程被称为 co-location,即空间并置。

但是,随着模型参数规模超过 700 亿,在内存有限的 GPU 上,这种调度方法的效率会越来越低。

为了解决空间并置的限制,TRL 等一些框架选择在内存使用上做出妥协,其做法包括将 actor 和 critic 模型融合起来或采用低秩适应(LoRA)等技术。但是,这些技术会降低模型性能,而且融合 actor-critic 式架构与备受推崇的实践做法不兼容,即使用奖励模型的权重来初始化 critic 模型的权重。

另一种替代方法是使用来自英伟达 Megatron 的张量并行化和管道并行化技术。但是,Megatron 与人们常用的 Hugging Face 软件库不兼容,而适应新模型又需要大量修改源代码,如此就很难使用了。

为了轻松实现大规模 RLHF 训练,OpenLLMAI、字节跳动、网易伏羲 AI Lab、阿里巴巴的一个联合团队提出并开源了 OpenRLHF,其中第一作者为 Jian Hu。该框架使用 Ray、vLLM 和 DeepSpeed 对模型调度进行了重新设计,可支持超 700 亿参数的模型的 RLHF 训练,其优势包括简单易用、高性能、实现了分布式 RLHF、集成了 PPO 实现技巧。

有关 Ray、vLLM 和 DeepSpeed 的具体详情,请访问原论文:

OpenRLHF 可与 Hugging Face Transformer 无缝整合,并且支持混合专家(MoE)、Jamba 和 QLoRA 等常用技术。此外,OpenRLHF 还实现了多个对齐算法,包括直接偏好优化(DPO)和 Kahneman-Tversky 优化(KTO)、条件 SFT 和拒绝采样。

因此,可以说 OpenRLHF 是一个非常全面的 RLHF 训练框架。

表 1 比较了常用的 RLHF 框架。

OpenRLHF 的设计

调度优化

要为更大的模型执行 RLHF 训练,需要高效地在多台 GPU 上分配至少四个组件模型(actor、critic、奖励、参考)。为什么需要多台 GPU?因为每台 GPU 加速器的内存有限,比如 NVIDIA A100 的内存不到 80GB。OpenRLHF 在模型调度方面创新性地使用了 Ray 来进行模型安放和细粒度的编排。

同时,OpenRLHF 还使用了针对推理优化的软件库 vLLM 和针对训练优化的软件库 DeepSpeed;它们都由基于 Ray 的调度器管理。

OpenRLHF 能将四个模型分配到多台 GPU 上,而不是将它们并置于同一台 GPU,如图 1 所示。

这样的设计很自然就支持在 RLHF 训练过程中使用多个奖励模型,如图 2 所示,并适用于多种算法实现。

基于此,算法工程师无需关心底层数据流的细节,就能快速构建多种对齐策略,比如有用性和有害性分离。这样的调度器设计还可使用 Ray 和 DeepSpeed 来实现灵活的模型融合或卸载策略。比如可以融合 actor - 参考或 critic - 奖励模型以节省 GPU 资源。

除了能高度定制算法实现这一优点,该调度器还能以最优方式编排 GPU,从而提升整体训练性能。

性能优化

RLHF 算法的性能取决于训练和推理两方面的效率。从分析结果看,主要瓶颈是在 PPO 样本生成阶段(如图 2 所示),这个阶段占到了整体训练时间的 80%。原因是:在生成阶段,自回归解码的复杂度为 O (n^2),并且也受到内存限制。

为了进一步加快样本生成的速度以及支持无法载入到单台 GPU 的更大型 LLM(比如 700 亿参数的模型),OpenRLHF 使用了 vLLM 的张量并行化等先进技术(连续批处理和分页注意力)来执行生成过程,如图 1 所示。

在 RLHF 的生成和学习阶段,OpenRLHF 采用了以下技术来获得进一步的提升:

图 2 中另外三个模型使用了 ZeRO 的第 3 阶段(对模型、梯度和优化器进行分片)。OpenRLHF 使用了英伟达 NCCL 和 vLLM 权重加载器来同步 ZeRO 和 vLLM 引擎的权重,确保实现快速又简单的集成。

表 2 比较了 OpenRLHF 与该团队精心微调过的 DSChat 的性能。

训练稳定性

在训练大型语言模型(LLM)时,PPO 等强化学习算法容易不稳定。为了保证稳定,该团队尽力验证了 OpenRLHF 的实现细节。图 2 和图 3 分别给出了一般的推理和学习流程。

此外,OpenRLHF 还借助了一些技巧来保证 PPO 实现的训练稳定,包括:

易用性

为便于用户使用,该团队还为支持的算法提供了一键可用的可训练脚本(详见原论文),并且该脚本与 Hugging Face 软件库完全兼容。下面给出了 Llama2 70B 模型的 RLHF 训练的最低配置:

更多技术细节请参阅原论文。


The computer centre,_last year,is very popular among the students in this school

不选open 选opened (因为你这四项里一个opened也没有,不知道是不是你的D写错了) the computer centre,____ last year. 去年开的这个电脑中心,电脑中心是被开的,是被动关系.所以就等于 the computer centre which was opened last year ,然后省略掉which was 而得到的opened last year 注意这里的opened 不是因为是过去式,而是因为是被动语态的关系, 现在式或者过去式是由前面的which后到底是was 还是is 决定的 而不管这里是过去还是现在,省略掉之后都填opened 如果你即使要选主动语态,因为这里逗号之间的为插入语的关系,所以 这里open这个动词必定为 非谓语动词 ,而非谓语动词修饰时 要么是ing 形式要么是过去分词,而到底是哪个取决于主动还是被动关系,.像这题 首先排除的就是A选项open , 没有逗号之后用原型这一说, 要么选B要么选D (opened),犹豫上面已经分析过了是被动结构 ,故选opened可以仔细阅读下以下资料:这里涉及到的是定语从句的简化概念 .简化为 分词短语,而到底是现在分词(也就是ING形式)还是过去分词要根据 被修饰的那个词(或者从句里的关系代词)是作主动还是被动.1 首先来看做主动的情况,也就是简化为现在分词ing形式关系代词所引导的定语从句为限制性修饰(关系代词前无逗号),且该关系代词在从句中为主语时,可将从句简化为分词短语,方法如下:第一步:删除关系代词;第二步:将关系代词后的动词变为现在分词;第三步:若动词是be动词,变成分词being后省略。 eg. The girl who lives next to my house is my classmate.=The girl living next to my house is my is a young boy who is full of energy.= John is a young boy (这里的being 是被省略的)full of energy.2 再看看做被动的情况,也就是简化为过去分词的形式如果被修饰词与后面 修饰它的从句为被动的逻辑关系 如(被修饰的)book 被作者写,后面的从句省去which was之后就接的是written(被修饰的)car 被人开 后面的从句省去which was之后是drivenHave you ever read the book which was written by that author ?=Have you ever been read the book written by that author ?This is the car which was driven by my brother in the race.= This is the car driven by my brother in the race .可以看出 提问者的句子 the computer centre,____ last year. 去年开的这个电脑中心,电脑中心是被开的,是被动关系.所以就等于 the computer centre which was opened last year ,然后省略掉which was 而得到的opened last year 注意这里的opened 不是因为是过去式,而是因为是被动语态的关系, 现在式或者过去式是由前面的which后到底是was 还是is 决定的 而不管这里是过去还是现在,省略掉之后都填opened

我想成为游戏开发程序员,要学些什么?

1.图形引擎2.声音引擎3.物理引擎4.游戏引擎5.人工智能或游戏逻辑6.游戏GUI界面(菜单)7.游戏开发工具8.支持局域网对战的网络引擎开发9.支持互联网对战的网络引擎开发下面逐一介绍每个部分:1.图形引擎主要包含游戏中的场景(室内或室外)管理与渲染,角色的动作管理绘制,特效管理与渲染(粒子系统,自然模拟(如水纹,植物等模拟)),光照和材质处理,LOD(Level Object Detail)管理等,另外还有图形数据转换工具开发,这些工具主要用于把美工用DCC软件(如3DS Max,Maya,Soft XSI,Soft Image3D等)软件制作的模型和动作数据以及用Photo shop或painter等工具制作的贴图,转化成游戏程序中用的资源文件。 2.声音引擎主要包含音效(Sound Effect简称SE),语音(VOICE),背景音乐(Background music简称BGM)的播放。 SE是指那些在游戏中频繁播放,而且播放时间比较短,但要求能及时无延迟的播放,VOICE是指游戏中的语音或人声,这部分对声音品质要求比较高,基本上用比较高的采样率录制和回放声音,但和SE一样要求能及时无延迟的播放,SE在有的时候因为内存容量的问题,在不影响效果的前提下,可能会降低采样率,但VOICE由于降低采样率对效果影响比较大,所以一般VOICE不采用降低采样率的做法。 BGM是指游戏中一长段循环播放(也有不循环,只播放一次)的背景音乐,正是由于BGM的这种特性,一般游戏的背景音乐是读盘(光盘或硬盘)来播放。 另外一些高级声音特效,如EAX,数字影院系统(DTS5.1),数字杜比环绕等。 3.物理引擎主要包含游戏世界中的物体之间、物体和场景之间发生碰撞后的力学模拟, 以及发生碰撞后的物体骨骼运动的力学模拟(比较著名的物理引擎有havok公司的game dynamics sdk,还有open source 的ODE—Open Dynamics Engine)。 4.游戏引擎主要是把图形引擎、声音引擎、物理引擎整合起来,主要针对某个游戏制作一个游戏系统,其包含游戏关卡编辑器,主要用途是可以可视化的对场景进行调整,光照效果和雾化等效果调整,事件设置,道具摆放,NPC设置,另外还有角色编辑器,主要用于编辑角色的属性和检查动作数据的正确性。 一般日本游戏公司的做法,他们会把关卡编辑器和角色编辑器直接做到游戏中,所有的参数调整都在游戏中通过调试菜单来进行编辑,所以一般他们把这部分调试菜单的功能做的很强大,同时在屏幕上实时的显示一些重要的信息,这样做的好处是关卡编辑器调整的效果直接就是游戏的效果,但是对于程序的重用性来说可能不是很好,比如说要用到另外一个游戏项目中就比较难,除非两个游戏类型相同,只要把场景和角色数据换一下,还有做下一代产品也没有问题,只要根据式样增加调试菜单的功能就可以了。 5.人工智能和游戏逻辑开发,这部分日本和欧美的游戏开发模式也有很大不同,在欧美游戏公司中运用脚本语言开发很普遍,所以这部分程序开发主要是用脚本语言编写,而且脚本程序和游戏程序的耦合性很低,有单独的编辑、编译和调试环境,这样比较利于游戏程序和关卡设计开发分开,同时并行开发,所以一般他们都会有专门做关卡设计的程序员岗位。 而日本游戏公司脚本语言一般和游戏的耦合性比较高,一般通过一些语言的宏功能和一些编译器的特定功能来完成一个简单的脚本系统,所以一般这些脚本程序只能在游戏程序中进行调试,而不能在一个单独的脚本编辑,编译环境中进行开发。 6.游戏GUI界面(菜单),主要是指那些游戏中用户界面设计,有做的复杂,有简单的,做的简单就是2D GUI界面,做的复杂有3D GUI界面。 7.游戏开发工具主要包含关卡编辑器,角色编辑器,资源打包管理,DCC软件的插件工具等开发。 8.支持局域网对战的网络引擎开发,主要解决局域网网络发包和延迟处理,通讯同步的问题,有同步通讯和异步通讯两种做法,异步通讯用于那些对运行帧速要求比较高的游戏,同步通讯相对异步通讯来说效率相对低,但是同步通讯的编程模型相对异步通讯来得简单一些。 9.支持互联网对战的网络引擎开发,目前大部分网游都是C/S结构的,服务器端软件配置管理,服务器程序的最优化,还有游戏大厅、组队、游戏逻辑处理、道具管理、收费系统等。 另外还有一些网络系统是C/S和P2P两种结构混合的,如XBOX Live等。 程序员在游戏公司中的岗位在日本游戏公司和欧美的游戏公司有些不同,日本游戏公司中程序员的岗位主要有技术监督(Director),主程序员(Main Programmer),程序员(Programmer),在日本游戏公司里负责游戏项目开发的程序员,一般不会专门根据工作内容划分程序员,除了独立的系统研究室和声音系统制作部门(这两个部门是比较独立的,往往同时给好几个项目服务),负责每个游戏项目开发的程序员,随时都可能一人多职,比如说主程序员除了负责整个游戏系统以外,可能还要负责图形或声音引擎开发等,程序员除了人工智能以外还有菜单制作等。 这种情况在欧美的游戏公司比较少见,他们分工的比较细,一般有图形程序员,声音程序员,人工智能或游戏关卡程序员,物理程序员,每个组中可能还会有一个Leader。 这一点,日本公司和欧美公司也有些不同。 日本公司一般喜欢从一些高校中招聘一些应届优秀毕业生,一方面比招聘有经验的人要来的成本低,另方面新人是一张白纸,容易培养,像SEGA、KONAMI等都是按这种原则招聘员工的,所以想进入日本游戏公司,你要学好你的软件课程。 而欧美公司希望招聘进来,能马上进入项目的开发中去,所以他们一般希望招聘有工作经验的人,即使不是行业中,在相关行业中工作2、3年的也可以,所以想进入欧美游戏公司你的工作经历很重要。 我觉的一个游戏软件程序员,最起码的要求是熟练掌握计算机本科专业所学的知识,主要包括C语言或C++语言,数据结构,编译原理,算法等,另外线性代数、微积分、牛顿力学在图形和物理引擎开发方面用途也很广泛,如果要提高的话还有必要了解硬件相关的知识如计算机体系结构、汇编语言,这些对我们学习一个新的硬件平台、编写最优化代码、提高自己游戏的竞争力都是非常有益的。 另外,保持有恒心、不怕苦(比如说通宵加班)的心态,对游戏的热情也是非常重要的。 对于那些想进入游戏行业,但缺乏软件开发知识的人,可以通过参加游戏开发培训来现在有很多人,计算机本科毕业,学了很多软件开发的知识,但是一旦要用到实际的项目开发时,感觉无从下手,这主要是在学校里运用知识的机会太少了。 所以学习游戏编程最好的方法是能实际参与到一个好的游戏项目中和有丰富开发经验的人一起开发游戏,可能学到很多你从书本上学不到知识和技能。 但有时候你一时还没有机会参与到一个好项目中,没有机会进入一家好的游戏公司,但是你对游戏开发有一腔热情,很希望学习游戏开发的技能,那你就应该去参加专门的游戏开发培训,因为游戏开发培训班中的老师都是一些有丰富开发经验的老师,一般都有五年丰富的项目开发经验,听他们的课,实际上就是在和他一起分享这么多年的开发经验,另外游戏开发培训课程中会专门设计一些项目和课题,它们本身就是可以直接运用游戏开发中,这样你可以不进入著名的游戏公司,但可以学到这些公司中一些常用的开发技能。 另外还有一种方法经济实惠的方法,参加一些网上志愿者的开源项目,这些项目从品质来说有好有坏,选择一个好的项目非常重要,另外他们中间本身有许多是业内人士,本来你要进入他们公司,才能学习到他们的经验,但是通过开源项目,你就有向他们学习的机会了,说不定哪一天,你就进入一家知名的游戏公司了,不过目前开源的完整游戏项目好的不多,到是在图形引擎和物理引擎方面有一些很不错的开源项目,但要加入进去的话,你的基础一定要好啊,有些开源的团队也不是随便什么人就能加入的。

某展览馆鼓励团体消费门票收费标准为每人五元,40人以上(包括四十人)的团体票6折优惠,试建立门票费用模型,简单分析购票策略,并分别计算当有32名,40名,50名学生入馆参观时,所需要的门票费?

当X<40时,Y=5X

当X≥40时,Y=5^0.6X =3X

所以当X=32时,Y=160

X=40时,Y=120

X=50时,Y=150

  • 声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
  • 本文地址:https://srwj168.com.cn/keji312/24864.html
旅游消费用户年轻化 人民财评 为文旅业发展创造更多可能
抄底 部分房企正在逆势 5月土拍市场底部复苏