RLHF介绍及实践测试

2023-12-22 07:36
文章标签 实践 介绍 测试 rlhf

本文主要是介绍RLHF介绍及实践测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

RLHF(Reinforcement Learning Hyperparameter Optimization Framework)是一种用于强化学习模型的超参数优化框架。它结合了强化学习中的经典方法贝叶斯优化技术能够更高效地找到最佳超参数组合。下面是强化学习微调的完整 RLHF 流程:

  • RLHF-Stage1 是 supervised-fintuning,即使用上文提到的数据集进行模型微调,目的是将大模型能力往垂直领域迁移;
  • RLHF-Stage2 训练奖励模型,它通过对于同一个 prompt 的不同输出进行人工排序,得到对应分数,监督训练奖励模型,目的是训练一个自动评估函数
  • RLHF-Stage3 使用了强化学习算法训练优化LM,目前多个组织找到的可行方案是使用策略梯度强化学习 (Policy Gradient RL) 算法、近端策略优化 (Proximal Policy Optimization,PPO) 微调初始 LM 的部分或全部参数。

ps: 与lora微调的区别是:RLHF多了强化学习的过程,lora微调相当于RLHF-Stage1的SFT

参考学习资料:如何看待Geoffrey Hinton对RLHF的看法? - 知乎【科普向】Chat GPT背后的技术:什么是RLHF(人类反馈强化学习)? - 哔哩哔哩

框架

  • DeepspeedChat:暂不支持LLama、chatglm,IDEA的微调https://github.com/microsoft/DeepSpeedExamples/tree/master/applications/DeepSpeed-Chat
  • Trlx:GitHub - CarperAI/trlx: A repo for distributed training of language models with Reinforcement Learning via Human Feedback (RLHF)
  • ColossalAI-Chat:暂不支持chatglm,IDEA的微调https://github.com/hpcaitech/ColossalAI/tree/main/applications/Chat

三个框架对比介绍:

RLHF几大常用框架实践对比(trlx、deepspeedchat、colossalaichat) - 知乎

实践

本次实践采用ColossalAI框架分步训练(暂不支持TP策略,支持DP策略)

官方训练介绍:https://github.com/hpcaitech/ColossalAI/tree/main/applications/Chat#rlhf-training-stage3---training-model-with-reinforcement-learning-by-human-feedback

conda环境:conda activate coati

RLHF Training Stage1 - Supervised instructs tuning

数据准备:https://huggingface.co/datasets/yizhongw/self_instruct/viewer/super_natural_instructions/train

train_sft.sh:执行监督训练shell脚本

CUDA_VISIBLE_DEVICES=0 torchrun --standalone --nproc_per_node=1 train_sft.py \--pretrain "/data/jupyter/LLM/models/llama-7b-hf/" \  #微调训练底模--model 'llama' \--strategy colossalai_zero2 \ #微调策略方法--log_interval 10 \--save_path  /data/jupyter/your_production/ColossalAI/applications/Chat/models/sft-7b \ #保存路径--dataset "yizhongw/self_instruct" \ #huggingface数据集--batch_size 1 \--accumulation_steps 8 \--lr 2e-5 \--max_datasets_size 512 \--max_epochs 1 \--lora_rank 1

ps:

  • 更多参数说明参考

train_sft.py

  • 训练方法:执行

./train_sft.sh

  •  该步训练的坑较少,只要显存足够,一般不会遇到问题。

RLHF Training Stage2 - Training reward model

数据准备:https://huggingface.co/datasets/Anthropic/hh-rlhf/viewer/Anthropic--hh-rlhf/train?row=1

train_rm.sh:执行奖励函数训练脚本

torchrun --standalone --nproc_per_node=1 train_reward_model.py \--pretrain  "/data/jupyter/your_prodcution/ColossalAI/applications/Chat/models/sft-7b" \ #这里是第一步训练保存的模型路径--model 'llama' \--strategy colossalai_gemini \ #训练策略,这里只能该策略,其他策略实测单张3090 24G显存不足--loss_fn 'log_exp'\--save_path /data/jupyter/your_prodcution/ColossalAI/applications/Chat/models/rmstatic.pt \ #保存模型路径,这里仅为模型权重--dataset 'Anthropic/hh-rlhf'\ #huggingface数据集--lora_rank 1 \--batch_size 1 \--max_len 128 

ps:

  • 更多参数说明参考

train_reward_model.py

  • pretrain的模型是第一步训练保存的模型
  • strategy只能执行colossalai_gemini,其他会显存不足
  • max_len设置为128、256可以跑通,但512会出现显存不足

RLHF Training Stage2 - Training reward model

数据准备:

使用generate_prompt_dataset.py对目标数据生成prompt数据(instructions)https://github.com/XueFuzhao/InstructionWild/tree/main/data#instructwild-data

使用步骤一的pretrain dataset(including the instruction and corresponding response)https://huggingface.co/datasets/yizhongw/self_instruct/viewer/super_natural_instructions/train

train_prompts.sh:执行LM微调训练脚本

torchrun --standalone --nproc_per_node=2 train_prompts.py \--pretrain "/data/jupyter/your_production/ColossalAI/applications/Chat/models/sft-7b" \--model 'llama' \--strategy colossalai_gemini \--prompt_dataset /data/jupyter/LLM/datasets/InstructionWild/data1 \--pretrain_dataset /data/jupyter/LLM/datasets/self_instruct \--rm_pretrain /your/pretrain/rm/definition \--rm_path /data/jupyter/your_production/ColossalAI/applications/Chat/models/rmstatic.pt

ps:

  • 因显存不足,该过程暂无法跑通,底层代码多处封装cuda使用,较难使用仅cpu运行
  • rm_pretrain本意应为训练第二步保存的模型结构,但第二步训练保存的是pt文件,无保存模型结构(colossalai_gemini无法执行save_pretrained,原作者也没有这样保存,colossalai_zero2策略可以,但显存不足),所以在第三步作者是分两步完成模型加载

state_dict = torch.load(args.rm_path, map_location='cpu') reward_model = LlamaRM(pretrained=args.rm_pretrain) reward_model.load_state_dict(state_dict)

  • 这里存在有问题:第二步RM保存pt文件是有两层lora训练的,LlamaRM是无lora的,导致加载直接报错,修改为:

reward_model = LlamaRM(pretrained=pretrain, lora_rank=lora_rank)

  • critic加载第二步RM保存pt文件,存在问题,LlamaCritic是三层lora,pt是二层lora导致报错:

_IncompatibleKeys(missing_keys=['value_head.lora_A', 'value_head.lora_B'], unexpected_keys=[])

修改critic.load_state_dict(state_dict, strict=False)可解决;

  • critic的lora加载顺序可能有问题:先加载value_head后convert_to_lora,导致value_head不可训练,该层参数随机化;

self.model = model self.value_head = value_head self.use_action_mask = use_action_mask self.convert_to_lora()

这篇关于RLHF介绍及实践测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523107

相关文章

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb