Scythe
SCYTHE is a lightweight, C#-based game engine focused on modifiability and rapid iteration using Raylib.
An Easy-to-use, Scalable and High-performance Agentic RL Framework based on Ray (PPO & DAPO & REINFORCE++ & VLM & TIS…
Open-source / Comprehensive / Lightweight / Easy-to-use
OpenRLHF is the first high-performance, production-ready open-source RLHF framework that combines Ray + vLLM distributed architecture with a unified agent-based design paradigm for scalable and extensible reinforcement learning from human feedback.
📚 Learn More: Documentation | Slides | Technical Report | Video
🔥 New Backend: Molt brings an Automodel-powered backend to OpenRLHF that's more powerful than DeepSpeed — scaling RL training to hundreds of billions of parameters while keeping the same familiar, elegant OpenRLHF workflow.
--train.async_enable and async agent RLHF via --train.agent_func_path. See train_reinforce_baseline_ray_agent_async.sh for a runnable example.OpenRLHF is the first RLHF framework built on Ray + vLLM distributed architecture, orchestrating multiple components across GPUs efficiently:
Ray - Distributed Scheduler and Controller
OpenRLHF leverages Ray for efficient distributed scheduling. It separates the Actor, Reward, Reference, and Critic models across different GPUs, enabling scalable training for models up to 70B+ parameters.
Hybrid Engine Scheduling: All models and vLLM engines can share GPU resources—minimizing idle time and maximizing GPU utilization. This allows running full RLHF pipelines on limited hardware.
vLLM - High-Performance Inference Engine
RLHF training spends 80% of the time on sample generation. Powered by vLLM with Auto Tensor Parallelism (AutoTP) and Pipeline Parallelism (PP), OpenRLHF delivers high-throughput, memory-efficient generation.
DeepSpeed - Memory-Efficient Training
Built on DeepSpeed ZeRO-3, deepcompile, AutoTP, and RingAttention. Enables large model training without heavyweight frameworks while working directly with HuggingFace models.
Transformers - Model Interface
Native integration with HuggingFace Transformers for seamless model loading, state management, and fine-tuning of pretrained models.
NCCL / CUDA IPC - High-Speed Communication
Efficient inter-GPU communication for distributed training and inference.
On top of the Ray distributed architecture, OpenRLHF is the first RLHF framework to implement a unified agent-based paradigm. Every training run—whether standard PPO or complex multi-turn reasoning—follows a consistent agent execution pipeline.
OpenRLHF unifies generation and training through token-in-token-out agent execution, ensuring perfect consistency, easy single/multi-turn extension, and zero text-level mismatches.
┌─────────────────────────────┐
│ AgentExecutorBase │
│ (Token-in-Token-out Core) │
└─────────────────────────────┘
│
┌────────────┴────────────┐
↓ ↓
SingleTurnExecutor MultiTurnExecutor
│ │
┌──────────┴──────────┐ ┌─────────┴──────────┐
↓ ↓ ↓ ↓
Standard RLHF Custom Reward Multi-Step External Env
(One-shot gen) Function Reasoning (OpenAI Agent Server)
↓ ↓ ↓ ↓
└─────────────────────┴───────────┴────────────────┘
│
Consistent Token Trajectories
│
┌─────────┴─────────┐
│ RL Algorithms │
│ (Decoupled) │
│ │
│ PPO, REINFORCE++ │
│ GRPO, RLOO, etc. │
└───────────────────┘
| Principle | Description | Benefit |
|---|---|---|
| Token-in-Token-out | All sampling produces token-level trajectories | Zero text-level mismatch |
| Unified Interface | Same AgentExecutorBase API for all modes |
Switch modes with one flag |
| Algorithm-Agnostic | RL algorithms (PPO, REINFORCE++, etc.) are decoupled from agent executors | Any algorithm works with any mode |
| Extensible | Plug in custom rewards/environments easily | Rapid experimentation |
| Production-Ready | Sync/Async/Hybrid Engine support | From research to deployment |
The agent execution mode is independent of the RL algorithm you choose. You can use any algorithm (PPO, REINFORCE++, GRPO, etc.) with any execution mode:
| Mode | Use Cases | Interface | Complexity |
|---|---|---|---|
| Single-Turn | Standard RLHF, custom reward functions | Optional reward_func() |
⭐ Default (99% use cases) |
| Multi-Turn | Multi-step reasoning, interactive environments | reset() + step() |
⭐⭐ Advanced |
OpenRLHF implements PPO, REINFORCE++, REINFORCE++-baseline, GRPO, RLOO with advanced optimization tricks inspired by practical guides and community best practices.
Key Design: RL algorithms are decoupled from agent execution modes. All algorithms work seamlessly with both single-turn and multi-turn agent executors, running through the unified token-in-token-out pipeline for consistent behavior.
| Algorithm | --algo.advantage.estimator |
Key Feature | Best Use Case |
|---|---|---|---|
| PPO | (default) | Full critic network | Stable training, proven results |
| REINFORCE++ | reinforce |
PPO tricks without critic | Efficient training, less memory |
| REINFORCE++-baseline | reinforce_baseline |
Mean reward baseline | Reasoning tasks (RLVR), robust to reward scales |
| RLOO | rloo |
Per-token KL + PPO-clip | Multi-sample training |
| GRPO | group_norm |
Group normalization | Batch-based training |
| Dr. GRPO | dr_grpo |
Simplified GRPO | Removes local /std norm |
References: Zhihu article | Notion best practices
OpenRLHF provides a complete RLHF pipeline with agent-based flexibility:
Single-Turn Mode (Default - 99% of use cases)
--reward.remote_url)Multi-Turn Mode (Advanced - Interactive tasks)
--train.agent_func_path)examples/python/agent_func_openai_server_executor.py for an agent executor that wraps vLLM as a local OpenAI Agent Server--train.async_enable) for higher throughput: train_reinforce_baseline_ray_agent_async.sh| Method | Script | Description |
|---|---|---|
| SFT | train_sft.sh | Supervised fine-tuning with packing |
| DPO/IPO/cDPO | train_dpo_llama.sh | Direct preference optimization |
| Reward Model | train_rm.sh | Train reward models |
Efficiency Optimizations
--ds.packing_samples) for all training modes--vllm.num_engines) for fast generation--algo.dynamic_filtering_enable)
scores signal
--algo.dynamic_filtering_enable--algo.dynamic_filtering_range 0.0 1.0--rollout.n_samples_per_prompt > 1 and either --reward.remote_url or --train.agent_func_path./examples/scripts/train_dapo_ray_hybrid_engine.shScalability
--ds.tensor_parallel_size in training scripts)--ds.ring_attn_size)Model Support
--data.image_key, --data.max_images_per_prompt)--ds.lora.rank, --ds.load_in_4bit)--actor.aux_loss_coef)--ds.attn_implementation)--data.apply_chat_template)Optimizers
--{actor,critic}.optim adam --{actor,critic}.adam.lr 2e-6--{actor,critic}.optim muon --{actor,critic}.muon.lr 1e-4 --{actor,critic}.muon.momentum 0.95. Newton-Schulz produces scale-invariant updates, so disable global grad clipping with --{actor,critic}.max_norm 0 (the Adam default 1.0 would clip away the Muon update).Reward Shaping
--reward.overlong_buffer_len, --reward.overlong_penalty_factor) — soft-penalize responses that exceed max_new_tokens - overlong_buffer_len--reward.stop_properly_penalty_coef) — for samples with finish_reason='length': coef ∈ [0, 1] multiplicatively scales the reward; coef < 0 sets the reward to that fixed value (e.g. -0.5)Production Features
--logger.wandb.key) and TensorBoard (--logger.tensorboard_dir) logging--ckpt.load_enable, --ckpt.save_steps)--ckpt.best_metric_key)--eval.dataset, --eval.temperature, --eval.n_samples_per_prompt) — supported in async training--data.dataloader_num_workers, available for PPO/SFT/RM/DPO)timing/make_experience, timing/ppo_train, timing/broadcast, timing/generation, timing/step_total)Recommended: Use Docker for hassle-free setup
# 1. Launch Docker container docker run --runtime=nvidia -it --rm --shm-size="10g" --cap-add=SYS_ADMIN \ -v $PWD:/openrlhf nvcr.io/nvidia/pytorch:26.03-py3 bash # 2. Clean conflicting packages sudo pip uninstall xgboost transformer_engine flash_attn pynvml -y # 3. Install OpenRLHF (choose one) pip install openrlhf # Basic pip install openrlhf[vllm] # + vLLM 0.22.1 (recommended) pip install openrlhf[vllm_latest] # + Latest vLLM pip install openrlhf[vllm,ring,liger] # + All optimizations
Alternative: Install from source
git clone https://github.com/OpenRLHF/OpenRLHF.git cd OpenRLHF pip install -e .
Tip
We recommend vLLM 0.22.1+ for best performance. See Dockerfiles and Nvidia-Docker Install Script.
OpenRLHF provides flexible data processing methods:
Key Parameters:
--data.input_key: Specify JSON key name for input data--data.apply_chat_template: Use HuggingFace tokenizer's chat template--data.input_template: Custom template string (alternative to chat template)--data.prompt_probs / --data.dataset_probs: Mix multiple datasets (e.g., 0.1,0.4,0.5)--eval.dataset: Specify evaluation dataset pathChat Template Example:
dataset = [{"input_key": [
{"role": "user", "content": "Hello, how are you?"},
{"role": "assistant", "content": "I'm doing great. How can I help you today?"},
{"role": "user", "content": "I'd like to show off how chat templating works!"},
]}]
tokenizer.apply_chat_template(dataset[0]["input_key"], tokenize=False)
# Output: "<s>[INST] Hello, how are you? [/INST]I'm doing great...</s> [INST] I'd like to show off... [/INST]"
Note
JSON key options vary by dataset type. See Reward Dataset, SFT Dataset, and Prompt Dataset
OpenRLHF's model checkpoint is fully compatible with HuggingFace models. You can specify the model name or path using --actor.model_name_or_path {name or path}, --reward.model_name_or_path {name or path} and --critic.model_name_or_path {name or path}. We have provided some pre-trained checkpoints and datasets on HuggingFace OpenRLHF.
Then you can use the startup scripts we provide in the examples/scripts directory, or start the training using the following commands.
deepspeed --module openrlhf.cli.train_sft \
--data.max_len 4096 \
--data.dataset Open-Orca/OpenOrca \
--data.input_key question \
--data.output_key response \
--data.input_template $'User: {}\nAssistant: ' \
--train.batch_size 256 \
--train.micro_batch_size 2 \
--data.max_samples 500000 \
--actor.model_name_or_path meta-llama/Meta-Llama-3-8B \
--ckpt.output_dir ./checkpoint/llama3-8b-sft \
--ckpt.save_steps -1 \
--logger.logging_steps 1 \
--eval.steps -1 \
--ds.zero_stage 2 \
--train.max_epochs 1 \
--ds.packing_samples \
--ds.param_dtype bf16 \
--adam.lr 5e-6 \
--actor.gradient_checkpointing_enable \
--logger.wandb.key {wandb_token}
# Additional options:
# --data.apply_chat_template # Use HF tokenizer chat template
# --ds.ring_attn_size 2 # Enable RingAttention (install ring_flash_attn first)
# --data.multiturn # Multi-turn fine-tuning loss
# --actor.pretrain_mode_enable # Continued pre-training mode
deepspeed --module openrlhf.cli.train_rm \
--ckpt.output_dir ./checkpoint/llama3-8b-rm \
--ckpt.save_steps -1 \
--logger.logging_steps 1 \
--eval.steps -1 \
--train.batch_size 256 \
--train.micro_batch_size 1 \
--actor.model_name_or_path OpenRLHF/Llama-3-8b-sft-mixture \
--ds.param_dtype bf16 \
--train.max_epochs 1 \
--data.max_len 8192 \
--ds.zero_stage 3 \
--adam.lr 9e-6 \
--data.dataset OpenRLHF/preference_dataset_mixture2_and_safe_pku \
--data.apply_chat_template \
--chosen_key chosen \
--rejected_key rejected \
--ds.packing_samples \
--actor.gradient_checkpointing_enable \
--logger.wandb.key {wandb_token}
It is recommended to set the --value_prefix_head option of the Reward Model to score, so that we can load the model using AutoModelForSequenceClassification:
reward_model = AutoModelForSequenceClassification.from_pretrained(
reward_model_path,
num_labels=1,
torch_dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
use_cache=False,
)
inputs = xxxx (Left Padding Input Tokens)
reward = reward_model.model(*inputs).last_hidden_state
reward = reward_model.score(reward)[:, -1]
All RL training in OpenRLHF runs through the agent execution pipeline. The following example shows single-turn agent execution (default mode) with Hybrid Engine for optimal performance:
# launch the master node of ray in container
ray start --head --node-ip-address 0.0.0.0 --num-gpus 8
# if you want to launch ray on more nodes, use
ray start --address {MASTER-NODE-ADDRESS}:6379 --num-gpus 8
ray job submit --address="http://127.0.0.1:8265" \
--runtime-env-json='{"working_dir": "/openrlhf"}' \
-- python3 -m openrlhf.cli.train_ppo_ray \
--ref.num_nodes 1 \
--ref.num_gpus_per_node 8 \
--reward.num_nodes 1 \
--reward.num_gpus_per_node 8 \
--critic.num_nodes 1 \
--critic.num_gpus_per_node 8 \
--actor.num_nodes 1 \
--actor.num_gpus_per_node 8 \
--vllm.num_engines 4 \
--vllm.tensor_parallel_size 2 \
--train.colocate_all \
--vllm.gpu_memory_utilization 0.5 \
--actor.model_name_or_path OpenRLHF/Llama-3-8b-sft-mixture \
--reward.model_name_or_path OpenRLHF/Llama-3-8b-rm-700k \
--ckpt.output_dir /openrlhf/examples/test_scripts/final/llama3-8b-rlhf \
--ckpt.path /openrlhf/examples/test_scripts/ckpt/llama3-8b-rlhf \
--ckpt.save_hf \
--train.batch_size 128 \
--rollout.batch_size 1024 \
--train.dynamic_batch_enable \
--rollout.n_samples_per_prompt 1 \
--train.max_epochs 1 \
--prompt_max_len 1024 \
--data.max_samples 100000 \
--generate_max_len 1024 \
--ds.zero_stage 3 \
--ds.param_dtype bf16 \
--actor.adam.lr 5e-7 \
--critic.adam.lr 9e-6 \
--algo.kl.init_coef 0.01 \
--data.prompt_dataset OpenRLHF/prompt-collection-v0.1 \
--data.input_key context_messages \
--data.apply_chat_template \
--reward.normalize_enable \
--actor.gradient_checkpointing_enable \
--ds.packing_samples \
--vllm.sync_backend nccl \
--vllm.enforce_eager \
--vllm.enable_sleep \
--ds.enable_sleep \
--logger.wandb.key {wandb_token}
# Algorithm Variants (all use single-turn agent execution):
# --algo.advantage.estimator reinforce # REINFORCE++
# --algo.advantage.estimator rloo # RLOO
# --algo.advantage.estimator reinforce_baseline # REINFORCE++-baseline (best for RLVR)
# --algo.advantage.estimator group_norm # GRPO
# --algo.advantage.estimator dr_grpo # Dr. GRPO
# Advanced Options:
# --algo.kl.init_coef 0 # No reference model
# --reward.remote_url http://host:5000/get_reward # HTTP reward model
# --rollout.n_samples_per_prompt 4 # Multiple samples per prompt
# --rollout.vllm_generate_batch_size 2048 # Oversample at generation (> rollout_batch_size); requires --train.async_enable
# --algo.advantage.is_correction_enable # vLLM importance sampling correction for off-policy rollouts
# --algo.advantage.is_correction_type tis # Correction type: tis (token clamp) | icepop (token filter) | seq-mask-tis (seq-level geom mean)
# --algo.advantage.is_correction_threshold 0.5 5.0 # IS truncation interval: [low, high]
# --ckpt.best_metric_key eval_default_pass1 # Save best checkpoint by eval metric (empty = auto-detect first pass1, 'none' = disable)
# --actor.policy_loss_type gspo # Use GSPO policy loss variant (vs default 'ppo')
Tip
For reasoning tasks (RLVR): Use --algo.advantage.estimator reinforce_baseline for REINFORCE++-baseline—it's robust to different reward scales.
Note
Ray Environment Setup: Let Ray auto-deploy with --runtime-env-json='{"setup_commands": ["pip install openrlhf[vllm]"]}'
Note
Troubleshooting GPU index errors: Set export RAY_EXPERIMENTAL_NOSET_CUDA_VISIBLE_DEVICES=1 if you encounter DeepSpeed GPU device setup issues.
📚 More Examples: See examples/scripts and Documentation
The single-turn agent execution (default mode) supports custom reward functions—perfect for reinforced fine-tuning without a trained reward model. Instead of using a pre-trained reward model, you provide a Python function that computes rewards on-the-fly.
Ideal for:
# reward_func.py
import torch
def reward_func(queries, prompts, labels):
"""
Compute custom rewards for generated responses.
Args:
queries: List[str] - Full text (prompt + response)
prompts: List[str] - Original prompts only
labels: List[str] - Ground truth labels (from --label_key)
Returns:
dict with:
- rewards: Tensor for advantage calculation
- scores: Tensor for dynamic filtering (0-1 range)
- extra_logs: Dict for wandb logging
"""
batch_size = len(queries)
# Example: Random rewards (replace with your logic)
# Real examples: code execution, math verification, format checking
reward = torch.randint(0, 2, (batch_size,)).float()
return {
"rewards": reward, # Used in RL advantage calculation
"scores": reward, # Used for dynamic filtering (--dynamic_filtering)
"extra_logs": { # Logged to wandb
"custom_metric": reward.mean().item(),
},
}
ray job submit --address="http://127.0.0.1:8265" \
--runtime-env-json='{"working_dir": "/openrlhf"}' \
-- python3 -m openrlhf.cli.train_ppo_ray \
--actor.model_name_or_path meta-llama/Meta-Llama-3-8B \
--train.dynamic_batch_enable \
--reward.remote_url /path/to/reward_func.py \
--data.label_key answer \
--data.prompt_dataset your_prompt_dataset \
... # other training args
Key Parameter: --data.label_key answer passes the "answer" field from your dataset to reward_func as labels.
Tip
Use Cases: Code generation (execute tests), Math (verify solutions), Formatting (check structure), Multi-objective (combine multiple signals)
📖 Full Example: examples/scripts/train_ppo_with_reward_fn.sh
For tasks requiring multi-step interactions (reasoning chains, coding with feedback, game playing), OpenRLHF provides the Multi-Turn Agent Execution mode.
Implement AgentInstanceBase with reset/step methods:
# agent_func.py
import random
from typing import Any, Dict
import torch
from openrlhf.utils.agent import AgentInstanceBase, MultiTurnAgentExecutor
# A simple n-step random environment
class AgentInstance(AgentInstanceBase):
async def __init__(self, *args, **kwargs):
self.step_idx = 0
self.max_steps = random.randint(1, 3) # 1-3 steps
async def reset(self, states: dict, **kwargs):
return {"observation": states["observation"]} # Return original text observation
async def step(self, states: dict, **kwargs) -> Dict[str, Any]:
print(f"step_idx: {self.step_idx}, max_steps: {self.max_steps}")
observation_text = states["observation_text"]
action_text = states["action_text"]
label = states["label"]
# Check if episode is done
done = self.step_idx >= self.max_steps
reward = torch.randint(0, 2, (1,)).float() if done else torch.tensor(0)
# Generate environment feedback based on whether episode is done
environment_feedback = (
"\n\nHuman: [CORRECT]\n</s>"
if done
else "\n\nHuman: [INCORRECT]\nPlease analyze the issues and try again.\n</s>\n\nAssistant: "
)
self.step_idx += 1
return {
"rewards": reward, # Rewards for advantage calculation
"scores": reward, # Scores for dynamic filtering (0-1 reward)
"environment_feedback": environment_feedback, # Environment feedback text
"done": done, # Boolean indicating if the episode is complete
"sampling_params": states.get("sampling_params", None), # Parameters for vLLM sampling in next step
"extra_logs": {"dummy_scores": reward}, # Additional logging information
}
class AgentExecutor(MultiTurnAgentExecutor):
def __init__(self):
super().__init__(AgentInstance)
Then launch with:
ray job submit --address="http://127.0.0.1:8265" \
--runtime-env-json='{"working_dir": "/openrlhf"}' \
-- python3 -m openrlhf.cli.train_ppo_ray \
...
--train.dynamic_batch_enable \
--train.agent_func_path /path/to/agent_func.py \
--train.async_enable # Optional: enable async pipeline
Async Pipeline (for higher throughput):
--train.async_enable--train.async_queue_size 1 (larger = more off-policy, default 1)--train.partial_rollout_enable — uses vLLM pause/resume for weight sync instead of locking, allowing generation to overlap with training. In-flight samples may contain tokens from both old and new weights.Training Modes:
--train.colocate_all (remove --train.async_enable)Note
For fully custom token-level execution, inherit AgentExecutorBase and implement execute(). This design enforces the token-in-token-out principle to keep sampling and training consistent.
Warning
Asynchronous training may affect training stability. Use it only when throughput is critical and convergence is validated.
📚 Examples:
For multi-turn agents that need an OpenAI-compatible chat API (e.g., integrating external tool-use frameworks), agent_func_openai_server_executor.py wraps vLLM as a local /v1/chat/completions server while collecting token-level traces for RL training.
/v1/chat/completions, /v1/models, /tokenize)run_agent() to plug in your own multi-turn workflowpython3 -m openrlhf.cli.train_ppo_ray \ --train.agent_func_path examples/python/agent_func_openai_server_executor.py \ ... # other training args
When using LoRA/QLoRA, OpenRLHF saves only the adapter weights. To deploy or continue training, merge the adapter with the base model:
python -m openrlhf.cli.lora_combiner \
--model_path meta-llama/Meta-Llama-3-8B \
--lora_path ./checkpoint/llama3-8b-rm \
--output_path ./checkpoint/llama-3-8b-rm-combined \
--is_rm \
--ds.param_dtype bf16
Optimize OpenRLHF for your hardware and workload with these recommendations:
Pick the execution mode based on your priority — OpenRLHF gives you a clear tradeoff knob:
| Mode | Flags | Characteristics | When to Use |
|---|---|---|---|
| Hybrid Engine (colocated) | --train.colocate_all--vllm.enable_sleep--ds.enable_sleep |
Most stable — strictly on-policy, every rollout uses the latest weights. Serial generate→train cycle. | Research, sensitive RL algorithms, reproducibility, recipe validation |
| Async Training | --train.async_enable--train.async_queue_size N |
Highest throughput — generation and training run in parallel. Tune off-policyness via --train.async_queue_size (larger = more off-policy). |
Production throughput when convergence is already validated |
| Async + Partial Rollout | --train.async_enable--train.partial_rollout_enable |
Maximum overlap — vLLM pause/resume instead of locking, in-flight samples may mix old/new weights. Most aggressive off-policy. | Pushing async throughput further; pair with --algo.advantage.is_correction_enable |
| Optimization | Flag | When to Use |
|---|---|---|
| Sample Packing | --ds.packing_samples |
Always (especially training) |
| Dynamic Batch | --train.dynamic_batch_enable |
Variable sequence lengths |
| DeepCompile | --ds.deepcompile |
PyTorch 2.0+ |
| Overlap Comm | --ds.overlap_comm |
Sufficient GPU memory |
| Prefix Caching | vLLM config | n_samples_per_prompt > 1 |
| Oversampling | --rollout.vllm_generate_batch_size > --rollout.batch_size |
Async mode, to amortize generation cost / feed dynamic filtering |
When you have enough memory:
--ds.adam_offload--ds.overlap_comm--train.colocate_critic_reward and --train.colocate_actor_refWhen hitting OOM:
--colocate_* options--rollout.micro_batch_size, minimize vLLM TP size--train.micro_batch_size, enable --ds.packing_samples--vllm.sync_backend ncclTip
Quick Start Template: For 8x A100 (80GB), try Hybrid Engine + --vllm.gpu_memory_utilization 0.5 + --train.colocate_all
📖 More Details: Performance Tuning Documentation
How to Join?
What can you do?
Your sponsorship can help us maintain and improve OpenRLHF. If you find this project useful, please consider sponsoring us. You can sponsor us on Open Collective ↗.
A big thank you to all our contributors! If you want to contribute, feel free to make a pull request or create an issue.
We would like to express our gratitude to the following projects and organizations for their contributions to the field of AI and NLP:
Our project would also like to thank ColossalChat and DeepSpeedChat. In the early stages of the project, we referred to their code design. Our project would like to thank Netmind.AI for the GPU support of developing ring attention.
(2024/7) Our GitHub organization has changed from OpenLLMAI to OpenRLHF.
OpenRLHF
@article{hu2024openrlhf,
title={OpenRLHF: An Easy-to-use, Scalable and High-performance RLHF Framework},
author={Jian Hu and Xibin Wu and Zilin Zhu and Xianyu and Weixun Wang and Dehao Zhang and Yu Cao},
journal={arXiv preprint arXiv:2405.11143},
year={2024}
}
REINFORCE++-baseline
@article{hu2026reinforce++,
title={Reinforce++: A simple and efficient approach for aligning large language models},
author={Hu, Jian},
journal={arXiv preprint arXiv:2501.03262},
year={2026}
}
OpenRLHF © 2026 OpenRLHF. All Rights Reserved.
more like this
SCYTHE is a lightweight, C#-based game engine focused on modifiability and rapid iteration using Raylib.
.Net 10 (.Net 8+) webassembly starter project using raylib-cs nuget 7.0.2 and raylib 5.5
search projects, people, and tags