RL (HF) 算法支持 LoRA

最后更新时间:2025 年 5 月 6 日。

我们支持 PPO、GRPO 等强化学习算法的 LoRA (Low-Rank Adaptation) 功能。

LoRA 是一种参数高效的微调技术,它将可训练的低秩矩阵注入预训练权重(通常是线性层)。这可以减少内存占用和计算成本,从而有可能在硬件有限的情况下微调大型模型。

其带来的好处包括:

  • 使用适中的硬件(例如 8x80G GPUs)即可对非常大的模型(例如 70B+)进行强化学习。

  • 由于内存使用减少,可以启用更大的批次大小 (batch sizes)。

  • 简化模型传输和部署,因为只需保存 LoRA 适配器。

  • 结合 SLoRACCoE 等技术,可以高效地服务多个 LoRA 适配器。

本指南将说明如何在 RL 训练中启用 LoRA 并配置相关参数。

使用指南

  1. LoRA 已在 verl.trainer.ppo.ray_trainer.RayPPOTrainer 中提供。相关示例可通过 verl.trainer.main_ppo 入口点找到。

  2. 目前,LoRA 通过 huggingface peft 支持,仅与 fsdp/fsdp2 和 vllm 后端配合使用(sglang 支持即将推出)。

  • strategy=fsdpstrategy=fsdp2

  • rollout.name=vllm

  1. 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”。

  1. 推荐选项:

  • 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 训练几乎相同。

    • 更全面的参考结果即将推出。

https://github.com/eric-haibin-lin/verl-community/blob/f2b80b8b26829124dd393b7a795a0640eff11644/docs/lora.jpg?raw=true
  1. 使用 8 x 80GB GPU,针对 Qwen2.5-72B 模型进行 RL 训练的参考配置(如有需要,请增加 lora_rank):

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