import asynciofrom datetime import timedeltaimport flytefrom flyte.io import File vllm_image = flyte.Image.from_debian_base().with_pip_packages("vllm", "unionai-reuse>=0.1.10")torch_image = flyte.Image.from_debian_base().with_pip_packages("torch") rollout_env = flyte.TaskEnvironment( name="rollouts", image=vllm_image, resources=flyte.Resources(gpu="L4:1", memory="32Gi"), reusable=flyte.ReusePolicy(replicas=4, concurrency=1, scaledown_ttl=timedelta(minutes=10)),)learner_env = flyte.TaskEnvironment( name="learner", image=torch_image, resources=flyte.Resources(gpu="H100:8", memory="320Gi"),)env = flyte.TaskEnvironment(name="rl-loop", depends_on=[rollout_env, learner_env]) @rollout_env.task(retries=3)async def rollout(policy: File, prompt: str) -> dict: ... @learner_env.taskasync def update(policy: File, batch: list[dict]) -> tuple[File, float]: ... @env.taskasync def rl_loop(policy: File, prompts: list[str], target: float) -> File: while True: batch = await asyncio.gather(*[rollout(policy, p) for p in prompts]) try: policy, reward = await update(policy, batch) except flyte.errors.OOMError: policy, reward = await update.override( resources=flyte.Resources(gpu="H100:8", memory="640Gi"))(policy, batch) if reward >= target: return policy
Trimmed for the page: task bodies are elided.