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 Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio