Skip to content

Commit 9acedbb

Browse files
refactor: hoist Arctic RL integration to top-level arctic_training/ folder
Per Charlie's feedback on the public SkyRL PR — the integration code (two subclasses + an entrypoint) doesn't belong inside skyrl/ core, where the SkyRL maintainers would have to keep it building. The legacy skyrl-tx/ folder pattern (top-level sibling of skyrl/, no maintenance from upstream core) is the right precedent. Move: skyrl/backends/arctic_rl/__init__.py → arctic_training/arctic_rl_integration/__init__.py skyrl/backends/arctic_rl/arctic_trainer.py → arctic_training/arctic_rl_integration/trainer.py skyrl/backends/arctic_rl/arctic_generator.py → arctic_training/arctic_rl_integration/generator.py skyrl/backends/arctic_rl/config.py → arctic_training/arctic_rl_integration/config.py skyrl/train/entrypoints/main_arctic_rl.py → arctic_training/arctic_rl_integration/entrypoint.py The folder name `arctic_training/` matches Charlie's request (sibling of `skyrl/`, like the legacy `skyrl-tx/`). The Python module name inside is `arctic_rl_integration` — intentionally distinct from the upstream `arctic_training` PyPI package (the DSS server library) so they can coexist at import time. SkyRL's main_base.py routing becomes a 5-line shim: if cfg.trainer.arctic_rl is not None: from arctic_rl_integration.entrypoint import main as arctic_rl_main arctic_rl_main() return pyproject.toml gains a `where = [".", "arctic_training"]` and includes `arctic_rl_integration*` so setuptools picks up the new package directory. The ArcticRLTrainerConfig dataclass (the trainer.arctic_rl.* schema) stays in skyrl/train/config/config.py — it's a pure schema, no behavior, near- zero maintenance burden. Validated on dev pod (kganesan-dev-h200-0-qsxhj, 8x H200): zero-env 1x4 colocated GSM8K, 3 stable steps, rewards 0.19 -> 0.25, step time ~19s. Matches prior baseline. Import smoke confirms arctic_rl_integration and upstream arctic_training (DSS) coexist without collision. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 29de7a9 commit 9acedbb

8 files changed

Lines changed: 49 additions & 35 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Arctic RL backend for SkyRL.
2+
3+
Provides ``ArcticPPOTrainer`` and ``ArcticGenerator`` that route all GPU
4+
work to an Arctic RL server, allowing any SkyRL recipe to switch backends
5+
by setting ``trainer.arctic_rl={}`` (and ``colocate_all: false``).
6+
7+
Install::
8+
9+
uv sync --extra arctic-rl
10+
11+
Usage in a recipe::
12+
13+
from arctic_rl_integration import ArcticPPOTrainer, ArcticGenerator
14+
15+
The folder on disk is ``arctic_training/arctic_rl_integration/`` — Charlie
16+
asked for the integration code to sit at a top-level ``arctic_training/``
17+
sibling of ``skyrl/`` (matching the legacy ``skyrl-tx/`` placement). The
18+
inner module name ``arctic_rl_integration`` is intentionally distinct from
19+
the upstream ``arctic_training`` Python package (the DSS server library),
20+
which we depend on via pip — keeping the two namespaces separate avoids a
21+
collision at import time.
22+
23+
Dependencies:
24+
arctic_training — pip package providing ArcticRLClient/Server
25+
"""
26+
27+
from arctic_rl_integration.trainer import ArcticPPOTrainer
28+
from arctic_rl_integration.generator import ArcticGenerator
29+
30+
__all__ = ["ArcticPPOTrainer", "ArcticGenerator"]
File renamed without changes.

skyrl/train/entrypoints/main_arctic_rl.py renamed to arctic_training/arctic_rl_integration/entrypoint.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,9 @@
88
ARL-specific settings live under ``trainer.arctic_rl`` (see
99
``ArcticRLTrainerConfig``).
1010
11-
Usage (colocated, 4 GPUs):
12-
python -m skyrl.train.entrypoints.main_arctic_rl \\
13-
trainer.arctic_rl.colocate=true \\
14-
trainer.placement.policy_num_gpus_per_node=4 \\
15-
generator.inference_engine.num_engines=4 \\
16-
generator.inference_engine.gpu_memory_utilization=0.3 \\
17-
trainer.policy.model.path=Qwen/Qwen3-0.6B
11+
This entrypoint is invoked indirectly by ``skyrl.train.entrypoints.main_base``
12+
when ``trainer.arctic_rl is not None``. Researchers should use the standard
13+
``main_base`` entrypoint and switch backends via config alone.
1814
"""
1915

2016
import os
@@ -30,8 +26,8 @@
3026
from skyrl.train.entrypoints.main_base import BasePPOExp
3127
from skyrl.train.utils import validate_cfg
3228

33-
from skyrl.backends.arctic_rl import ArcticGenerator, ArcticPPOTrainer
34-
from skyrl.backends.arctic_rl.config import build_rl_config
29+
from arctic_rl_integration import ArcticGenerator, ArcticPPOTrainer
30+
from arctic_rl_integration.config import build_rl_config
3531

3632

3733
class ArcticRLExp(BasePPOExp):
@@ -90,7 +86,7 @@ def _setup_trainer(self):
9086
os.makedirs(self.cfg.trainer.export_path, exist_ok=True)
9187
os.makedirs(self.cfg.trainer.ckpt_path, exist_ok=True)
9288

93-
from skyrl.backends.arctic_rl.arctic_trainer import _ArcticInferenceEngineStub
89+
from arctic_rl_integration.trainer import _ArcticInferenceEngineStub
9490
ie_stub = _ArcticInferenceEngineStub(client=self.arctic_client)
9591

9692
tracker = self.get_tracker()
File renamed without changes.
File renamed without changes.

‎pyproject.toml‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@
22
requires = ["setuptools"]
33
build-backend = "setuptools.build_meta"
44

5+
# ``skyrl/`` is the upstream package. ``arctic_training/`` is a top-level
6+
# folder hosting the Arctic RL integration as the ``arctic_rl_integration``
7+
# Python package — folder name matches Charlie's request (sibling of
8+
# ``skyrl/``, like the legacy ``skyrl-tx/``); module name is intentionally
9+
# distinct from the upstream PyPI package ``arctic_training`` to avoid an
10+
# import-time collision.
511
[tool.setuptools.packages.find]
6-
include = ["skyrl*"]
12+
where = [".", "arctic_training"]
13+
include = ["skyrl*", "arctic_rl_integration*"]
714

815
[project]
916
name = "skyrl"

‎skyrl/backends/arctic_rl/__init__.py‎

Lines changed: 0 additions & 22 deletions
This file was deleted.

‎skyrl/train/entrypoints/main_base.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,12 @@ def main() -> None:
478478

479479
# Route to Arctic RL entrypoint if arctic_rl backend is configured.
480480
# This allows users to switch backends via config alone without changing
481-
# the entrypoint command.
481+
# the entrypoint command. The integration code lives in a top-level
482+
# ``arctic_training/`` folder (sibling of ``skyrl/``); the importable
483+
# module name is ``arctic_rl_integration`` to avoid colliding with the
484+
# upstream ``arctic_training`` package on PyPI.
482485
if cfg.trainer.arctic_rl is not None:
483-
from skyrl.train.entrypoints.main_arctic_rl import main as arctic_rl_main
486+
from arctic_rl_integration.entrypoint import main as arctic_rl_main
484487
arctic_rl_main()
485488
return
486489

0 commit comments

Comments
 (0)