mcpField
T
torchforge-rl-training

torchforge-rl-training

github.com/orchestra-research开发14.1k954 次安装19 周前更新
代码仓库

关于 torchforge-rl-training

torchforge 是 Meta 的 PyTorch 原生 Agent 强化学习研究库,面向算法研究人员。它将算法与训练基础设施分离,并提供分布式训练、推理和权重同步流程。

主要功能

  1. 01算法与基础设施分离
  2. 02内置 GRPO、DAPO、CISPO、GSPO 和 SAPO 损失
  3. 03从单 GPU 扩展到分布式训练
  4. 04采用 TorchTitan、vLLM 和 TorchStore 技术栈
  5. 05支持自定义强化学习损失函数

适用场景

  1. 01使用 GRPO 训练推理模型
  2. 02尝试自定义强化学习算法
  3. 03运行多 GPU 或多节点训练

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill torchforge-rl-training

安装后在 Claude Code 中输入/torchforge-rl-training确认已加载。

附带文件references/api-reference.mdreferences/troubleshooting.md

详细介绍

torchforge:PyTorch 原生 Agentic RL 库

torchforge 是 Meta 的 PyTorch 原生 RL 库,可将基础设施问题与算法问题分离。它让你专注于算法,同时自动处理分布式训练、推理和权重同步,从而加快 RL 研究。

何时使用 torchforge

在以下情况下选择 torchforge:

  • 清晰分离 RL 算法与基础设施
  • PyTorch 原生抽象(不依赖 Ray)
  • 便于尝试算法(GRPO、DAPO、SAPO 约 100 行代码即可实现)
  • 使用 Monarch Actor 系统进行可扩展训练
  • 集成 TorchTitan 以实现模型并行

在以下情况下考虑其他方案:

  • 需要可用于生产环境的稳定性 → 使用 miles 或 verl
  • 希望使用 Megatron 原生训练 → 使用 slime
  • torchforge 目前处于实验阶段,API 可能会发生变化

主要功能

  • 算法隔离:实现 RL 算法时无需接触基础设施
  • 可扩展性:借助 Monarch,从单个 GPU 扩展到数千个 GPU
  • 现代技术栈:TorchTitan(训练)、vLLM(推理)、TorchStore(同步)
  • 损失函数:内置 GRPO、DAPO、CISPO、GSPO、SAPO

架构概览

┌─────────────────────────────────────────────────────────┐
│ Application Layer (Your Code)                           │
│ - Define reward models, loss functions, sampling        │
└─────────────────────┬───────────────────────────────────┘
                      │
┌─────────────────────▼───────────────────────────────────┐
│ Forge API Layer                                         │
│ - Episode, Group dataclasses                           │
│ - Service interfaces (async/await)                      │
└─────────────────────┬───────────────────────────────────┘
                      │
┌─────────────────────▼───────────────────────────────────┐
│ Distributed Services (Monarch)                          │
│ ├── Trainer (TorchTitan FSDP)                          │
│ ├── Generator (vLLM inference)                          │
│ ├── Reference Model (frozen KL baseline)               │
│ └── Reward Actors (compute rewards)                    │
└─────────────────────────────────────────────────────────┘

安装

# Create environment
conda create -n forge python=3.12
conda activate forge

# Install (handles PyTorch nightly + dependencies)
./scripts/install.sh

# Verify
python -c "import torch, forge, vllm; print('OK')"
ROCm 安装
./scripts/install_rocm.sh

快速开始

SFT 训练(2 个以上 GPU)
python -m apps.sft.main --config apps/sft/llama3_8b.yaml
GRPO 训练(3 个以上 GPU)
python -m apps.grpo.main --config apps/grpo/qwen3_1_7b.yaml

工作流 1:用于数学推理的 GRPO 训练

使用此工作流,通过组相对优势训练推理模型。

先决条件清单
  • 3 个以上 GPU(GPU0:trainer,GPU1:ref_model,GPU2:generator)
  • 来自 HuggingFace Hub 的模型
  • 训练数据集(GSM8K、MATH 等)
步骤 1:创建配置
# config/grpo_math.yaml
model: "Qwen/Qwen2.5-7B-Instruct"

dataset:
  path: "openai/gsm8k"
  split: "train"
  streaming: true

training:
  batch_size: 4
  learning_rate: 1e-6
  seq_len: 4096
  dtype: bfloat16
  gradient_accumulation_steps: 4

grpo:
  n_samples: 8           # Responses per prompt
  clip_low: 0.2
  clip_high: 0.28
  beta: 0.1              # KL penalty coefficient
  temperature: 0.7

services:
  generator:
    procs: 1
    num_replicas: 1
    with_gpus: true
  trainer:
    procs: 1
    num_replicas: 1
    with_gpus: true
  ref_model:
    procs: 1
    num_replicas: 1
    with_gpus: true
步骤 2:定义奖励函数
# rewards.py
# Reward functions are in forge.data.rewards
from forge.data.rewards import MathReward, ThinkingReward
import re

# Or define your own reward function
class CustomMathReward:
    def __call__(self, prompt: str, response: str, target: str) -> float:
        # Extract answer from response
        match = re.search(r'\\boxed{([^}]+)}', response)
        if not match:
            return 0.0

        answer = match.group(1).strip()
        return 1.0 if answer == target else 0.0
