AsyncTensorRLHF / src /rollout /rollout_worker.py
tahamajs's picture
Initial release of AsyncTensorRLHF: High-Throughput Asynchronous RLHF with Tensor-Native Rewards
e791b16 verified
Raw History Blame Contribute Delete
2.19 kB
# Ray actor / standalone worker for rollout workers
"""RolloutWorker pulls prompts from a shared PromptQueue, generates responses
asynchronously using AsyncEngine, and writes experiences to a ReplayBuffer.
"""
from typing import Any, List, Optional
try:
import ray
ray_remote = ray.remote(num_gpus=1)
except ImportError:
ray = None
def ray_remote(cls):
return cls
from .async_engine import AsyncEngine
from .version_manager import VersionManager
@ray_remote
class RolloutWorker:
def __init__(
self,
model_path: Optional[str] = None,
prompt_queue: Optional[Any] = None,
replay_buffer: Optional[Any] = None,
buffer: Optional[Any] = None,
version_manager: Optional[VersionManager] = None,
engine: Optional[Any] = None,
**engine_kwargs,
):
self.prompt_queue = prompt_queue
self.replay_buffer = replay_buffer if replay_buffer is not None else buffer
self.version_manager = version_manager or VersionManager()
self.engine = AsyncEngine(
model_path=model_path,
buffer=self.replay_buffer,
version_manager=self.version_manager,
engine=engine,
**engine_kwargs,
)
async def step(self, prompts: List[dict]):
"""Run rollout on an explicit list of prompts."""
await self.engine.rollout(prompts)
async def run(self, batch_size: int = 8):
"""Continuously fetch prompts and perform rollout."""
while True:
prompts: List[dict] = []
for _ in range(batch_size):
if self.prompt_queue is not None:
if hasattr(self.prompt_queue, "get_prompt"):
if hasattr(self.prompt_queue.get_prompt, "remote"):
prompt = await self.prompt_queue.get_prompt.remote()
else:
prompt = await self.prompt_queue.get_prompt()
else:
prompt = await self.prompt_queue.get()
prompts.append(prompt)
if prompts:
await self.engine.rollout(prompts)