RL (HF) 算法支持 LoRA =========================================== 最后更新时间:2025 年 5 月 6 日。 我们支持 PPO、GRPO 等强化学习算法的 LoRA (Low-Rank Adaptation) 功能。 LoRA 是一种参数高效的微调技术,它将可训练的低秩矩阵注入预训练权重(通常是线性层)。这可以减少内存占用和计算成本,从而有可能在硬件有限的情况下微调大型模型。 其带来的好处包括: - 使用适中的硬件(例如 8x80G GPUs)即可对非常大的模型(例如 70B+)进行强化学习。 - 由于内存使用减少,可以启用更大的批次大小 (batch sizes)。 - 简化模型传输和部署,因为只需保存 LoRA 适配器。 - 结合 `SLoRA `_ 或 `CCoE `_ 等技术,可以高效地服务多个 LoRA 适配器。 本指南将说明如何在 RL 训练中启用 LoRA 并配置相关参数。 使用指南 ------------------------ 1. LoRA 已在 `verl.trainer.ppo.ray_trainer.RayPPOTrainer` 中提供。相关示例可通过 `verl.trainer.main_ppo` 入口点找到。 2. 目前,LoRA 通过 huggingface peft 支持,仅与 fsdp/fsdp2 和 vllm 后端配合使用(sglang 支持即将推出)。 - `strategy=fsdp` 或 `strategy=fsdp2` - `rollout.name=vllm` 3. LoRA 所需的配置: - `actor_rollout_ref.model.lora_rank`: int,设置为大于 0 的合理值(例如 8、16、32、64)。 - `actor_rollout_ref.model.lora_alpha`: float,LoRA 中的 alpha 项。 - `actor_rollout_ref.rollout.load_format="safetensors"`: 必需。此设置使 vLLM 能够加载基础模型。 - `actor_rollout_ref.model.target_modules`: LoRA 的目标模块。通常设置为 "all-linear"。 4. 推荐选项: - `actor_rollout_ref.model.use_shm=True`: 将模型预加载到 `/dev/shm` 中,以提高模型加载速度。 - `actor_rollout_ref.rollout.layered_summon=True`: 此设置使 actor-model 在将 LoRA 适配器同步到 vLLM 时,能够按层收集 FSDP 分片 (shards),从而减少 GPU 峰值内存。如果模型非常大 (70B+) 或 GPU 内存有限 (< 48GB),建议使用此选项。 最佳实践和注意事项 ------------------------- 1. **学习率**: 建议将学习率 (learning rate) 的值提高一个数量级。 2. **LoRA Rank**: - Rank 过小可能影响收敛。 - 来自 @thelongestusernameofall 的 LoRA Rank 推荐: - 非常小的 lora_rank 可能导致收敛速度变慢或训练性能变差。建议将 lora_rank 设置为 >=32。测试表明,对于一个 0.5B 模型,设置 lora_rank=32 时,训练收敛速度和最终性能与非 LoRA 训练几乎相同。 - 对于一个 32B 模型,设置 lora_rank=128 时,训练收敛速度和最终性能也与非 LoRA 训练几乎相同。 - 更全面的参考结果即将推出。 .. image:: https://github.com/eric-haibin-lin/verl-community/blob/f2b80b8b26829124dd393b7a795a0640eff11644/docs/lora.jpg?raw=true 3. 使用 8 x 80GB GPU,针对 Qwen2.5-72B 模型进行 RL 训练的参考配置(如有需要,请增加 lora_rank): .. code-block:: data.train_batch_size=64 \ actor_rollout_ref.model.use_shm=True \ actor_rollout_ref.model.lora_rank=32 \ actor_rollout_ref.model.lora_alpha=32 \ actor_rollout_ref.model.target_modules=all-linear \ actor_rollout_ref.actor.optim.lr=3e-5 \ actor_rollout_ref.actor.fsdp_config.fsdp_size=8 \ actor_rollout_ref.actor.fsdp_config.param_offload=True \ actor_rollout_ref.actor.fsdp_config.optimizer_offload=True \ actor_rollout_ref.rollout.tensor_model_parallel_size=8 \ actor_rollout_ref.rollout.name=vllm \ actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \ actor_rollout_ref.rollout.n=5 \ actor_rollout_ref.rollout.max_num_seqs=64 \ actor_rollout_ref.rollout.max_model_len=1536 \ actor_rollout_ref.rollout.max_num_batched_tokens=1536 \ actor_rollout_ref.rollout.load_format=safetensors \ actor_rollout_ref.rollout.layered_summon=True \ actor_rollout_ref.ref.fsdp_config.param_offload=True \ actor_rollout_ref.actor.ulysses_sequence_parallel_size=1 \ 示例脚本 ------------------- 有关端到端的示例,请参阅以下脚本: examples/grpo_trainer/run_qwen2_5-3b_gsm8k_grpo_lora.sh