mcpField
T
torchforge-rl-training

torchforge-rl-training

github.com/orchestra-research開発14.1k954 回インストール19 週間前に更新
リポジトリ

torchforge-rl-training について

torchforge は Meta の PyTorch ネイティブなエージェント強化学習ライブラリです。アルゴリズムと学習基盤を分離し、分散学習、推論、重み同期の処理を担います。

主な機能

  1. 01アルゴリズムと基盤の分離
  2. 02GRPO、DAPO、CISPO、GSPO、SAPO 損失を内蔵
  3. 03単一 GPU から分散構成へ拡張
  4. 04TorchTitan、vLLM、TorchStore のスタック
  5. 05カスタム RL 損失関数の実装

活用シーン

  1. 01GRPO による推論モデルの学習
  2. 02独自 RL アルゴリズムの試作
  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 ネイティブのエージェント型 RL ライブラリ

torchforge は Meta の PyTorch ネイティブな RL ライブラリで、インフラストラクチャの関心事とアルゴリズムの関心事を分離しています。分散トレーニング、推論、重み同期を自動的に処理するため、アルゴリズムに集中して RL 研究を迅速に進めることができます。

torchforge を使うべき場合

次のような場合は torchforge を選択してください:

  • RL アルゴリズムとインフラストラクチャを明確に分離したい場合
  • PyTorch ネイティブの抽象化を利用したい場合(Ray への依存なし)
  • アルゴリズムの実験を簡単に行いたい場合(GRPO、DAPO、SAPO を約 100 行で実装)
  • Monarch アクターシステムによるスケーラブルなトレーニングが必要な場合
  • 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

リソース

コメント