步骤 3:启动训练
python -m apps.grpo.main --config config/grpo_math.yaml
步骤 4:监控进度
  • 在 W&B 控制面板中查看损失曲线
  • 确认熵正在下降(策略正变得更加确定)
  • 监控 KL 散度(应保持在有界范围内)

工作流 2:自定义损失函数

使用此工作流实现新的 RL 算法。

步骤 1:创建损失类
# src/forge/losses/custom_loss.py
import torch
import torch.nn as nn

class CustomLoss(nn.Module):
    def __init__(self, clip_range: float = 0.2, beta: float = 0.1):
        super().__init__()
        self.clip_range = clip_range
        self.beta = beta

    def forward(
        self,
        logprobs: torch.Tensor,
        ref_logprobs: torch.Tensor,
        advantages: torch.Tensor,
        padding_mask: torch.Tensor,
    ) -> torch.Tensor:
        # Compute importance ratio
        ratio = torch.exp(logprobs - ref_logprobs)

        # Clipped policy gradient
        clipped_ratio = torch.clamp(
            ratio,
            1 - self.clip_range,
            1 + self.clip_range
        )
        pg_loss = -torch.min(ratio * advantages, clipped_ratio * advantages)

        # KL penalty
        kl = ref_logprobs - logprobs

        # Apply mask and aggregate
        masked_loss = (pg_loss + self.beta * kl) * padding_mask
        loss = masked_loss.sum() / padding_mask.sum()

        return loss
步骤 2:集成到应用中
# apps/custom/main.py
from forge.losses.custom_loss import CustomLoss

loss_fn = CustomLoss(clip_range=0.2, beta=0.1)

# In training loop
loss = loss_fn(
    logprobs=logprobs,
    ref_logprobs=ref_logprobs,
    advantages=advantages,
    padding_mask=padding_mask,
)

工作流 3:多 GPU 分布式训练

使用此工作流扩展到多个 GPU 或节点。

分布式配置
# config/distributed.yaml
model: "meta-llama/Meta-Llama-3.1-8B-Instruct"

parallelism:
  tensor_parallel_degree: 2    # Split model across GPUs
  pipeline_parallel_degree: 1
  data_parallel_shard_degree: 2

services:
  generator:
    procs: 2                   # 2 processes for TP=2
    num_replicas: 1
    with_gpus: true
  trainer:
    procs: 2
    num_replicas: 1
    with_gpus: true
使用 SLURM 启动
# Submit job
sbatch --nodes=2 --gpus-per-node=8 run_grpo.sh
本地启动(多 GPU)
# 8 GPU setup
python -m apps.grpo.main \
    --config config/distributed.yaml \
    --trainer.procs 4 \
    --generator.procs 4

核心 API 参考

训练批次格式

torchforge 使用基于字典的批次进行训练:

# inputs: list of dicts with torch.Tensor values
inputs = [{"tokens": torch.Tensor}]

# targets: list of dicts with training signals
targets = [{
    "response": torch.Tensor,
    "ref_logprobs": torch.Tensor,
    "advantages": torch.Tensor,
    "padding_mask": torch.Tensor
}]

# train_step returns loss as float
loss = trainer.train_step(inputs, targets)
Completion

vLLM 生成的输出:

@dataclass
class Completion:
    text: str              # Generated text
    token_ids: list[int]   # Token IDs
    logprobs: list[float]  # Log probabilities
    metadata: dict         # Custom metadata

内置损失函数

损失函数

损失函数位于 forge.losses 模块中:

from forge.losses import SimpleGRPOLoss, ReinforceLoss

# SimpleGRPOLoss for GRPO training
loss_fn = SimpleGRPOLoss(beta=0.1)

# Forward pass
loss = loss_fn(
    logprobs=logprobs,
    ref_logprobs=ref_logprobs,
    advantages=advantages,
    padding_mask=padding_mask
)
ReinforceLoss
from forge.losses.reinforce_loss import ReinforceLoss

# With optional importance ratio clipping
loss_fn = ReinforceLoss(clip_ratio=0.2)

常见问题与解决方案

问题:GPU 数量不足

症状:“Insufficient GPU resources” 错误

解决方案:

# Reduce service requirements
services:
  generator:
    procs: 1
    with_gpus: true
  trainer:
    procs: 1
    with_gpus: true
  # Remove ref_model (uses generator weights)

或者将 CPU 用于参考模型:

ref_model:
  with_gpus: false
问题:生成期间发生 OOM

症状:vLLM 中出现 CUDA OOM

解决方案:

# Reduce batch size
grpo:
  n_samples: 4  # Reduce from 8

# Or reduce sequence length
training:
  seq_len: 2048
问题:权重同步缓慢

症状:训练和生成之间出现长时间停顿

解决方案:

# Enable RDMA (if available)
export TORCHSTORE_USE_RDMA=1

# Or reduce sync frequency
training:
  sync_interval: 10  # Sync every 10 steps
问题:策略崩溃

症状:熵降至零,奖励不再提升

解决方案:

# Increase KL penalty
grpo:
  beta: 0.2  # Increase from 0.1

# Or add entropy bonus
training:
  entropy_coef: 0.01

资源

评论

支持 Markdown