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

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro