常见问题解答 (FAQ)¶
关于 LightRFT 的常见问题及其回答。
常规问题¶
Q: 什么是 LightRFT?¶
A: LightRFT (Light Reinforcement Fine-Tuning) 是一个先进的强化学习框架,专为大语言模型 (LLM) 和视觉语言模型 (VLM) 的强化微调而设计,支持多种模型、算法、分布式训练策略和推理引擎,提供高效且可扩展的 RLHF 和 RLVR 训练能力。
Q: LightRFT 与 OpenRLHF 的主要区别是什么?¶
A: LightRFT 在 OpenRLHF 的基础上进行了以下扩展:
增强了多模态 (VLM) 支持
更多的强化学习算法(GRPO, GSPO, GMPO, REINFORCE++, CPGD 等)
更全面的奖励模型 (Reward Model) 支持,包括标量奖励模型 (SRM) 和生成式奖励模型 (GRM)
更好的显存优化(推理引擎休眠、优化器卸载)
改进的推理引擎(vLLM, SGLang)
为了提高效率,支持奖励模型 (RM) 的同机部署 (Co-location)
更灵活的分布式训练策略,支持 FSDP 和 DeepSpeed ZeRO
Q: 支持哪些模型?¶
A: LightRFT 支持:
LLM: Qwen, Qwen2.5 以及大多数 HuggingFace 模型
VLM: Qwen-VL, Qwen2-VL
Audio: Qwen2-Audio
自定义模型: 轻松继承并扩展现有模型架构
Q: 需要什么样的硬件?¶
A: 最低要求:
GPU: 支持 CUDA 12.8+ 的 NVIDIA GPU
显存: 建议每张 GPU 40GB+ VRAM(通过优化可以实现 24GB 运行)
PyTorch: 2.9.1+
Python: 3.10+
生产环境建议:8× A100/H100 80GB。
安装问题¶
Q: 如何安装 LightRFT?¶
A: 简单安装步骤:
git clone https://github.com/opendilab/LightRFT.git
cd LightRFT
pip install -r requirements.txt && pip install -e .
训练问题¶
Q: FSDP 和 DeepSpeed 有什么区别?¶
A: 虽然两者都实现了完全分片数据并行 (ZeRO-3/FSDP),但设计哲学和侧重点不同:
FSDP (PyTorch 原生):
深度集成: 原生支持 Autograd 和
torch.compile,与 PyTorch 生态无缝衔接。高灵活度: 通过
auto_wrap_policy可精细控制模块分片粒度,适合结构复杂的自定义模型。易于组合: 更容易与张量并行 (TP) 等原生分布式技术组合。
DeepSpeed (微软开发):
功能全家桶: 一站式提供 CPU/NVMe 卸载 (ZeRO-Infinity)、高性能优化器等工具。
声明式配置: 通过 JSON 文件管理设置,将复杂性抽象化,上手门槛较低。
极致性能: 包含大量针对特定场景优化的自定义 CUDA Kernel。
选择建议: 追求原生体验、复杂定制或使用 torch.compile 时选 FSDP;需要极致易用性或极其巨大的模型(需 NVMe 卸载)时选 DeepSpeed。
Q: 我该使用哪种算法?¶
A: 根据任务类型选择:
数学/编程: GRPO, Dr.GRPO
指令遵循: CPGD, GSPO
开放式生成: FIRE Sampling
低显存环境: GRPO(无需 Critic 网络)
研究用途: GMPO, REINFORCE++
Q: 每个 Prompt 应该设置多少个采样样本 (Samples per prompt)?¶
A: 常见取值:
4-8: 标准设置,平衡性好。
16+: 质量更高,训练较慢。
32+: 适用于 Best-of-N 场景。
样本数越多,优势估计越准,但训练速度越慢。
Q: 我可以使用多个奖励模型吗?¶
A: 可以!LightRFT 支持:
多个奖励模型并行运行
奖励模型同机部署(与训练共用 GPU)
远程奖励模型服务器
加权奖励组合
性能问题¶
Q: 如何减少显存占用?¶
A: 使用以下技术:
开启梯度检查点:
--gradient_checkpointing使用 FSDP 并开启 CPU 卸载:
--fsdp --fsdp_cpu_offload降低推理引擎显存占比:
--engine_mem_util 0.4使用 ZeRO-3:
--zero_stage 3减小 Batch Size
开启引擎休眠:
--enable_engine_sleep
Q: 如何加速训练?¶
A:
增大 Batch Size(如果显存允许)
使用 FP8 推理(正在开发中,仅限 vLLM)
开启 Flash Attention:
--flash_attn如果可能,减小
n_samples_per_prompt生成阶段使用张量并行:
--engine_tp_size 2优化 NCCL:
export TORCH_NCCL_AVOID_RECORD_STREAMS=1
Q: 典型的训练速度是多少?¶
A: 在 8× A100 80GB 上(使用 FSDP 及相关优化):
7B 模型: 约 1000 样本/分钟
13B 模型: 约 500 样本/分钟
34B 模型: 约 200 样本/分钟
70B 模型: 约 50 样本/分钟
算法问题¶
Q: GRPO 和 PPO 有什么区别?¶
A:
GRPO: 基于组归一化的优势估计,不需要单独的 Critic 网络。
PPO: 使用独立的价值网络 (Critic)。
GRPO 系统更简洁,显存效率更高。
Q: 什么是 Clip Higher?¶
A: 一种改进的裁剪方案,为正负优势 (advantages) 使用独立的上下界。更适用于:
噪声奖励
大分布偏移
不稳定的训练过程
调试问题¶
Q: 训练因显存溢出 (OOM) 崩溃¶
A: 请参阅 故障排除指南
Q: 报错 num_rollouts_per_episodes = 0¶
A: 您的 train_batch_size 设置过小。请确保:
train_batch_size >= rollout_batch_size × n_samples_per_prompt
Q: 模型没有提升 / 奖励没有增加¶
A: 请检查:
学习率是否过高或过低
KL 惩罚是否过大
奖励模型的质量
开启奖励归一化:
--reward_running_norm尝试不同的优势估计器
Q: NCCL 超时或卡住¶
A:
export NCCL_DEBUG=INFO
export TORCH_DISTRIBUTED_DEBUG=DETAIL
# 增加超时时间
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_DISABLE=1
Q: vLLM 引擎初始化失败¶
A:
检查 GPU 显存:尝试
--engine_mem_util 0.5减小 TP 大小:
--engine_tp_size 1检查 CUDA 兼容性
更新 vLLM:
pip install -U vllm
评估问题¶
Q: 如何在 Benchmark 上进行评估?¶
A: 对于数学评测,请使用 examples 目录下的评测脚本:
# 请参考 examples/gsm8k_geo3k 目录下的评测脚本
# 也可以参考训练示例脚本中的评测配置部分
Q: 我可以保存生成轨迹 (Trajectories) 吗?¶
A: 可以,使用轨迹保存器:
from lightrft.utils import TrajectorySaver
saver = TrajectorySaver(output_dir="./trajectories")
# 自动保存 Prompts, Responses, Rewards
Q: 如何集成 W&B?¶
A:
python train.py \
--use_wandb your-project \
--wandb_org your-org \
--wandb_run_name experiment-1
进阶问题¶
Q: 我能实现自定义算法吗?¶
A: 可以!扩展 Trainer 类即可:
from lightrft.trainer import SPMDPPOTrainer
class CustomTrainer(SPMDPPOTrainer):
def compute_advantages(self, ...):
# 您的自定义优势计算逻辑
pass
Q: 如何添加新的模型架构?¶
A: 有以下两种方法:
常规方法:通过继承
ActorLanguage或ActorVL等基类来实现新的模型架构,并在lightrft/models/目录下添加相应实现。Monkey Patch 方法:在
lightrft/models/monkey_patch/中创建 monkey patch:
# your_model.py
def patch_your_model(model):
# 添加自定义 forward 方法等
pass
# 在 apply.py 中注册
from .your_model import patch_your_model
Q: 我可以使用自定义奖励函数吗?¶
A: 可以,传入一个可调用对象:
def custom_reward_fn(responses, labels):
# 您的奖励计算逻辑
return rewards
trainer = SPMDPPOTrainer(
...,
reward_fn=custom_reward_fn
)
Q: 训练过程中如何保存 Checkpoint ?¶
A: 检查点保存是自动的:
--save_path ./checkpoints \
--save_interval 1 \
--max_ckpt_num 3
恢复训练:
--load_checkpoint \
--ckpt_path ./checkpoints/episode_5
贡献问题¶
Q: 我如何为 LightRFT 做贡献?¶
A:
Fork 仓库
创建特性分支
实现您的修改
添加测试
提交 Pull Request
详情请参阅 贡献指南。
Q: 如何报告 Bug?¶
A: 在 GitHub Issues 上提交 Issue,包含:
环境详情(GPU, CUDA, PyTorch 版本)
完整的错误堆栈追踪
最小复现脚本
预期行为与实际行为的对比
Q: 哪里可以获得帮助?¶
A:
Bug 反馈:GitHub Issues
提问交流:GitHub Discussions
指南文档:Documentation
代码参考:Examples 目录