From 665fd9e8d56e37a78c7adf03eda05a21a6c80662 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 31 Jul 2026 00:07:45 -0700 Subject: [PATCH 01/34] build(automodel): switch Automodel submodule to r0.6.0 and relock Point 3rdparty/Automodel-workspace/Automodel at the r0.6.0 release branch (24b47e85 -> 7e9493d7) and track that branch in .gitmodules. pyproject.toml changes required by the bump: - Automodel r0.6.0 pins transformers==5.12.1, so the base range ceiling moves from <5.9.0 to <5.13.0 and the automodel extra mirrors the exact pin. - r0.6.0 resolves megatron-fsdp from a Megatron-LM fork via its own [tool.uv.sources] instead of PyPI. uv requires such URL deps to also appear as a direct requirement or constraint of the root project, so mirror the URL/rev in constraint-dependencies next to emerging-optimizers. Relocked with uv 0.11.18 (matching docker/Dockerfile's UV_VERSION). Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: larkzhang-nv --- .gitmodules | 2 +- 3rdparty/Automodel-workspace/Automodel | 2 +- pyproject.toml | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 66c4435fe6b..8efea66a2a4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ [submodule "3rdparty/Automodel-workspace/Automodel"] path = 3rdparty/Automodel-workspace/Automodel url = https://github.com/NVIDIA-NeMo/Automodel.git - branch = main + branch = r0.6.0 shallow = true [submodule "3rdparty/Gym-workspace/Gym"] path = 3rdparty/Gym-workspace/Gym diff --git a/3rdparty/Automodel-workspace/Automodel b/3rdparty/Automodel-workspace/Automodel index 24b47e85626..7e9493d7dde 160000 --- a/3rdparty/Automodel-workspace/Automodel +++ b/3rdparty/Automodel-workspace/Automodel @@ -1 +1 @@ -Subproject commit 24b47e856263d313b942f0ed666c63fff83306b4 +Subproject commit 7e9493d7dde987cc753caf10737ef785e71f3d8c diff --git a/pyproject.toml b/pyproject.toml index 2ff79bc80f6..ef8f0668cc1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,7 @@ dependencies = [ # Run tools/install_audio_deps.sh before using audio features or audio tests. # Keep the base range broad enough while allowing backend extras to tighten as needed. # Floor raised to 5.5.0 for Gemma 4 support. + # Ceiling raised to <5.13.0 for Automodel r0.6.0, which pins transformers==5.12.1. "transformers>=5.5.0,<5.13.0", "num2words>=0.5.14", # for SmolVLM "timm", @@ -131,7 +132,8 @@ automodel = [ "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl ; sys_platform == 'linux' and platform_machine == 'aarch64'", "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl ; sys_platform == 'linux' and platform_machine == 'x86_64'", "flash-attn==2.8.1 ; sys_platform != 'linux' or (platform_machine != 'aarch64' and platform_machine != 'x86_64')", - "transformers==5.5.0", + # Mirrors nemo-automodel's own `transformers==5.12.1` pin (Automodel r0.6.0). + "transformers>=5.12.1,<5.13.0", "tilelang==0.1.9; sys_platform == 'linux' and platform_machine == 'x86_64'", "mistral-common>=1.11.0", "mamba-ssm", @@ -447,6 +449,10 @@ constraint-dependencies = [ # Megatron-LM's [tool.uv.sources] (uv errors loudly on mismatch after a submodule bump). "emerging-optimizers @ git+https://github.com/NVIDIA-NeMo/Emerging-Optimizers.git@v0.2.0", "fast-hadamard-transform @ git+https://github.com/Dao-AILab/fast-hadamard-transform.git@f134af63deb2df17e1171a9ec1ea4a7d8604d5ca", + # Same story for megatron-fsdp, which nemo-automodel (r0.6.0) resolves from a + # Megatron-LM fork via its own [tool.uv.sources] instead of PyPI. Keep this URL/rev + # in sync with 3rdparty/Automodel-workspace/Automodel/pyproject.toml. + "megatron-fsdp @ git+https://github.com/yuhezhang-ai/Megatron-LM.git@455389c480af6b3acdca74c7830c68b3274eb083#subdirectory=megatron/core/distributed/fsdp/src", # megatron-energon pulls s3fs; without a floor uv picks the 2020-era s3fs 0.4.2 # (which needs only plain botocore) instead of a modern aiobotocore-based release. "s3fs>=2024.6.0", From 5778085b9b5a8a2d6a1929271f2b52f75a494148 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 31 Jul 2026 00:07:55 -0700 Subject: [PATCH 02/34] refactor(automodel): follow modules relocated in Automodel r0.6.0 Two import paths moved upstream; the symbols and signatures are unchanged: - nemo_automodel.components.distributed.cp_utils -> nemo_automodel.components.distributed.context_parallel.utils (create_context_parallel_ctx / get_train_context) - nemo_automodel.components.moe.utils.BackendConfig -> nemo_automodel.components.models.common.utils.BackendConfig The BackendConfig path already matches the _target_ used by the vlm_grpo-nemotron-omni recipe YAMLs. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: larkzhang-nv --- nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py | 4 ++-- nemo_rl/models/value/workers/dtensor_value_worker_v2.py | 4 ++-- tests/unit/models/policy/test_automodel_types.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py index 9f38da334ae..5f94fac1e31 100644 --- a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py +++ b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py @@ -21,10 +21,10 @@ import ray import torch from nemo_automodel.components._peft.lora import LinearLoRA -from nemo_automodel.components.distributed.cp_utils import ( +from nemo_automodel.components.distributed.context_parallel.utils import ( create_context_parallel_ctx, ) -from nemo_automodel.components.distributed.cp_utils import ( +from nemo_automodel.components.distributed.context_parallel.utils import ( get_train_context as get_train_context_automodel, ) from nemo_automodel.components.distributed.tensor_utils import ( diff --git a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py index 0ad1b4fedf7..ff0ac7d6a26 100644 --- a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py +++ b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py @@ -20,10 +20,10 @@ import ray import torch -from nemo_automodel.components.distributed.cp_utils import ( +from nemo_automodel.components.distributed.context_parallel.utils import ( create_context_parallel_ctx, ) -from nemo_automodel.components.distributed.cp_utils import ( +from nemo_automodel.components.distributed.context_parallel.utils import ( get_train_context as get_train_context_automodel, ) from nemo_automodel.components.training.utils import scale_grads_and_clip_grad_norm diff --git a/tests/unit/models/policy/test_automodel_types.py b/tests/unit/models/policy/test_automodel_types.py index 1eaff3534e3..eb1ca603e14 100644 --- a/tests/unit/models/policy/test_automodel_types.py +++ b/tests/unit/models/policy/test_automodel_types.py @@ -18,7 +18,7 @@ # Check if nemo_automodel is available for tests that need it try: - from nemo_automodel.components.moe.utils import BackendConfig # noqa: F401 + from nemo_automodel.components.models.common.utils import BackendConfig # noqa: F401 NEMO_AUTOMODEL_AVAILABLE = True except ImportError: From 74b9a218310345fea252a534f0090be6ba1960c4 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 31 Jul 2026 00:08:08 -0700 Subject: [PATCH 03/34] fix(automodel): migrate setup.py to the r0.6.0 distributed API Automodel r0.6.0 reshaped the distributed entry points, and each of these raises at runtime rather than degrading: - create_device_mesh() was removed. Build the meshes through the public MeshContext.build(strategy_config, ParallelismSizes(...), world_size=...) and unpack .device_mesh / .moe_mesh. - FSDP2Config.backend was dropped, so FSDP2Config(backend="nccl") raises TypeError (it is a strict dataclass). The r0.6.0 mesh helpers no longer take a backend and default to nccl. - from_pretrained now calls _reject_separate_distributed_kwargs() and raises TypeError for moe_mesh / distributed_config / moe_config / activation_checkpointing / pipeline_config / tp_plan. Bundle them into a single DistributedSetup instead. pipeline_config=None: PP is unused here. - MoEParallelizerConfig moved from components.moe.config to components.distributed.config. Two workarounds in this module are obsolete under r0.6.0 and are removed along with their tripwire tests: - The local NeMoAutoModelForTokenClassification backport shim. r0.6.0 exports the class, and the shim's own else-branch raised RuntimeError once it did (NVIDIA-NeMo/RL#2948). - _disable_automodel_checkpoint_dtype_restore(). r0.6.0 includes Automodel PR #2419: _restore_loaded_model_dtype now takes requested_dtype and restores each floating tensor to the wider of (checkpoint dtype, requested dtype), so the explicit fp32 master-weight load is honored. Keeping the no-op monkeypatch would suppress that fix. The unit tests patch FSDP2Config and from_pretrained, so they could not catch the two TypeErrors; their assertions are updated to pin the new call shape instead. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: larkzhang-nv --- nemo_rl/models/automodel/setup.py | 119 ++++---------- .../models/automodel/test_automodel_setup.py | 155 +++++++----------- 2 files changed, 87 insertions(+), 187 deletions(-) diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index 1fb4db4329f..5c12ae2b0c8 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -22,40 +22,21 @@ import torch from hydra.utils import get_class -from nemo_automodel import NeMoAutoModelForSequenceClassification - -try: - from nemo_automodel import NeMoAutoModelForTokenClassification -except ImportError: - # Local backport until the pinned Automodel submodule exports - # NeMoAutoModelForTokenClassification. The tripwire test in - # tests/unit/models/automodel/test_automodel_setup.py should fail once this - # shim is no longer needed. - # Tracked at https://github.com/NVIDIA-NeMo/RL/issues/2948. - from nemo_automodel._transformers.auto_model import _BaseNeMoAutoModelClass - from transformers import AutoModelForTokenClassification - - class NeMoAutoModelForTokenClassification( - _BaseNeMoAutoModelClass, AutoModelForTokenClassification - ): - """Backport shim - see surrounding comment.""" - - pass -else: - raise RuntimeError( - "Automodel now exports NeMoAutoModelForTokenClassification; remove the " - "local backport shim in nemo_rl.models.automodel.setup." - ) - - +from nemo_automodel import ( + NeMoAutoModelForSequenceClassification, + NeMoAutoModelForTokenClassification, +) from nemo_automodel._transformers.auto_tokenizer import NeMoAutoTokenizer from nemo_automodel._transformers.registry import ModelRegistry from nemo_automodel.components._peft.lora import PeftConfig from nemo_automodel.components.config.loader import _resolve_target -from nemo_automodel.components.distributed.config import FSDP2Config -from nemo_automodel.components.distributed.mesh_utils import create_device_mesh +from nemo_automodel.components.distributed.config import ( + DistributedSetup, + FSDP2Config, + MoEParallelizerConfig, +) +from nemo_automodel.components.distributed.mesh import MeshContext, ParallelismSizes from nemo_automodel.components.distributed.tensor_utils import get_cpu_state_dict -from nemo_automodel.components.moe.config import MoEParallelizerConfig from torch.distributed.fsdp import CPUOffloadPolicy, MixedPrecisionPolicy from transformers import ( AutoConfig, @@ -502,7 +483,6 @@ def setup_distributed( offload_policy=CPUOffloadPolicy(pin_memory=False) if cpu_offload else None, activation_checkpointing=config["dtensor_cfg"]["activation_checkpointing"], defer_fsdp_grad_sync=config["dtensor_cfg"].get("defer_fsdp_grad_sync", True), - backend="nccl", ) # Create MoEParallelizerConfig from nested moe_parallelizer options @@ -517,15 +497,18 @@ def setup_distributed( ) # Create device meshes (dp_size is derived from world_size / (tp * cp * ep)) - device_mesh, moe_mesh = create_device_mesh( + mesh_context = MeshContext.build( fsdp2_config, - dp_replicate_size=dp_replicate_size, - tp_size=tp_size, - pp_size=1, - cp_size=cp_size, - ep_size=ep_size, + ParallelismSizes( + dp_replicate_size=dp_replicate_size, + tp_size=tp_size, + pp_size=1, + cp_size=cp_size, + ep_size=ep_size, + ), world_size=world_size, ) + device_mesh, moe_mesh = mesh_context.device_mesh, mesh_context.moe_mesh # Derive sizes from mesh resolved_dp_size = device_mesh["dp"].size() @@ -543,49 +526,6 @@ def setup_distributed( ) -# AUTOMODEL-WORKAROUND(restore-dtype): TEMPORARY. Remove when the automodel pin includes -# NVIDIA-NeMo/Automodel PR #2419 (rewrites _restore_loaded_model_dtype to honor an explicit -# torch_dtype via promote_types). Currently pinned at automodel 6de0c361 (pre-#2419). -def _disable_automodel_checkpoint_dtype_restore() -> None: - """No-op Automodel's ``_restore_loaded_model_dtype`` on the HF/force_hf load path. - - NeMo-RL loads policy models with ``torch_dtype=float32`` to keep fp32 master weights - for the optimizer. Automodel's ``_restore_loaded_model_dtype`` (added after automodel - ``92635e74``) re-casts each loaded parameter back to the bf16 checkpoint dtype, silently - downgrading the master weights so AdamW updates underflow and the model fails to learn - (e.g. grpo-nano-v2-12b reward stuck ~0.18). Disable it so the requested fp32 load is - honored. Tracked by NVIDIA-NeMo/Automodel#2419; remove once the automodel pin includes it. - See ``test_automodel_dtype_restore_workaround_still_needed`` for the removal tripwire. - """ - from nemo_automodel._transformers import model_init as _model_init - - # Removal tripwire: if Automodel drops/renames this symbol (the likely shape of the - # upstream fix), the workaround is obsolete -> warn loudly and self-deactivate. - restore = getattr(_model_init, "_restore_loaded_model_dtype", None) - if restore is None: - import warnings - - warnings.warn( - "Automodel no longer defines _restore_loaded_model_dtype; NeMo-RL's fp32 " - "master-weight workaround is obsolete - remove " - "_disable_automodel_checkpoint_dtype_restore() in setup.py.", - stacklevel=2, - ) - return - if getattr(restore, "_nrl_disabled", False): - return - - def _noop(*args, **kwargs) -> None: # pragma: no cover - return None - - _noop._nrl_disabled = True - # Stash the genuine function so the removal tripwire test - # (test_automodel_dtype_restore_workaround_still_needed) can exercise Automodel's - # real behavior even after this no-op has globally replaced the symbol process-wide. - _noop._nrl_original = restore - _model_init._restore_loaded_model_dtype = _noop - - def setup_model_and_optimizer( config: PolicyConfig, tokenizer: AutoTokenizer, @@ -761,19 +701,24 @@ def setup_model_and_optimizer( # HF conversion (required for weight syncing). _maybe_set_force_hf(automodel_kwargs, model_config) - # Keep fp32 master weights: stop Automodel from restoring loaded params to the bf16 - # checkpoint dtype, which would break optimizer master-weight precision (see helper). - _disable_automodel_checkpoint_dtype_restore() + # Bundle distributed topology + policies into a single DistributedSetup. Automodel + # r0.6.0's from_pretrained rejects the old separate distributed kwargs + # (moe_mesh/distributed_config/moe_config/activation_checkpointing/pipeline_config/tp_plan + # -- see _reject_separate_distributed_kwargs) and requires them via distributed_setup. + # pipeline_config=None: PP is not used here. + distributed_setup = DistributedSetup( + mesh_context=MeshContext.from_meshes(device_mesh, moe_mesh), + strategy_config=fsdp2_config, + pipeline_config=None, + moe_parallel_config=moe_config if ep_size > 1 else None, + activation_checkpointing=config["dtensor_cfg"]["activation_checkpointing"], + ) # Create model via from_pretrained - handles meta device init, parallelization, # LoRA, and base weight loading internally model = model_class.from_pretrained( model_name, - device_mesh=device_mesh, - moe_mesh=moe_mesh, - distributed_config=fsdp2_config, - moe_config=moe_config if ep_size > 1 else None, - activation_checkpointing=config["dtensor_cfg"]["activation_checkpointing"], + distributed_setup=distributed_setup, peft_config=peft_config, attn_implementation=attn_impl, torch_dtype=str(model_config.torch_dtype), diff --git a/tests/unit/models/automodel/test_automodel_setup.py b/tests/unit/models/automodel/test_automodel_setup.py index 9c26f741e15..9aba2d99fc7 100644 --- a/tests/unit/models/automodel/test_automodel_setup.py +++ b/tests/unit/models/automodel/test_automodel_setup.py @@ -15,6 +15,7 @@ """Unit tests for automodel setup utilities.""" import os +from types import SimpleNamespace from unittest.mock import MagicMock, Mock, patch import pytest @@ -40,11 +41,6 @@ ) -def test_token_classification_backport_still_required(): - with pytest.raises(ImportError): - from nemo_automodel import NeMoAutoModelForTokenClassification # noqa: F401 - - @pytest.fixture def mock_config(): """Create a mock policy configuration for testing.""" @@ -683,14 +679,14 @@ def mock_device_mesh(self): return mock_mesh @patch("nemo_rl.models.automodel.setup.MoEParallelizerConfig") - @patch("nemo_rl.models.automodel.setup.create_device_mesh") + @patch("nemo_rl.models.automodel.setup.MeshContext") @patch("nemo_rl.models.automodel.setup.FSDP2Config") @patch("nemo_rl.models.automodel.setup.torch.distributed") def test_setup_distributed_basic( self, mock_torch_dist, mock_fsdp2_config, - mock_create_mesh, + mock_mesh_context, mock_moe_config, mock_config, mock_runtime_config, @@ -703,7 +699,9 @@ def test_setup_distributed_basic( mock_moe_config_instance = MagicMock() mock_moe_config.return_value = mock_moe_config_instance mock_moe_mesh = MagicMock() - mock_create_mesh.return_value = (mock_device_mesh, mock_moe_mesh) + mock_mesh_context.build.return_value = SimpleNamespace( + device_mesh=mock_device_mesh, moe_mesh=mock_moe_mesh + ) result = setup_distributed(mock_config, mock_runtime_config) @@ -715,14 +713,14 @@ def test_setup_distributed_basic( assert result.moe_config == mock_moe_config_instance @patch("nemo_rl.models.automodel.setup.MoEParallelizerConfig") - @patch("nemo_rl.models.automodel.setup.create_device_mesh") + @patch("nemo_rl.models.automodel.setup.MeshContext") @patch("nemo_rl.models.automodel.setup.FSDP2Config") @patch("nemo_rl.models.automodel.setup.torch.distributed") def test_setup_distributed_with_cpu_offload( self, mock_torch_dist, mock_fsdp2_config, - mock_create_mesh, + mock_mesh_context, mock_moe_config, mock_config, mock_device_mesh, @@ -731,7 +729,9 @@ def test_setup_distributed_with_cpu_offload( mock_torch_dist.get_world_size.return_value = 4 mock_fsdp2_config.return_value = MagicMock() mock_moe_config.return_value = MagicMock() - mock_create_mesh.return_value = (mock_device_mesh, None) + mock_mesh_context.build.return_value = SimpleNamespace( + device_mesh=mock_device_mesh, moe_mesh=None + ) runtime_config = RuntimeConfig( model_class=Mock, @@ -757,14 +757,14 @@ def test_setup_distributed_with_cpu_offload( assert isinstance(result, DistributedContext) @patch("nemo_rl.models.automodel.setup.MoEParallelizerConfig") - @patch("nemo_rl.models.automodel.setup.create_device_mesh") + @patch("nemo_rl.models.automodel.setup.MeshContext") @patch("nemo_rl.models.automodel.setup.FSDP2Config") @patch("nemo_rl.models.automodel.setup.torch.distributed") def test_setup_distributed_world_size_one_cpu_offload_raises( self, mock_torch_dist, mock_fsdp2_config, - mock_create_mesh, + mock_mesh_context, mock_moe_config, mock_config, ): @@ -795,24 +795,26 @@ def test_setup_distributed_world_size_one_cpu_offload_raises( setup_distributed(mock_config, runtime_config) @patch("nemo_rl.models.automodel.setup.MoEParallelizerConfig") - @patch("nemo_rl.models.automodel.setup.create_device_mesh") + @patch("nemo_rl.models.automodel.setup.MeshContext") @patch("nemo_rl.models.automodel.setup.FSDP2Config") @patch("nemo_rl.models.automodel.setup.torch.distributed") def test_setup_distributed_passes_correct_params( self, mock_torch_dist, mock_fsdp2_config, - mock_create_mesh, + mock_mesh_context, mock_moe_config, mock_config, mock_runtime_config, mock_device_mesh, ): - """Test that FSDP2Config and create_device_mesh are called with correct parameters.""" + """Test that FSDP2Config and MeshContext.build are called with correct parameters.""" mock_torch_dist.get_world_size.return_value = 4 mock_fsdp2_config.return_value = MagicMock() mock_moe_config.return_value = MagicMock() - mock_create_mesh.return_value = (mock_device_mesh, None) + mock_mesh_context.build.return_value = SimpleNamespace( + device_mesh=mock_device_mesh, moe_mesh=None + ) mock_config["dtensor_cfg"]["dp_replicate_size"] = 2 setup_distributed(mock_config, mock_runtime_config) @@ -821,26 +823,28 @@ def test_setup_distributed_passes_correct_params( fsdp2_call_kwargs = mock_fsdp2_config.call_args[1] assert fsdp2_call_kwargs["sequence_parallel"] is False assert fsdp2_call_kwargs["activation_checkpointing"] is False - assert fsdp2_call_kwargs["backend"] == "nccl" - - # Verify create_device_mesh was called with correct size params - mesh_call_kwargs = mock_create_mesh.call_args[1] - assert mesh_call_kwargs["tp_size"] == 1 - assert mesh_call_kwargs["pp_size"] == 1 - assert mesh_call_kwargs["cp_size"] == 1 - assert mesh_call_kwargs["ep_size"] == 1 - assert mesh_call_kwargs["dp_replicate_size"] == 2 + # Automodel r0.6.0 dropped FSDP2Config.backend; the mesh helpers default to nccl. + assert "backend" not in fsdp2_call_kwargs + + # Verify MeshContext.build was called with correct size params + mesh_call_args, mesh_call_kwargs = mock_mesh_context.build.call_args + parallelism = mesh_call_args[1] + assert parallelism.tp_size == 1 + assert parallelism.pp_size == 1 + assert parallelism.cp_size == 1 + assert parallelism.ep_size == 1 + assert parallelism.dp_replicate_size == 2 assert mesh_call_kwargs["world_size"] == 4 @patch("nemo_rl.models.automodel.setup.MoEParallelizerConfig") - @patch("nemo_rl.models.automodel.setup.create_device_mesh") + @patch("nemo_rl.models.automodel.setup.MeshContext") @patch("nemo_rl.models.automodel.setup.FSDP2Config") @patch("nemo_rl.models.automodel.setup.torch.distributed") def test_setup_distributed_dp_replicate_size_requires_divisible_dp( self, mock_torch_dist, mock_fsdp2_config, - mock_create_mesh, + mock_mesh_context, mock_moe_config, mock_config, mock_runtime_config, @@ -946,13 +950,33 @@ def test_setup_model_and_optimizer_basic( ) assert isinstance(result, ModelAndOptimizerState) - # Verify from_pretrained was called with distributed kwargs + # Automodel r0.6.0 requires the distributed topology + policies to arrive as a + # single DistributedSetup; the separate kwargs are rejected with a TypeError. mock_runtime_config.model_class.from_pretrained.assert_called_once() call_kwargs = mock_runtime_config.model_class.from_pretrained.call_args[1] - assert call_kwargs["device_mesh"] == mock_distributed_context.device_mesh + for legacy_kwarg in ( + "device_mesh", + "moe_mesh", + "distributed_config", + "moe_config", + "activation_checkpointing", + ): + assert legacy_kwarg not in call_kwargs + distributed_setup = call_kwargs["distributed_setup"] + assert ( + distributed_setup.mesh_context.device_mesh + == mock_distributed_context.device_mesh + ) assert ( - call_kwargs["distributed_config"] == mock_distributed_context.fsdp2_config + distributed_setup.mesh_context.moe_mesh == mock_distributed_context.moe_mesh ) + assert ( + distributed_setup.strategy_config == mock_distributed_context.fsdp2_config + ) + assert distributed_setup.pipeline_config is None + # ep_size defaults to 1 in mock_config, so the MoE parallelizer config is unused. + assert distributed_setup.moe_parallel_config is None + assert distributed_setup.activation_checkpointing is False # Verify config= is NOT passed (avoids duplicate arg for custom models) assert "config" not in call_kwargs @@ -2221,72 +2245,3 @@ def test_compatible_adapter_no_change(self): config = self._make_config(arch) _maybe_set_force_hf(kwargs, config) assert "force_hf" not in kwargs - - -@pytest.mark.automodel -def test_automodel_dtype_restore_workaround_still_needed(monkeypatch): - """Tripwire for the temporary fp32 master-weight workaround in setup.py. - - ``_disable_automodel_checkpoint_dtype_restore`` no-ops Automodel's - ``_restore_loaded_model_dtype`` because (pre PR #2419) it downgrades an explicitly-fp32 - load back to the bf16 checkpoint dtype, breaking optimizer master weights. This test - reproduces that downgrade against the *live* pinned function (no model/checkpoint load). - - It PASSES while the bug is present. It FAILS — telling us to delete the workaround in - ``nemo_rl/models/automodel/setup.py`` (and this test) — once Automodel either removes the - function or ships PR #2419 (honors the explicit fp32 via ``promote_types`` so the weight - stays fp32). - """ - import inspect - import types - - import nemo_automodel.components.checkpoint.utils as ckpt_utils - from nemo_automodel._transformers import model_init - - restore = getattr(model_init, "_restore_loaded_model_dtype", None) - # An earlier test in this process may have triggered the setup.py workaround - # (_disable_automodel_checkpoint_dtype_restore), which globally and irreversibly - # replaces this symbol with a no-op. Recover the genuine upstream function it - # stashed so this tripwire exercises Automodel's real behavior, not our no-op. - restore = getattr(restore, "_nrl_original", restore) - if restore is None: - pytest.fail( - "Automodel removed _restore_loaded_model_dtype - remove the fp32 master-weight " - "workaround _disable_automodel_checkpoint_dtype_restore() in " - "nemo_rl/models/automodel/setup.py." - ) - - model = torch.nn.Linear(4, 4).float() - assert model.weight.dtype == torch.float32 - - # Pretend the checkpoint stored the weight in bf16. - monkeypatch.setattr( - ckpt_utils, - "_get_checkpoint_tensor_dtypes", - lambda *args, **kwargs: {"weight": torch.bfloat16}, - ) - # Reproduce NeMo-RL's explicit-fp32 load. PR #2419 honors the request ONLY via the - # new `requested_dtype` parameter (it ignores hf_config.torch_dtype / load_kwargs in - # this function): with requested_dtype=fp32 it promotes the bf16 checkpoint tensor up - # to fp32 and leaves the weight unchanged. The current pin predates #2419 and its - # signature has no such parameter, so pass it only when the signature accepts it: - # pre-#2419 -> requested_dtype absent -> weight downgraded to bf16 (assert holds, workaround needed) - # post-#2419 -> requested_dtype=fp32 -> weight stays fp32 (assert fails, fires the removal tripwire) - hf_config = types.SimpleNamespace(torch_dtype=torch.float32) - restore_kwargs = {} - if "requested_dtype" in inspect.signature(restore).parameters: - restore_kwargs["requested_dtype"] = torch.float32 - restore( - model, - "dummy", - hf_config, - None, - {"torch_dtype": "torch.float32"}, - **restore_kwargs, - ) - - assert model.weight.dtype == torch.bfloat16, ( - "Automodel no longer downgrades an explicit-fp32 load (likely PR #2419 landed); the " - "_disable_automodel_checkpoint_dtype_restore() workaround in setup.py is obsolete - " - "remove it and this test." - ) From 62c29ee329e8df12bae97b54ccb1706c48388858 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 31 Jul 2026 00:08:46 -0700 Subject: [PATCH 04/34] fix(automodel): mirror the r0.6.0 Checkpointer config handling Two pieces of AutomodelCheckpointManager drifted from Automodel r0.6.0: - _should_write_hf_metadata is now a module-level helper taking the config (see Checkpointer.__init__), not a Checkpointer method, so _rebuild_checkpointer_addons raised AttributeError at the first checkpoint save. Import the helper and pass self.checkpointer.config, mirroring __init__ exactly. This covers save_checkpoint and load_checkpoint/resume, since both route through update_checkpointer_config. - CheckpointingConfig.save_consolidated is now a SaveConsolidatedMode enum, normalized from legacy bools/strings in __post_init__. update_checkpointer_config assigns fields with setattr, which bypasses __post_init__, so a bool True would compare unequal to SaveConsolidatedMode.EVERY and silently disable consolidated HF export. Normalize it the same way the model_save_format enum is already handled. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: larkzhang-nv --- nemo_rl/models/automodel/checkpoint.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/nemo_rl/models/automodel/checkpoint.py b/nemo_rl/models/automodel/checkpoint.py index ae739bdc274..f5b59de3812 100644 --- a/nemo_rl/models/automodel/checkpoint.py +++ b/nemo_rl/models/automodel/checkpoint.py @@ -31,6 +31,9 @@ from nemo_automodel.components.checkpoint.checkpointing import ( CheckpointingConfig as AutomodelCheckpointingConfig, ) +from nemo_automodel.components.checkpoint.config import ( + _normalize_save_consolidated, +) from torch import nn from torch.distributed.device_mesh import DeviceMesh from transformers import AutoTokenizer @@ -217,6 +220,12 @@ def update_checkpointer_config( if k == "model_save_format": # Ensure enum type v = SerializationFormat[v.upper()] if isinstance(v, str) else v + elif k == "save_consolidated": + # Automodel normalizes legacy bools/strings to SaveConsolidatedMode in + # CheckpointingConfig.__post_init__, which setattr bypasses. Without this + # a bool True would silently compare unequal to SaveConsolidatedMode.EVERY + # and disable consolidated HF export. + v = _normalize_save_consolidated(v) setattr(cfg, k, v) # Rebuild _addons list based on updated config @@ -237,9 +246,12 @@ def _rebuild_checkpointer_addons(self) -> None: ConsolidatedHFAddon, PeftAddon, ) + from nemo_automodel.components.checkpoint.checkpointing import ( + _should_write_hf_metadata, + ) self.checkpointer._addons = [] - if self.checkpointer._should_write_hf_metadata(): + if _should_write_hf_metadata(self.checkpointer.config): self.checkpointer._addons.append(ConsolidatedHFAddon()) if self.checkpointer.config.is_peft: self.checkpointer._addons.append(PeftAddon()) From 41f1b81708e7f05391cda53704c7dde14d6db448 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 31 Jul 2026 00:08:59 -0700 Subject: [PATCH 05/34] refactor(automodel): drop the KV-sharing use_cache workaround _needs_kv_cache_for_shared_layers forced use_cache=True for models with num_kv_shared_layers > 0 (e.g. Gemma4 E2B) so a DynamicCache existed for shared layers to read anchor-layer K/V from. Its removal tripwire keyed on transformers>=5.5.2 (huggingface/transformers#45312). Automodel r0.6.0 pulls transformers 5.12.1, and that PR has landed: Gemma4's attention forward now takes an explicit shared_kv_states dict, so KV sharing no longer depends on past_key_values/use_cache. Remove the helper, the use_cache parameter it drove through model_forward and forward_with_post_processing_fn, and the tripwire test. model_forward keeps use_cache=False, which is what every caller already passed. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: larkzhang-nv --- nemo_rl/models/automodel/train.py | 36 +------------ .../models/automodel/test_automodel_train.py | 52 ------------------- 2 files changed, 1 insertion(+), 87 deletions(-) diff --git a/nemo_rl/models/automodel/train.py b/nemo_rl/models/automodel/train.py index d6a3d1b3047..8a4f2834532 100644 --- a/nemo_rl/models/automodel/train.py +++ b/nemo_rl/models/automodel/train.py @@ -68,32 +68,11 @@ ] -def _needs_kv_cache_for_shared_layers(model: nn.Module) -> bool: - """Check if the model uses KV sharing and needs use_cache=True for correct inference. - - Models with num_kv_shared_layers > 0 (e.g. Gemma4 E2B) rely on DynamicCache - to pass K/V from anchor layers to shared layers. When use_cache=False, - past_key_values is None and shared layers cannot retrieve shared K/V, - producing incorrect outputs. - - TODO: remove this workaround once upgraded to transformers>=5.5.2 - (https://github.com/huggingface/transformers/pull/45312), which fixes - KV sharing without requiring use_cache=True. - """ - model_config = getattr(model, "config", None) - text_config = ( - getattr(model_config, "text_config", model_config) if model_config else None - ) - num_kv_shared_layers = getattr(text_config, "num_kv_shared_layers", 0) - return isinstance(num_kv_shared_layers, int) and num_kv_shared_layers > 0 - - def model_forward( model: nn.Module, processed_inputs: ProcessedInputs, is_reward_model: bool = False, allow_flash_attn_args: bool = True, - use_cache: bool = False, ) -> torch.Tensor: """Perform a single forward pass through the model. @@ -102,9 +81,6 @@ def model_forward( processed_inputs: ProcessedInputs containing all tensors for forward pass is_reward_model: Whether this is a reward model allow_flash_attn_args: Whether to pass flash_attn_kwargs to model - use_cache: Whether to use KV cache. Must be True for inference on models - with KV sharing (num_kv_shared_layers > 0). Must be False for training - (backward pass / gradient checkpointing). Returns: torch.Tensor: Output tensor from the model (logits) @@ -113,7 +89,7 @@ def model_forward( input_ids=processed_inputs.input_ids, attention_mask=processed_inputs.attention_mask, position_ids=processed_inputs.position_ids, - use_cache=use_cache, + use_cache=False, ) # Add flash attention kwargs if applicable @@ -346,22 +322,12 @@ def forward_with_post_processing_fn( data_dict = processed_mb.data_dict processed_inputs = processed_mb.processed_inputs - # Models with KV sharing (num_kv_shared_layers > 0, e.g. Gemma4 E2B) need - # use_cache=True so that DynamicCache is created and shared layers can - # retrieve K/V from anchor layers. Without it, shared layers fall back to - # untrained K/V projections and produce garbage. - # This is compatible with activation checkpointing: Automodel's parallelizer - # keeps use_cache=True for KV-sharing models under activation checkpointing - # (NVIDIA-NeMo/Automodel#1705). - use_cache = _needs_kv_cache_for_shared_layers(model) - # Model forward pass outputs = model_forward( model, processed_inputs, is_reward_model=is_reward_model, allow_flash_attn_args=allow_flash_attn_args, - use_cache=use_cache, ) # Extract logits from model outputs diff --git a/tests/unit/models/automodel/test_automodel_train.py b/tests/unit/models/automodel/test_automodel_train.py index 4efd0eb59a2..300a0e7b433 100644 --- a/tests/unit/models/automodel/test_automodel_train.py +++ b/tests/unit/models/automodel/test_automodel_train.py @@ -38,7 +38,6 @@ LossPostProcessor, ScorePostProcessor, TopkLogitsPostProcessor, - _needs_kv_cache_for_shared_layers, apply_temperature_scaling, automodel_forward_backward, extract_logits, @@ -381,57 +380,6 @@ def test_forward_omits_mm_token_type_ids_for_non_gemma4( assert "mm_token_type_ids" not in call_kwargs -# ========================================== -# Test _needs_kv_cache_for_shared_layers -# ========================================== -@pytest.mark.automodel -class TestNeedsKvCacheForSharedLayers: - def test_nested_text_config_positive(self): - import types - - model = types.SimpleNamespace( - config=types.SimpleNamespace( - text_config=types.SimpleNamespace(num_kv_shared_layers=4) - ) - ) - assert _needs_kv_cache_for_shared_layers(model) is True - - def test_flat_config_zero_is_false(self): - import types - - model = types.SimpleNamespace( - config=types.SimpleNamespace(num_kv_shared_layers=0) - ) - assert _needs_kv_cache_for_shared_layers(model) is False - - def test_missing_config_is_false(self): - import types - - assert _needs_kv_cache_for_shared_layers(types.SimpleNamespace()) is False - - def test_workaround_obsolete_tripwire(self): - """Tripwire: fires once transformers>=5.5.2 (PR #45312) lands. - - PR #45312 fixes KV sharing without requiring use_cache=True, which makes - the _needs_kv_cache_for_shared_layers workaround (and the use_cache - plumbing it drives in model_forward / automodel_forward_backward) obsolete. - There is no importable symbol/signature to key on, so we key on the - transformers version the TODO names. When this assertion fails, remove the - workaround in nemo_rl/models/automodel/train.py and this test. - """ - import transformers - from packaging.version import Version - - assert Version(transformers.__version__) < Version("5.5.2"), ( - f"transformers {transformers.__version__} >= 5.5.2 detected " - "(PR #45312 fixes KV sharing without use_cache=True). The " - "_needs_kv_cache_for_shared_layers workaround in " - "nemo_rl/models/automodel/train.py (and the use_cache plumbing in " - "model_forward / automodel_forward_backward) is now obsolete - " - "remove it and this test." - ) - - # ===================== # Test extract_logits # ===================== From 2df11e05b1ed89b5a802276da33c3ae48d20c6f4 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 3 Aug 2026 08:11:15 -0700 Subject: [PATCH 06/34] feat(automodel): migrate context parallel integration Delegate sequence layout management to Automodel's context-parallel sharder while preserving the existing NeMo-RL tensor-parallel and loss contracts. Migrate token post-processing and CP gradient fanout without introducing unrelated TP behavior changes. Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/loss/loss_functions.py | 28 +- nemo_rl/algorithms/loss/utils.py | 44 ++ nemo_rl/algorithms/x_token/loss_utils.py | 112 +++-- nemo_rl/distributed/model_utils.py | 265 ++++++++--- nemo_rl/models/automodel/data.py | 68 +-- nemo_rl/models/automodel/setup.py | 1 - nemo_rl/models/automodel/train.py | 432 +++++++++--------- .../workers/dtensor_policy_worker_v2.py | 147 +++--- .../value/workers/dtensor_value_worker_v2.py | 82 +--- 9 files changed, 671 insertions(+), 508 deletions(-) diff --git a/nemo_rl/algorithms/loss/loss_functions.py b/nemo_rl/algorithms/loss/loss_functions.py index db8b5256662..54af3216ac3 100755 --- a/nemo_rl/algorithms/loss/loss_functions.py +++ b/nemo_rl/algorithms/loss/loss_functions.py @@ -1620,6 +1620,8 @@ def __call__( teacher_full_logits_by_idx: dict[int, torch.Tensor], aligns_by_idx: dict[int, LocalizedAlignment], *, + student_next_token_logprobs: Optional[torch.Tensor] = None, + student_next_token_mask: Optional[torch.Tensor] = None, tp_group: Optional[torch.distributed.ProcessGroup] = None, cp_group: Optional[torch.distributed.ProcessGroup] = None, ) -> tuple[torch.Tensor, dict[str, Any]]: @@ -1633,9 +1635,15 @@ def __call__( ``student_logits_contig`` (CP-relaid) and the per-teacher ``aligns_by_idx`` / ``teacher_full_logits_by_idx`` are precomputed in ``prepare_loss_input``; - the raw ``logits`` is kept for the CE term. + the Automodel CP path also supplies its sequence-local CE inputs. """ - ce_loss = self._compute_ce(logits, data, global_valid_toks) + ce_loss = self._compute_ce( + logits, + data, + global_valid_toks, + student_next_token_logprobs=student_next_token_logprobs, + student_next_token_mask=student_next_token_mask, + ) if self.kd_loss_mode == "sum": total_kd, per_teacher_metrics = self._sum_kd( @@ -2649,8 +2657,24 @@ def _compute_ce( logits: torch.Tensor, data: BatchedDataDict[CrossTokenizerDistillationLossDataDict], global_valid_toks: torch.Tensor, + *, + student_next_token_logprobs: Optional[torch.Tensor] = None, + student_next_token_mask: Optional[torch.Tensor] = None, ) -> torch.Tensor: """Next-token CE on the student side (TP/CP handled by the helpers).""" + if student_next_token_logprobs is not None: + assert student_next_token_mask is not None + label_mask = student_next_token_mask.to( + student_next_token_logprobs.dtype + ) * to_local_if_dtensor(data["sample_mask"]).to( + student_next_token_logprobs.device + ).unsqueeze(-1) + return masked_mean( + -student_next_token_logprobs, + label_mask, + global_normalization_factor=global_valid_toks, + ) + per_token_ce = student_next_token_ce( logits, input_ids=data["input_ids"], seq_index=data.get("seq_index") ) diff --git a/nemo_rl/algorithms/loss/utils.py b/nemo_rl/algorithms/loss/utils.py index ca543a9485c..e64871a76be 100644 --- a/nemo_rl/algorithms/loss/utils.py +++ b/nemo_rl/algorithms/loss/utils.py @@ -29,6 +29,7 @@ from nemo_rl.distributed.model_utils import ( _get_tokens_on_this_cp_rank, from_parallel_logits_to_logprobs_packed_sequences, + get_cp_sharded_next_token_logprobs, get_distillation_topk_logprobs_from_logits, get_next_token_logprobs_from_logits, ) @@ -44,6 +45,7 @@ def prepare_loss_input( sampling_params: Optional[TrainingSamplingParams] = None, d2t: Optional[torch.Tensor] = None, chunk_size: Optional[int] = None, + cp_sharder: Optional[Any] = None, ) -> tuple[dict[str, Any], BatchedDataDict[Any]]: """Prepare loss input for a loss function. @@ -59,6 +61,9 @@ def prepare_loss_input( chunk_size: Sequence-dim chunk size for the vocab-parallel logprob computation (policy.logprob_chunk_size); avoids materializing full-size float32 logits during training. + cp_sharder: Automodel ``ContextParallelSharder`` owning this forward's + sequence layout (V2 automodel worker with cp_size > 1); ``logits`` + are then this rank's CP-local shard while ``data`` stays canonical. Notes: vocab_parallel_rank, vocab_parallel_group, context_parallel_group are only used for megatron policy worker. @@ -91,6 +96,7 @@ def prepare_loss_input( context_parallel_group=context_parallel_group, sampling_params=sampling_params, chunk_size=chunk_size, + cp_sharder=cp_sharder, ) # handle top-k/top-p filtering for logprobs, only used for ClippedPGLossFn now @@ -115,6 +121,7 @@ def prepare_loss_input( sampling_params=None, # no filtering # Only reachable with top-k/top-p sampling active that has its own kernel path so don't chunk here chunk_size=None, + cp_sharder=cp_sharder, ) loss_input = {"next_token_logprobs": logprobs} @@ -131,6 +138,7 @@ def prepare_loss_input( vocab_parallel_rank=vocab_parallel_rank, vocab_parallel_group=vocab_parallel_group, context_parallel_group=context_parallel_group, + cp_sharder=cp_sharder, ) ) @@ -158,6 +166,7 @@ def prepare_loss_input( projection_matrix_paths=loss_fn.projection_matrix_paths, vocab_parallel_group=vocab_parallel_group, context_parallel_group=context_parallel_group, + cp_sharder=cp_sharder, ) loss_input = { "logits": logits, @@ -167,6 +176,41 @@ def prepare_loss_input( "tp_group": tp_group, "cp_group": cp_group, } + if cp_sharder is not None: + next_token_logprobs = get_cp_sharded_next_token_logprobs( + logits, + data["input_ids"], + cp_sharder, + chunk_size=chunk_size, + ) + full_logprobs = torch.cat( + [next_token_logprobs, torch.zeros_like(next_token_logprobs[:, :1])], + dim=1, + ) + cp_size = ( + torch.distributed.get_world_size(context_parallel_group) + if context_parallel_group is not None + else 1 + ) + cp_rank = ( + torch.distributed.get_rank(context_parallel_group) + if context_parallel_group is not None + else 0 + ) + local_seq_len = full_logprobs.shape[1] // cp_size + seq_start = cp_rank * local_seq_len + next_token_mask = ( + data["token_mask"].to(full_logprobs.device).roll(shifts=-1, dims=1) + ) + next_token_mask[:, -1] = 0 + loss_input.update( + student_next_token_logprobs=full_logprobs.narrow( + 1, seq_start, local_seq_len + ).contiguous(), + student_next_token_mask=next_token_mask.narrow( + 1, seq_start, local_seq_len + ).contiguous(), + ) elif loss_fn.input_type == LossInputType.DRAFT: from megatron.core.transformer.multi_token_prediction import roll_tensor diff --git a/nemo_rl/algorithms/x_token/loss_utils.py b/nemo_rl/algorithms/x_token/loss_utils.py index d4040549c6b..ba7abacc3a2 100644 --- a/nemo_rl/algorithms/x_token/loss_utils.py +++ b/nemo_rl/algorithms/x_token/loss_utils.py @@ -1008,6 +1008,7 @@ def prepare_xtoken_cross_tokenizer_loss_input( projection_matrix_paths: list[Optional[str]], vocab_parallel_group: Optional[torch.distributed.ProcessGroup] = None, context_parallel_group: Optional[torch.distributed.ProcessGroup] = None, + cp_sharder: Optional[Any] = None, ) -> tuple[ torch.Tensor, Dict[int, torch.Tensor], @@ -1032,6 +1033,8 @@ def prepare_xtoken_cross_tokenizer_loss_input( projection_matrix_paths: Per-teacher projection paths. Its length is the teacher count and drives the ``teacher_{i}_*`` / ``alignment_{i}_*`` keys read here; a ``None`` entry marks a same-tokenizer teacher. + cp_sharder: Automodel's model-owned sequence layout. When provided, it + replaces the legacy load-balanced CP relayout for student tensors. Returns: ``(student_logits_contig, teacher_full_logits_by_idx, aligns_by_idx, tp_group, cp_group)``. @@ -1039,25 +1042,51 @@ def prepare_xtoken_cross_tokenizer_loss_input( if isinstance(logits, DTensor): mesh = logits.device_mesh mesh_names = mesh.mesh_dim_names or () - cp_group = mesh.get_group("cp") if "cp" in mesh_names else None tp_group = mesh.get_group("tp") if "tp" in mesh_names else None + cp_group = ( + context_parallel_group + if cp_sharder is not None + else (mesh.get_group("cp") if "cp" in mesh_names else None) + ) else: cp_group = context_parallel_group tp_group = vocab_parallel_group device = torch.cuda.current_device() - # Student CP-relay computed once and shared by every teacher's KD term and - # the next-token-accuracy metric. Relaid from CP load-balanced to this rank's - # contiguous window; input_ids / token_mask stay unshifted (the accuracy - # metric and the same-vocab KD apply their own CP-aware next-token shift). - student_logits_contig = cp_load_balanced_to_contiguous(logits, cp_group=cp_group) - student_input_ids = cp_load_balanced_to_contiguous( - data["input_ids"], cp_group=cp_group - ) - student_token_mask = cp_load_balanced_to_contiguous( - data["token_mask"], cp_group=cp_group - ) + # Student CP relay is computed once and shared by every teacher's KD term. + # Automodel restores its own model layout before NeMo RL selects the + # contiguous IPC-consumer window. Legacy callers retain the existing + # load-balanced-to-contiguous conversion. + if cp_sharder is not None: + full_student_logits = cp_sharder.gather_token_tensor( + to_local_if_dtensor(logits), seq_dim=1, trim=True + ) + cp_size = ( + torch.distributed.get_world_size(cp_group) if cp_group is not None else 1 + ) + cp_rank = torch.distributed.get_rank(cp_group) if cp_group is not None else 0 + student_seq_len = full_student_logits.shape[1] // cp_size + student_seq_start = cp_rank * student_seq_len + student_logits_contig = full_student_logits.narrow( + 1, student_seq_start, student_seq_len + ).contiguous() + student_input_ids = to_local_if_dtensor(data["input_ids"])[ + :, student_seq_start : student_seq_start + student_seq_len + ].contiguous() + student_token_mask = to_local_if_dtensor(data["token_mask"])[ + :, student_seq_start : student_seq_start + student_seq_len + ].contiguous() + else: + student_logits_contig = cp_load_balanced_to_contiguous( + logits, cp_group=cp_group + ) + student_input_ids = cp_load_balanced_to_contiguous( + data["input_ids"], cp_group=cp_group + ) + student_token_mask = cp_load_balanced_to_contiguous( + data["token_mask"], cp_group=cp_group + ) sample_mask = to_local_if_dtensor(data["sample_mask"]) teacher_full_logits_by_idx: Dict[int, torch.Tensor] = {} @@ -1078,20 +1107,51 @@ def prepare_xtoken_cross_tokenizer_loss_input( student_token_mask=student_token_mask, ) continue - align = localize_alignment( - data, - teacher_seq_len=teacher_full_logits.shape[1], - alignment_prefix=f"alignment_{i}_", - cp_group=cp_group, - ) - align.student_chunk_id = cp_shift_next( - cp_load_balanced_to_contiguous(align.student_chunk_id, cp_group=cp_group), - cp_group, - fill=-1, - ) - align.teacher_chunk_id = cp_shift_next( - align.teacher_chunk_id, cp_group, fill=-1 - ) + alignment_prefix = f"alignment_{i}_" + if cp_sharder is not None: + student_chunk_id = to_local_if_dtensor( + data[f"{alignment_prefix}student_chunk_id"] + ).roll(shifts=-1, dims=1) + student_chunk_id[:, -1] = -1 + student_chunk_id = student_chunk_id[ + :, student_seq_start : student_seq_start + student_seq_len + ].contiguous() + + teacher_chunk_id = to_local_if_dtensor( + data[f"{alignment_prefix}teacher_chunk_id"] + ).roll(shifts=-1, dims=1) + teacher_chunk_id[:, -1] = -1 + teacher_seq_len = teacher_full_logits.shape[1] + teacher_seq_start = cp_rank * teacher_seq_len + teacher_chunk_id = teacher_chunk_id[ + :, teacher_seq_start : teacher_seq_start + teacher_seq_len + ].contiguous() + align = LocalizedAlignment( + sample_mask=sample_mask, + student_chunk_id=student_chunk_id, + teacher_chunk_id=teacher_chunk_id, + pair_valid=to_local_if_dtensor(data[f"{alignment_prefix}pair_valid"]), + pair_is_correct=to_local_if_dtensor( + data[f"{alignment_prefix}pair_is_correct"] + ), + ) + else: + align = localize_alignment( + data, + teacher_seq_len=teacher_full_logits.shape[1], + alignment_prefix=alignment_prefix, + cp_group=cp_group, + ) + align.student_chunk_id = cp_shift_next( + cp_load_balanced_to_contiguous( + align.student_chunk_id, cp_group=cp_group + ), + cp_group, + fill=-1, + ) + align.teacher_chunk_id = cp_shift_next( + align.teacher_chunk_id, cp_group, fill=-1 + ) align.student_input_ids = student_input_ids align.student_token_mask = student_token_mask aligns_by_idx[i] = align diff --git a/nemo_rl/distributed/model_utils.py b/nemo_rl/distributed/model_utils.py index 7195592e25f..cf516023912 100644 --- a/nemo_rl/distributed/model_utils.py +++ b/nemo_rl/distributed/model_utils.py @@ -836,6 +836,165 @@ def backward( return grad_input, None, None, None, None, None, None +def _tp_target_logprobs( + vocab_parallel_logits: torch.Tensor, + target: torch.Tensor, + *, + vocab_start_index: int, + vocab_end_index: int, + tp_group: Optional[torch.distributed.ProcessGroup], + chunk_size: Optional[int] = None, + sampling_params: Optional[TrainingSamplingParams] = None, + inference_only: bool = False, +) -> torch.Tensor: + """Log probabilities of already-aligned targets, reducing over the vocab dim only. + + Owns tensor-parallel vocabulary selection and nothing else: the sequence + dimension is passed through untouched, so callers are free to hand in a + context-parallel local shard. ``target`` must already be shifted and laid + out exactly like ``vocab_parallel_logits`` on the sequence dim. + + Args: + vocab_parallel_logits: Local logits with shape [B, S, V_local]. + target: Aligned target token IDs with shape [B, S]. + vocab_start_index: Inclusive global ID of the first local vocab entry. + vocab_end_index: Exclusive global ID after the local vocabulary. + tp_group: Vocabulary-parallel process group, or ``None`` when this rank + owns the full vocabulary. + chunk_size: Optional sequence chunk size to bound peak memory. + sampling_params: Optional top-k/top-p filtering configuration. + inference_only: Skip saving tensors for backward. + + Returns: + Log probabilities with shape [B, S]. + """ + if tp_group is not None: + if need_top_k_or_top_p_filtering(sampling_params): + if chunk_size is not None: + return ChunkedDistributedLogprobWithSampling.apply( # type: ignore[no-any-return] + vocab_parallel_logits, + target, + tp_group, + sampling_params.top_k, + sampling_params.top_p, + chunk_size, + inference_only, + ).contiguous() + return DistributedLogprobWithSampling.apply( # type: ignore[no-any-return] + vocab_parallel_logits, + target, + tp_group, + sampling_params.top_k, + sampling_params.top_p, + inference_only, + ).contiguous() + if chunk_size is not None: + return ChunkedDistributedLogprob.apply( # type: ignore[no-any-return] + vocab_parallel_logits, + target, + vocab_start_index, + vocab_end_index, + chunk_size, + tp_group, + inference_only, + ).contiguous() + return DistributedLogprob.apply( # type: ignore[no-any-return] + vocab_parallel_logits, + target, + vocab_start_index, + vocab_end_index, + tp_group, + inference_only, + ).contiguous() + + # Full local vocabulary: plain log-softmax + gather, chunked when requested. + seq_len = int(target.shape[1]) + effective_chunk_size = chunk_size or seq_len + out_chunks: list[torch.Tensor] = [] + for start in range(0, seq_len, effective_chunk_size): + end = min(seq_len, start + effective_chunk_size) + logits_chunk = vocab_parallel_logits[:, start:end, :].to(torch.float32) + if need_top_k_or_top_p_filtering(sampling_params): + assert sampling_params is not None + logits_chunk, _ = apply_top_k_top_p( + logits_chunk, + top_k=sampling_params.top_k, + top_p=sampling_params.top_p, + ) + log_probs = torch.nn.functional.log_softmax(logits_chunk, dim=-1) + out_chunks.append( + log_probs.gather(dim=-1, index=target[:, start:end].unsqueeze(-1)).squeeze( + -1 + ) + ) + del log_probs, logits_chunk + return ( + torch.cat(out_chunks, dim=1) if len(out_chunks) > 1 else out_chunks[0] + ).contiguous() + + +def get_cp_sharded_next_token_logprobs( + logits: torch.Tensor | DTensor, + input_ids: torch.Tensor, + cp_sharder: Any, + *, + chunk_size: Optional[int] = None, + sampling_params: Optional[TrainingSamplingParams] = None, +) -> torch.Tensor: + """Next-token log probabilities using Automodel's context-parallel layout. + + NeMo-RL owns the next-token semantics (the shift) and the vocabulary-parallel + reduction; Automodel's ``ContextParallelSharder`` owns where the tokens live. + The shift happens on the canonical full sequence *before* sharding, because a + CP rank's local last token is generally not the global last token. + + Args: + logits: This rank's local logits, ``[B, S_local, V_local]``. A TP-sharded + ``DTensor`` when tensor parallelism is active, otherwise a plain tensor. + input_ids: Canonical (unsharded, unpadded) token IDs, ``[B, S]``. + cp_sharder: The ``ContextParallelSharder`` that sharded this forward's + model batch, i.e. the owner of the layout ``logits`` was produced in. + chunk_size: Optional sequence chunk size for the vocab-parallel kernels. + sampling_params: Optional top-k/top-p filtering configuration. + + Returns: + Canonical-order log probabilities with shape ``[B, S - 1]``. + """ + if isinstance(logits, DTensor): + tp_group = logits.device_mesh.get_group("tp") + local_logits = logits.to_local() + vocab_per_rank = int(local_logits.shape[-1]) + tp_rank = tp_group.rank() + vocab_start_index = tp_rank * vocab_per_rank + vocab_end_index = (tp_rank + 1) * vocab_per_rank + else: + tp_group = None + local_logits = logits + vocab_start_index = 0 + vocab_end_index = int(local_logits.shape[-1]) + + # Shift on the canonical sequence, then map into the model's layout with the + # same ShardLayout the batch went through. ``fill`` only lands on CP padding, + # which the trim below removes. + global_targets = input_ids.roll(shifts=-1, dims=1) + local_targets = cp_sharder.shard_token_tensor(global_targets, seq_dim=1, fill=0) + + local_logprobs = _tp_target_logprobs( + local_logits, + local_targets, + vocab_start_index=vocab_start_index, + vocab_end_index=vocab_end_index, + tp_group=tp_group, + chunk_size=chunk_size, + sampling_params=sampling_params, + inference_only=not torch.is_grad_enabled(), + ) + + # Differentiable gather back to canonical order, minus Automodel's CP padding. + logprobs = cp_sharder.gather_token_tensor(local_logprobs, seq_dim=1, trim=True) + return logprobs[:, :-1] + + def dtensor_from_parallel_logits_to_logprobs( vocab_parallel_logits: torch.Tensor, target: DTensor | torch.Tensor, @@ -893,46 +1052,16 @@ def dtensor_from_parallel_logits_to_logprobs( else: target = target.roll(shifts=-1, dims=-1) - if need_top_k_or_top_p_filtering(sampling_params): - if chunk_size is not None: - logprobs: torch.Tensor = ChunkedDistributedLogprobWithSampling.apply( # type: ignore - vocab_parallel_logits, - target, - tp_group, - sampling_params.top_k, - sampling_params.top_p, - chunk_size, - inference_only, - ).contiguous() - else: - logprobs: torch.Tensor = DistributedLogprobWithSampling.apply( # type: ignore - vocab_parallel_logits, - target, - tp_group, - sampling_params.top_k, - sampling_params.top_p, - inference_only, - ).contiguous() - else: - if chunk_size is not None: - logprobs: torch.Tensor = ChunkedDistributedLogprob.apply( # type: ignore - vocab_parallel_logits, - target, - vocab_start_index, - vocab_end_index, - chunk_size, - tp_group, - inference_only, - ).contiguous() - else: - logprobs: torch.Tensor = DistributedLogprob.apply( # type: ignore - vocab_parallel_logits, - target, - vocab_start_index, - vocab_end_index, - tp_group, - inference_only, - ).contiguous() + logprobs = _tp_target_logprobs( + vocab_parallel_logits, + target, + vocab_start_index=vocab_start_index, + vocab_end_index=vocab_end_index, + tp_group=tp_group, + chunk_size=chunk_size, + sampling_params=sampling_params, + inference_only=inference_only, + ) if cp_size > 1: # logprobs is sharded on the sequence dimension. @@ -1617,24 +1746,30 @@ def get_next_token_logprobs_from_logits( context_parallel_group: Optional[torch.distributed.ProcessGroup] = None, sampling_params: Optional[TrainingSamplingParams] = None, chunk_size: Optional[int] = None, + cp_sharder: Optional[Any] = None, ) -> torch.Tensor: """Compute token log-probabilities from logits, handling parallel and non-parallel cases. - This function handles three cases: + This function handles four cases: 1. Vocab parallel (Megatron-style): uses from_parallel_logits_to_logprobs - 2. DTensor: uses get_logprobs_from_vocab_parallel_logits - 3. Non-parallel: applies top-k/top-p filtering, log_softmax, and gather + 2. Automodel context parallel: uses get_cp_sharded_next_token_logprobs + 3. DTensor: uses get_logprobs_from_vocab_parallel_logits + 4. Non-parallel: applies top-k/top-p filtering, log_softmax, and gather Args: input_ids: Input token IDs of shape [batch_size, seq_len] next_token_logits: Logits tensor of shape [batch_size, seq_len, vocab_size] - seq_index: Sequence index tensor for DTensor path + seq_index: Sequence index tensor for the V1 DTensor worker's CP path vocab_parallel_rank: Rank in the vocab parallel group (required if vocab_parallel_group is provided) vocab_parallel_group: Process group for vocab parallelism context_parallel_group: Process group for context parallelism sampling_params: Sampling parameters for top-k/top-p filtering chunk_size: Sequence-dim chunk size for the vocab-parallel path; only applied without top-k/top-p sampling. + cp_sharder: Automodel ``ContextParallelSharder`` that sharded this + forward's model batch (V2 automodel worker with cp_size > 1). When + set, ``next_token_logits`` is this rank's CP-local shard and the + sharder owns the sequence layout. Returns: Token log-probabilities of shape [batch_size, seq_len - 1] @@ -1666,6 +1801,15 @@ def get_next_token_logprobs_from_logits( # slice off to the correct length to remove potential CP padding logprobs = logprobs[:, : input_ids.shape[1] - 1] + elif cp_sharder is not None: + logprobs = get_cp_sharded_next_token_logprobs( + next_token_logits, + input_ids, + cp_sharder, + chunk_size=chunk_size, + sampling_params=sampling_params, + ) + elif isinstance(next_token_logits, torch.distributed.tensor.DTensor): logprobs = get_logprobs_from_vocab_parallel_logits( next_token_logits, @@ -1862,6 +2006,7 @@ def get_distillation_topk_logprobs_from_logits( vocab_parallel_rank: Optional[int] = None, vocab_parallel_group: Optional[torch.distributed.ProcessGroup] = None, context_parallel_group: Optional[torch.distributed.ProcessGroup] = None, + cp_sharder: Optional[Any] = None, ): """Compute top-k log probabilities from logits.""" if teacher_topk_indices.shape[-1] <= 0: @@ -1903,8 +2048,9 @@ def get_distillation_topk_logprobs_from_logits( vocab_start_index = tp_rank * V_local vocab_end_index = (tp_rank + 1) * V_local - # For DTensor, derive CP group/size from the device mesh to ensure CP-aware alignment - if ( + # Legacy DTensor callers still derive CP from the tensor mesh. Automodel + # supplies its model-owned sequence layout explicitly instead. + if cp_sharder is None and ( device_mesh.mesh_dim_names is not None and "cp" in device_mesh.mesh_dim_names ): @@ -1918,15 +2064,23 @@ def get_distillation_topk_logprobs_from_logits( student_logits = student_logits parallel_group = None + indices_for_logits = teacher_topk_indices + if cp_sharder is not None: + cp_group = None + cp_size = 1 + indices_for_logits = cp_sharder.shard_token_tensor( + teacher_topk_indices, seq_dim=1, fill=0 + ) + # Process based on the zero_outside_topk setting H_all = None if zero_outside_topk: # Distributed processing if parallel_group is not None: - indices_local = teacher_topk_indices + indices_local = indices_for_logits pad_len = 0 - if cp_size > 1: + if cp_size > 1 and cp_sharder is None: pad_len = student_logits.shape[1] * cp_size - indices_local.shape[1] if pad_len > 0: indices_local = torch.nn.functional.pad( @@ -1972,7 +2126,7 @@ def get_distillation_topk_logprobs_from_logits( else: student_logprobs = torch.nn.functional.log_softmax(student_logits, dim=-1) student_topk_logprobs = student_logprobs.gather( - dim=-1, index=teacher_topk_indices + dim=-1, index=indices_for_logits ) if calculate_entropy: @@ -1987,9 +2141,9 @@ def get_distillation_topk_logprobs_from_logits( student_topk_logits = gather_logits_at_global_indices( student_logits, - teacher_topk_indices, + indices_for_logits, tp_group=parallel_group, - cp_group=cp_group, + cp_group=cp_group if cp_sharder is None else None, vocab_start_index=vocab_start_index, vocab_end_index=vocab_end_index, ) @@ -1997,13 +2151,20 @@ def get_distillation_topk_logprobs_from_logits( # Non-distributed processing else: student_topk_logits = student_logits.gather( - dim=-1, index=teacher_topk_indices + dim=-1, index=indices_for_logits ) student_topk_logprobs = torch.nn.functional.log_softmax( student_topk_logits, dim=-1 ) + if cp_sharder is not None: + student_topk_logprobs = cp_sharder.gather_token_tensor( + student_topk_logprobs, seq_dim=1, trim=True + ) + if H_all is not None: + H_all = cp_sharder.gather_token_tensor(H_all, seq_dim=1, trim=True) + # Move teacher tensors to the same device/dtype as student_topk_logits teacher_topk_logits = teacher_topk_logits.to( student_topk_logprobs.device, dtype=student_topk_logprobs.dtype diff --git a/nemo_rl/models/automodel/data.py b/nemo_rl/models/automodel/data.py index 973fc7fff90..da879617aa1 100644 --- a/nemo_rl/models/automodel/data.py +++ b/nemo_rl/models/automodel/data.py @@ -90,8 +90,9 @@ def filter_multimodal_kwargs_for_model( class ProcessedInputs: """Processed microbatch inputs ready for model forward pass. - This structure contains all necessary tensors and metadata for a forward pass, - including context parallel buffers and flash attention configuration. + This structure contains the canonical tensors and metadata needed to prepare + a model forward, including flash-attention configuration. Context-parallel + state is owned by Automodel's per-microbatch sharder. """ # Core inputs (always present) @@ -108,15 +109,6 @@ class ProcessedInputs: # Multimodal (VLM) inputs vlm_kwargs: dict[str, Any] = field(default_factory=dict) - # Context parallel support (cp_size > 1) - cp_buffers: list[torch.Tensor] = field(default_factory=list) - seq_index: Optional[torch.Tensor] = None - - @property - def has_context_parallel(self) -> bool: - """Check if context parallel is enabled.""" - return len(self.cp_buffers) > 0 - @property def has_flash_attention(self) -> bool: """Check if flash attention is configured. @@ -156,7 +148,6 @@ def make_processed_microbatch_iterator( raw_iterator: Iterator[BatchedDataDict[Any]], tokenizer: AutoTokenizer, cfg: dict[str, Any], - cp_size: int, ) -> Iterator[ProcessedMicrobatch]: """Wrap a raw microbatch iterator to yield processed microbatches. @@ -168,7 +159,6 @@ def make_processed_microbatch_iterator( raw_iterator: Iterator yielding raw BatchedDataDict microbatches tokenizer: Tokenizer for processing cfg: Configuration dictionary (enable_seq_packing is inferred from cfg["sequence_packing"]["enabled"]) - cp_size: Context parallel size Yields: ProcessedMicrobatch objects containing processed tensors ready for model forward @@ -187,7 +177,6 @@ def make_processed_microbatch_iterator( tokenizer, enable_seq_packing, cfg, - cp_size, ) yield ProcessedMicrobatch( @@ -204,7 +193,6 @@ def get_microbatch_iterator( mbs: int, dp_mesh: Any, # noqa: ARG001 tokenizer: AutoTokenizer, - cp_size: int = 1, ) -> tuple[Iterator[ProcessedMicrobatch], int]: """Create processed microbatch iterator based on batching strategy. @@ -214,8 +202,6 @@ def get_microbatch_iterator( mbs: Microbatch size dp_mesh: Data parallel mesh tokenizer: Tokenizer for processing - cp_size: Context parallel size - Returns: Tuple of (processed_microbatch_iterator, iterator_length) """ @@ -249,7 +235,6 @@ def get_microbatch_iterator( itertools.chain(mb_iterator, dummy_iterator), tokenizer, cfg, - cp_size, ) return processed_iterator, iterator_len @@ -259,7 +244,6 @@ def process_microbatch( tokenizer: AutoTokenizer, enable_seq_packing: bool, cfg: dict[str, Any], - cp_size: int, ) -> ProcessedInputs: """Process a microbatch and prepare inputs for model forward. @@ -268,8 +252,6 @@ def process_microbatch( tokenizer: Tokenizer for padding value enable_seq_packing: Whether sequence packing is enabled cfg: Configuration dictionary - cp_size: Context parallel size - Returns: ProcessedInputs containing all tensors and metadata for forward pass """ @@ -324,56 +306,12 @@ def process_microbatch( "Sequence parallel is not supported with multimodal since there's an issue when you do not pass position_ids. See https://github.com/NVIDIA-NeMo/Automodel/issues/652" ) - # Prepare context parallel buffers if needed - cp_buffers = [] - seq_index = None - if cp_size > 1: - assert len(vlm_kwargs) == 0, ( - f"multimodal kwargs={vlm_kwargs} are not supported for context parallel" - ) - # CP doesn't support attention_mask — torch's CP SDPA handler requires - # is_causal=True (no explicit mask). Passing an unsplit mask causes a - # DTensor redistribution assertion because the mask isn't in cp_buffers - # and therefore keeps the full sequence length while Q/K/V are split. - # Matches Automodel's cp_utils.py which does batch.pop("attention_mask"). - attention_mask = None - seq_index = torch.arange(seq_len, device=input_ids.device).repeat(1, 1) - cp_buffers = [input_ids, position_ids, seq_index] - - # Cross-tokenizer distillation rides student-seq-aligned alignment / - # mask fields on the same mb. CP-shard the student-seq fields with - # the student cp_mesh so the loss sees matching seq dims against - # the redistributed student logits. Teacher-seq fields (T_t may - # differ from T_s) stay full; the loss slices them contiguously by - # student CP rank because the IPC consumer ships contiguous teacher - # slices (see FullLogitsPostProcessor un-interleave in train.py). - # There is one set of student-seq alignment fields per teacher: - # single-teacher uses the unprefixed ``alignment_student_*`` keys, - # multi-teacher uses ``alignment_{i}_student_*`` (the suffix match - # captures both and excludes teacher-seq ``*_teacher_*`` fields). - student_seq_alignment_fields = [ - k - for k in mb - if k.startswith("alignment_") - and ( - k.endswith("_student_chunk_id") - or k.endswith("_student_exact_partition_mask") - ) - ] - if student_seq_alignment_fields: - if "token_mask" in mb: - cp_buffers.append(mb["token_mask"]) - for student_seq_field in student_seq_alignment_fields: - cp_buffers.append(mb[student_seq_field]) - return ProcessedInputs( input_ids=input_ids, attention_mask=attention_mask, position_ids=position_ids, flash_attn_kwargs=flash_attn_kwargs, vlm_kwargs=vlm_kwargs, - cp_buffers=cp_buffers, - seq_index=seq_index, seq_len=seq_len, ) diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index 5c12ae2b0c8..5d570badb2c 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -380,7 +380,6 @@ def validate_and_prepare_config( "Context parallel is not supported for sequence packing. " "Refer to https://github.com/NVIDIA/NeMo-RL/blob/main/docs/model-quirks.md#context-parallel-with-fsdp2 for more details." ) - if sequence_parallel_enabled and tp_size == 1: print( "[WARNING]: sequence_parallel=True, but tp_size=1 which has no effect. " diff --git a/nemo_rl/models/automodel/train.py b/nemo_rl/models/automodel/train.py index 8a4f2834532..44451dad891 100644 --- a/nemo_rl/models/automodel/train.py +++ b/nemo_rl/models/automodel/train.py @@ -24,13 +24,19 @@ """ from collections import defaultdict +from contextlib import AbstractContextManager +from dataclasses import dataclass from functools import partial from typing import Any, Callable, Iterator, Optional, Tuple, Union import torch +from nemo_automodel.components.distributed.context_parallel import ( + ContextParallelSharder, +) from nemo_automodel.components.distributed.tensor_utils import to_local_if_dtensor from torch import nn -from torch.distributed.tensor import DTensor, Shard +from torch.distributed.device_mesh import DeviceMesh +from torch.distributed.tensor import DTensor from transformers.models.gemma3.modeling_gemma3 import ( Gemma3ForCausalLM, Gemma3ForConditionalGeneration, @@ -42,13 +48,12 @@ need_top_k_or_top_p_filtering, ) from nemo_rl.algorithms.loss import SequencePackingLossWrapper, prepare_loss_input -from nemo_rl.algorithms.loss.interfaces import LossFunction +from nemo_rl.algorithms.loss.interfaces import LossFunction, LossInputType from nemo_rl.algorithms.utils import mask_out_neg_inf_logprobs from nemo_rl.distributed.batched_data_dict import BatchedDataDict from nemo_rl.distributed.model_utils import ( - allgather_cp_sharded_tensor, - cp_load_balanced_to_contiguous, distributed_vocab_topk, + get_cp_sharded_next_token_logprobs, get_logprobs_from_vocab_parallel_logits, ) from nemo_rl.models.automodel.data import ( @@ -68,67 +73,118 @@ ] -def model_forward( - model: nn.Module, - processed_inputs: ProcessedInputs, - is_reward_model: bool = False, - allow_flash_attn_args: bool = True, -) -> torch.Tensor: - """Perform a single forward pass through the model. +@dataclass +class PreparedModelForward: + """Model inputs and Automodel CP state resolved for one microbatch.""" - Args: - model: The model to run forward pass on - processed_inputs: ProcessedInputs containing all tensors for forward pass - is_reward_model: Whether this is a reward model - allow_flash_attn_args: Whether to pass flash_attn_kwargs to model + model_batch: dict[str, Any] + cp_sharder: ContextParallelSharder + model_context_factory: Callable[[], AbstractContextManager[Any]] - Returns: - torch.Tensor: Output tensor from the model (logits) - """ - model_args = dict( - input_ids=processed_inputs.input_ids, - attention_mask=processed_inputs.attention_mask, - position_ids=processed_inputs.position_ids, - use_cache=False, - ) - # Add flash attention kwargs if applicable +def _build_model_batch( + model: nn.Module, + processed_inputs: ProcessedInputs, + *, + is_reward_model: bool, + allow_flash_attn_args: bool, +) -> dict[str, Any]: + """Build a private model-facing batch from canonical inputs.""" + model_batch: dict[str, Any] = { + "input_ids": processed_inputs.input_ids, + "use_cache": False, + } + if processed_inputs.attention_mask is not None: + model_batch["attention_mask"] = processed_inputs.attention_mask + if processed_inputs.position_ids is not None: + model_batch["position_ids"] = processed_inputs.position_ids if processed_inputs.has_flash_attention: - model_args["flash_attn_kwargs"] = processed_inputs.flash_attn_kwargs + model_batch["flash_attn_kwargs"] = processed_inputs.flash_attn_kwargs - # Add VLM kwargs if applicable if processed_inputs.is_multimodal: - model_args.update( + model_batch.update( filter_multimodal_kwargs_for_model(model, processed_inputs.vlm_kwargs) ) - # flash_attn_kwargs is not supported for multimodal - if "flash_attn_kwargs" in model_args: - del model_args["flash_attn_kwargs"] + model_batch.pop("flash_attn_kwargs", None) is_gemma3 = isinstance(model, Gemma3ForCausalLM) or isinstance( model, Gemma3ForConditionalGeneration ) - if is_gemma3 and "token_type_ids" not in model_args: - model_args["token_type_ids"] = torch.zeros_like(processed_inputs.input_ids) + if is_gemma3 and "token_type_ids" not in model_batch: + model_batch["token_type_ids"] = torch.zeros_like(processed_inputs.input_ids) - # Gemma 4 requires mm_token_type_ids even for text-only inputs if getattr(getattr(model, "config", None), "model_type", None) == "gemma4": - if "mm_token_type_ids" not in model_args: - model_args["mm_token_type_ids"] = torch.zeros_like( + if "mm_token_type_ids" not in model_batch: + model_batch["mm_token_type_ids"] = torch.zeros_like( processed_inputs.input_ids ) - # Reward models don't support flash_attn_kwargs - if is_reward_model: - if "flash_attn_kwargs" in model_args: - del model_args["flash_attn_kwargs"] + if is_reward_model or not allow_flash_attn_args: + model_batch.pop("flash_attn_kwargs", None) + + # Automodel may pad or shard these tensors in place. Keep the loss-side + # canonical tensors in ProcessedInputs/data_dict untouched. + for key in ( + "input_ids", + "position_ids", + "attention_mask", + "token_type_ids", + "mm_token_type_ids", + ): + value = model_batch.get(key) + if isinstance(value, torch.Tensor): + model_batch[key] = value.clone() + return model_batch - # Remove flash_attn_kwargs if not allowed - if not allow_flash_attn_args and "flash_attn_kwargs" in model_args: - del model_args["flash_attn_kwargs"] - outputs = model(**model_args) - return outputs +def prepare_model_forward( + model: nn.Module, + processed_inputs: ProcessedInputs, + *, + device_mesh: Optional[DeviceMesh], + padding_token_id: int, + is_reward_model: bool, + allow_flash_attn_args: bool, +) -> PreparedModelForward: + """Resolve Automodel's model batch, CP layout, and forward context.""" + model_batch = _build_model_batch( + model, + processed_inputs, + is_reward_model=is_reward_model, + allow_flash_attn_args=allow_flash_attn_args, + ) + model_batch["labels"] = torch.full_like(processed_inputs.input_ids, -100) + + cp_sharder = ContextParallelSharder( + model, + device_mesh, + model_batch, + padding_token_id=padding_token_id, + num_chunks=1, + ) + model_context_factory, model_batch = cp_sharder.shard(model_batch) + model_batch.pop("labels", None) + return PreparedModelForward( + model_batch=model_batch, + cp_sharder=cp_sharder, + model_context_factory=model_context_factory, + ) + + +def model_forward( + model: nn.Module, + model_batch: dict[str, Any], +) -> Any: + """Run a model on an Automodel-prepared batch. + + Args: + model: The model to run. + model_batch: Private batch returned by the CP sharder. + + Returns: + Model-specific forward output. + """ + return model(**model_batch) def extract_logits( @@ -191,102 +247,33 @@ def apply_top_k_top_p_filtering_for_local_logits( return logits -def redistribute_logits_for_cp( - logits: torch.Tensor, - device_mesh: Any, - cp_mesh: Any, # noqa: ARG001 - sequence_dim: int = 1, -) -> DTensor: - """Redistribute logits for context parallel processing. - - Handles the case where logits may be TP-sharded DTensor or regular tensor, - and converts them to CP+TP sharded DTensor. +def _cp_gather_logits( + logits: torch.Tensor | DTensor, + cp_sharder: ContextParallelSharder, + seq_dim: int = 1, +) -> torch.Tensor | DTensor: + """Restore CP-local logits to canonical full-sequence order. - Args: - logits: Logits tensor (may be DTensor or regular tensor) - device_mesh: Full device mesh - cp_mesh: Context parallel mesh (kept for signature compatibility) - sequence_dim: Dimension for sequence sharding - - Returns: - DTensor sharded on both CP and TP dimensions + Keeps a tensor-parallel ``DTensor`` a ``DTensor`` on the same vocabulary + mesh: only the sequence dimension is reassembled. """ if isinstance(logits, DTensor): - # Must be tp sharded - assert ( - logits.device_mesh.ndim == 1 - and logits.device_mesh.mesh_dim_names[0] == "tp" - ), "logits must be tp sharded" - - # CP is implicitly sharded on the seq dim, so we need to redistribute to the tp dim - logits = DTensor.from_local( - logits.to_local(), - device_mesh=device_mesh[("cp", "tp")], - placements=[Shard(sequence_dim), Shard(-1)], - ) - else: - logits = DTensor.from_local( - logits, - device_mesh=device_mesh[("cp", "tp")], - placements=[Shard(sequence_dim), Shard(-1)], + gathered = cp_sharder.gather_token_tensor( + logits.to_local(), seq_dim=seq_dim, trim=True ) - return logits - - -def prepare_data_for_cp( - mb: BatchedDataDict[Any], - processed_inputs: ProcessedInputs, - cp_mesh: Any, - sequence_dim: int = 1, -) -> tuple[torch.Tensor, BatchedDataDict[Any]]: - """Prepare data for context parallel processing. - - Converts seq_index to full tensor and wraps CP-sharded tensors in DTensor. - - Args: - mb: Microbatch data dictionary - processed_inputs: Processed inputs containing CP buffers - cp_mesh: Context parallel mesh - sequence_dim: Dimension for sequence sharding - - Returns: - Tuple of (seq_index_dtensor, updated_mb) - """ - seq_index_dtensor = ( - DTensor.from_local( - processed_inputs.seq_index, - device_mesh=cp_mesh, - placements=[Shard(1)], + return DTensor.from_local( + gathered, + device_mesh=logits.device_mesh, + placements=logits.placements, ) - .full_tensor() - .squeeze(0) - ) - - mb["seq_index"] = seq_index_dtensor - - for tensor_name in mb: - current_tensor = mb[tensor_name] - for buffer in processed_inputs.cp_buffers: - if current_tensor is buffer: - assert type(current_tensor) == torch.Tensor, ( - f"tensor {tensor_name} is not a tensor" - ) - mb[tensor_name] = DTensor.from_local( - current_tensor, - device_mesh=cp_mesh, - placements=[Shard(sequence_dim)], - ) - break - - return seq_index_dtensor, mb + return cp_sharder.gather_token_tensor(logits, seq_dim=seq_dim, trim=True) def forward_with_post_processing_fn( model: nn.Module, + prepared: PreparedModelForward, post_processing_fn: PostProcessingFunction, processed_mb: ProcessedMicrobatch, - is_reward_model: bool = False, - allow_flash_attn_args: bool = True, global_valid_seqs: Optional[torch.Tensor] = None, global_valid_toks: Optional[torch.Tensor] = None, sampling_params: Optional[TrainingSamplingParams] = None, @@ -303,10 +290,9 @@ def forward_with_post_processing_fn( Args: model: The model to run forward pass on + prepared: Per-microbatch model batch, CP layout, and forward context. post_processing_fn: Post-processing function to apply to the logits processed_mb: Pre-fetched ProcessedMicrobatch containing data and processed inputs - is_reward_model: Whether this is a reward model - allow_flash_attn_args: Whether to pass flash_attn_kwargs to model global_valid_seqs: Global valid sequence count for loss normalization global_valid_toks: Global valid token count for loss normalization sampling_params: Sampling parameters (top-k, top-p, temperature) @@ -323,12 +309,7 @@ def forward_with_post_processing_fn( processed_inputs = processed_mb.processed_inputs # Model forward pass - outputs = model_forward( - model, - processed_inputs, - is_reward_model=is_reward_model, - allow_flash_attn_args=allow_flash_attn_args, - ) + outputs = model_forward(model, prepared.model_batch) # Extract logits from model outputs logits = extract_logits(model, outputs) @@ -358,6 +339,7 @@ def forward_with_post_processing_fn( processed_inputs=processed_inputs, global_valid_seqs=global_valid_seqs, global_valid_toks=global_valid_toks, + cp_sharder=prepared.cp_sharder, sequence_dim=sequence_dim, ) elif isinstance( @@ -370,6 +352,7 @@ def forward_with_post_processing_fn( processed_inputs=processed_inputs, original_batch_size=processed_mb.original_batch_size, original_seq_len=processed_mb.original_seq_len, + cp_sharder=prepared.cp_sharder, sequence_dim=sequence_dim, ) if isinstance(post_processing_fn, LogprobsPostProcessor): @@ -384,6 +367,7 @@ def forward_with_post_processing_fn( processed_inputs=processed_inputs, original_batch_size=processed_mb.original_batch_size, original_seq_len=processed_mb.original_seq_len, + cp_sharder=prepared.cp_sharder, sequence_dim=sequence_dim, ) metrics = {"full_logits": result} @@ -403,6 +387,9 @@ def automodel_forward_backward( model: nn.Module, data_iterator: Iterator[ProcessedMicrobatch], post_processing_fn: PostProcessingFunction, + device_mesh: Optional[DeviceMesh], + padding_token_id: int, + autocast_context_factory: Callable[[], AbstractContextManager[Any]], forward_only: bool = False, is_reward_model: bool = False, allow_flash_attn_args: bool = True, @@ -413,7 +400,6 @@ def automodel_forward_backward( dp_size: int = 1, cp_size: int = 1, num_global_batches: int = 1, - train_context_fn: Optional[Callable[[ProcessedInputs], Any]] = None, num_valid_microbatches: Optional[int] = None, on_microbatch_start: Optional[Callable[[int], None]] = None, ) -> list[Tuple[Any, dict[str, Any]]]: @@ -428,8 +414,10 @@ def automodel_forward_backward( Args: model: The model to train data_iterator: Iterator yielding ProcessedMicrobatch objects (already processed) - num_microbatches: Number of microbatches to process post_processing_fn: Post-processing function to apply to the logits + device_mesh: Worker device mesh used by Automodel CP resolution. + padding_token_id: Token ID used for Automodel sequence padding. + autocast_context_factory: Worker-owned precision context factory. forward_only: If True, skip backward pass is_reward_model: Whether this is a reward model allow_flash_attn_args: Whether to pass flash_attn_kwargs to model @@ -440,8 +428,6 @@ def automodel_forward_backward( dp_size: Data parallel size cp_size: Context parallel size num_global_batches: Number of global batches (for metric scaling) - train_context_fn: Optional callable that takes ProcessedInputs and returns - a context manager for the forward/backward pass. If None, no context is used. num_valid_microbatches: Number of valid (non-dummy) microbatches. If provided, microbatches beyond this index are treated as dummy batches (loss *= 0). If None, all microbatches are considered valid. @@ -451,8 +437,6 @@ def automodel_forward_backward( Returns: List of (result, metrics) tuples from each microbatch """ - from contextlib import nullcontext - results = [] for mb_idx, processed_mb in enumerate(data_iterator): @@ -460,22 +444,22 @@ def automodel_forward_backward( if on_microbatch_start is not None: on_microbatch_start(mb_idx) - processed_inputs = processed_mb.processed_inputs - - # Create train context if factory provided, otherwise use nullcontext - if train_context_fn is not None: - ctx = train_context_fn(processed_inputs) - else: - ctx = nullcontext() + prepared = prepare_model_forward( + model, + processed_mb.processed_inputs, + device_mesh=device_mesh, + padding_token_id=padding_token_id, + is_reward_model=is_reward_model, + allow_flash_attn_args=allow_flash_attn_args, + ) - with ctx: + with prepared.model_context_factory(), autocast_context_factory(): # Forward pass with post-processing result, metrics, _ = forward_with_post_processing_fn( model=model, + prepared=prepared, post_processing_fn=post_processing_fn, processed_mb=processed_mb, - is_reward_model=is_reward_model, - allow_flash_attn_args=allow_flash_attn_args, global_valid_seqs=global_valid_seqs, global_valid_toks=global_valid_toks, sampling_params=sampling_params, @@ -508,9 +492,12 @@ def automodel_forward_backward( ## by zero in the loss function to prevent them ## from affecting the gradient calculation - # when FSDP reduces the gradients over the DP dim, they're automatically averaged - # but we want to sum them so we cancel out the average here - loss = result * dp_size * cp_size + loss = ( + result + * dp_size + * cp_size + / post_processing_fn.cp_gradient_fanout + ) loss.backward() results.append((result, metrics)) @@ -555,6 +542,22 @@ def __init__( self.dp_size = dp_size self.enable_seq_packing = enable_seq_packing self.sampling_params = sampling_params + self._cp_gradient_fanout = ( + cp_size + if cp_size > 1 + and loss_fn.input_type + in ( + LossInputType.LOGIT, + LossInputType.LOGPROB, + LossInputType.DISTILLATION, + ) + else 1 + ) + + @property + def cp_gradient_fanout(self) -> int: + """Number of CP loss consumers for each local model contribution.""" + return self._cp_gradient_fanout def __call__( self, @@ -563,6 +566,8 @@ def __call__( processed_inputs: ProcessedInputs, global_valid_seqs: torch.Tensor, global_valid_toks: torch.Tensor, + *, + cp_sharder: ContextParallelSharder, sequence_dim: int = 1, ) -> tuple[torch.Tensor, dict[str, Any]]: """Compute loss from logits. @@ -573,23 +578,40 @@ def __call__( processed_inputs: Processed inputs global_valid_seqs: Global valid sequence count global_valid_toks: Global valid token count + cp_sharder: Per-microbatch Automodel sequence-layout owner. sequence_dim: Sequence dimension Returns: Tuple of (loss, metrics) """ - # Handle CP redistribution - if self.cp_size > 1: - _, data_dict = prepare_data_for_cp( - data_dict, processed_inputs, self.cp_mesh, sequence_dim - ) - logits = redistribute_logits_for_cp( - logits, self.device_mesh, self.cp_mesh, sequence_dim - ) + # Under CP, ``logits`` is this rank's local shard while ``data_dict`` + # stays canonical; the sharder maps between the two. + token_layout = cp_sharder if self.cp_size > 1 else None + if token_layout is not None: + input_type = self.loss_fn.input_type + if input_type == LossInputType.LOGIT: + # Logit losses (value-head MSE, DPO) consume full-sequence logits + # against the canonical data_dict, so restore canonical order here + # while keeping any vocabulary (TP) sharding intact. + logits = _cp_gather_logits(logits, token_layout, sequence_dim) + elif input_type not in ( + LossInputType.LOGPROB, + LossInputType.DISTILLATION, + LossInputType.DISTILLATION_CROSS_TOKENIZER, + ): + raise NotImplementedError( + f"Loss input type {input_type} is not supported with " + "context_parallel_size > 1 on the automodel policy worker." + ) # Wrap prepare_loss_input with sampling_params prepare_loss_input_wrapped = partial( - prepare_loss_input, sampling_params=self.sampling_params + prepare_loss_input, + sampling_params=self.sampling_params, + context_parallel_group=( + self.cp_mesh.get_group() if self.cp_size > 1 else None + ), + cp_sharder=token_layout, ) # Wrap loss function for sequence packing if needed if self.enable_seq_packing: @@ -659,6 +681,8 @@ def __call__( processed_inputs: ProcessedInputs, original_batch_size: int, original_seq_len: int, + *, + cp_sharder: ContextParallelSharder, sequence_dim: int = 1, ) -> torch.Tensor: """Compute token log probabilities from logits. @@ -669,45 +693,31 @@ def __call__( processed_inputs: Processed inputs original_batch_size: Original batch size before packing original_seq_len: Original sequence length before packing + cp_sharder: Per-microbatch Automodel sequence-layout owner. sequence_dim: Sequence dimension Returns: Token log probabilities tensor [batch_size, seq_length] """ - seq_len = processed_inputs.seq_len input_lengths = data_dict["input_lengths"] if self.cp_size > 1: - seq_index_tensor = ( - DTensor.from_local( - processed_inputs.seq_index, - device_mesh=self.cp_mesh, - placements=[Shard(1)], - ) - .full_tensor() - .squeeze(0) - ) - - input_ids_dtensor = DTensor.from_local( - processed_inputs.input_ids, - device_mesh=self.cp_mesh, - placements=[Shard(sequence_dim)], - ) - - logits = redistribute_logits_for_cp( - logits, self.device_mesh, self.cp_mesh, sequence_dim - ) - - token_logprobs = get_logprobs_from_vocab_parallel_logits( + # ``processed_inputs.input_ids`` is the CP-local (and possibly padded) + # shard once the forward context is entered, so the canonical + # sequence has to come from the untouched microbatch data. + canonical_input_ids = data_dict["input_ids"] + seq_len = canonical_input_ids.shape[1] + token_logprobs = get_cp_sharded_next_token_logprobs( logits, - input_ids_dtensor, - seq_index_tensor, + canonical_input_ids, + cp_sharder, chunk_size=self.logprob_chunk_size, sampling_params=self.sampling_params, # top-k and top-p filtering ) assert token_logprobs.shape[1] == seq_len - 1 else: + seq_len = processed_inputs.seq_len if isinstance(logits, DTensor): # DTensor path with TP sharding token_logprobs = get_logprobs_from_vocab_parallel_logits( @@ -869,6 +879,8 @@ def __call__( processed_inputs: ProcessedInputs, original_batch_size: int, original_seq_len: int, + *, + cp_sharder: ContextParallelSharder, sequence_dim: int = 1, ) -> tuple[torch.Tensor, torch.Tensor]: """Compute top-k logits and indices from model outputs. @@ -879,6 +891,7 @@ def __call__( processed_inputs: Processed inputs original_batch_size: Original batch size before packing original_seq_len: Original sequence length before packing + cp_sharder: Per-microbatch Automodel sequence-layout owner. sequence_dim: Sequence dimension Returns: @@ -887,12 +900,8 @@ def __call__( input_lengths = data_dict["input_lengths"] if self.cp_size > 1: - logits = redistribute_logits_for_cp( - logits, self.device_mesh, self.cp_mesh, sequence_dim - ) - - # Deal with TP first - local_logits = logits.to_local() # [B, S_cp, V_tp] + # Deal with TP first; the logits are already this rank's CP shard. + local_logits = to_local_if_dtensor(logits) # [B, S_cp, V_tp] tp_group = self.tp_mesh.get_group() tp_rank = torch.distributed.get_rank(tp_group) @@ -909,10 +918,9 @@ def __call__( ) # [B, S_cp, k] - cp_group = self.cp_mesh.get_group() - - vals = allgather_cp_sharded_tensor(vals, cp_group, seq_dim=sequence_dim) - idx = allgather_cp_sharded_tensor(idx, cp_group, seq_dim=sequence_dim) + # Automodel's layout restores canonical order and trims its CP padding. + vals = cp_sharder.gather_token_tensor(vals, seq_dim=sequence_dim, trim=True) + idx = cp_sharder.gather_token_tensor(idx, seq_dim=sequence_dim, trim=True) # [B, S, k] else: # Compute top-k over full sequence length @@ -1004,6 +1012,8 @@ def __call__( processed_inputs: Any, original_batch_size: int, original_seq_len: int, + *, + cp_sharder: ContextParallelSharder, sequence_dim: int = 1, ) -> torch.Tensor: if self.enable_seq_packing: @@ -1016,15 +1026,21 @@ def __call__( # projection (KL math), and a dtype-consistent IPC buffer producer<->consumer. logits = logits.to(torch.float32) - # context_parallel shards the seq dim load-balanced (interleaved), but the - # IPC consumer routes by contiguous ``global_seq_start`` over the teacher CP - # group. Restore global order and emit this rank's contiguous slice, else - # heterogeneous teacher_cp != student_cp lands teacher data at the wrong - # seq positions in the consumer's dest tensor. + # Automodel's CP layout is not contiguous per rank, but the IPC consumer + # routes by contiguous ``global_seq_start`` over the teacher CP group. + # Restore canonical order (trimming Automodel's CP padding) and emit this + # rank's contiguous slice, else heterogeneous teacher_cp != student_cp + # lands teacher data at the wrong seq positions in the consumer's dest + # tensor. if self.cp_size > 1 and self.cp_mesh is not None: - logits = cp_load_balanced_to_contiguous( - logits, cp_group=self.cp_mesh.get_group(), seq_dim=sequence_dim + full = cp_sharder.gather_token_tensor( + logits, seq_dim=sequence_dim, trim=True ) + local_len = full.shape[sequence_dim] // self.cp_size + cp_rank = torch.distributed.get_rank(self.cp_mesh.get_group()) + logits = full.narrow( + sequence_dim, cp_rank * local_len, local_len + ).contiguous() return logits # [B, S_local_contiguous, V_t] diff --git a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py index 5f94fac1e31..5b11c598811 100644 --- a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py +++ b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import contextlib import gc import warnings from contextlib import AbstractContextManager, contextmanager, nullcontext @@ -21,12 +20,6 @@ import ray import torch from nemo_automodel.components._peft.lora import LinearLoRA -from nemo_automodel.components.distributed.context_parallel.utils import ( - create_context_parallel_ctx, -) -from nemo_automodel.components.distributed.context_parallel.utils import ( - get_train_context as get_train_context_automodel, -) from nemo_automodel.components.distributed.tensor_utils import ( get_cpu_state_dict, to_local_if_dtensor, @@ -60,6 +53,7 @@ aggregate_training_statistics, automodel_forward_backward, forward_with_post_processing_fn, + prepare_model_forward, ) from nemo_rl.models.policy import PolicyConfig from nemo_rl.models.policy.interfaces import ( @@ -184,35 +178,6 @@ def _maybe_adapt_tensor_to_hf( return [(fqn, tensor)] -@contextlib.contextmanager -def get_train_context( - cp_size: int, - cp_mesh: Any, - cp_buffers: list, - sequence_dim: int, - dtype: torch.dtype, - autocast_enabled: bool = True, -) -> Generator[None, None, None]: - """Create combined context manager for training with context parallel and autocast.""" - with contextlib.ExitStack() as stack: - context_parallel_ctx = None - if cp_size > 1: - # Create context parallel context - context_parallel_ctx = create_context_parallel_ctx( - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - cp_seq_dims=[sequence_dim] * len(cp_buffers), - cp_no_restore_buffers=set(cp_buffers), - ) - - stack.enter_context( - get_train_context_automodel(False, False, context_parallel_ctx)() - ) - if autocast_enabled: - stack.enter_context(torch.autocast(device_type="cuda", dtype=dtype)) - yield - - # Classes with @ray.remote can't be inherited from, so we split the implementation out. # This is useful when using worker extension classes. class DTensorPolicyWorkerV2Impl( @@ -410,6 +375,16 @@ def _update_moe_gate_bias_if_supported(self) -> None: if update_moe_gate_bias is not None: update_moe_gate_bias() + def _autocast_context(self) -> AbstractContextManager[Any]: + """Return the worker-owned precision context for one microbatch.""" + if not self.autocast_enabled: + return nullcontext() + return torch.autocast(device_type="cuda", dtype=self.dtype) + + def set_rollout_num_gpus_per_engine(self, num_gpus_per_engine: int) -> None: + """Record the rollout engine's TP size for later use in ``stream_weights_via_http``.""" + self._rollout_num_gpus_per_engine = num_gpus_per_engine + @wrap_with_nvtx_name("dtensor_policy_worker_v2/train") def train( self, @@ -459,17 +434,6 @@ def train( sampling_params=self.sampling_params, ) - # Create train context factory - def train_context_fn(processed_inputs): - return get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ) - # Setup cache clearing callback if configured empty_cache_steps = self.cfg.get("dtensor_cfg", {}).get( "clear_cache_every_n_steps" @@ -511,7 +475,6 @@ def on_microbatch_start(mb_idx): mbs, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) # Use automodel_forward_backward for the training loop @@ -519,6 +482,9 @@ def on_microbatch_start(mb_idx): model=self.model, data_iterator=processed_iterator, post_processing_fn=loss_post_processor, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + autocast_context_factory=self._autocast_context, forward_only=eval_mode, is_reward_model=self._is_reward_model, allow_flash_attn_args=self.allow_flash_attn_args, @@ -529,7 +495,6 @@ def on_microbatch_start(mb_idx): dp_size=self.dp_size, cp_size=self.cp_size, num_global_batches=num_global_batches, - train_context_fn=train_context_fn, num_valid_microbatches=iterator_len, on_microbatch_start=on_microbatch_start, ) @@ -647,27 +612,26 @@ def get_logprobs( logprob_batch_size, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) for batch_idx, processed_mb in enumerate(processed_iterator): processed_inputs = processed_mb.processed_inputs + prepared = prepare_model_forward( + self.model, + processed_inputs, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + is_reward_model=False, + allow_flash_attn_args=self.allow_flash_attn_args, + ) - with get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ): + with prepared.model_context_factory(), self._autocast_context(): # Use forward_with_post_processing_fn for forward pass and post-processing token_logprobs, _metrics, _ = forward_with_post_processing_fn( model=self.model, + prepared=prepared, post_processing_fn=logprobs_post_processor, processed_mb=processed_mb, - is_reward_model=False, - allow_flash_attn_args=self.allow_flash_attn_args, sampling_params=self.sampling_params, sequence_dim=sequence_dim, ) @@ -716,28 +680,27 @@ def score(self, data: BatchedDataDict) -> BatchedDataDict[ScoreOutputSpec]: global_batch_size, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) all_rm_scores = [] for batch_idx, processed_mb in enumerate(processed_iterator): processed_inputs = processed_mb.processed_inputs + prepared = prepare_model_forward( + self.model, + processed_inputs, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + is_reward_model=True, + allow_flash_attn_args=False, + ) - with get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ): + with prepared.model_context_factory(), self._autocast_context(): # Use forward_with_post_processing_fn for forward pass and post-processing rm_scores, _metrics, _ = forward_with_post_processing_fn( model=self.model, + prepared=prepared, post_processing_fn=score_post_processor, processed_mb=processed_mb, - is_reward_model=True, - allow_flash_attn_args=False, sampling_params=self.sampling_params, sequence_dim=sequence_dim, ) @@ -807,27 +770,26 @@ def get_topk_logits( topk_batch_size, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) for batch_idx, processed_mb in enumerate(processed_iterator): processed_inputs = processed_mb.processed_inputs + prepared = prepare_model_forward( + self.model, + processed_inputs, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + is_reward_model=False, + allow_flash_attn_args=self.allow_flash_attn_args, + ) - with get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ): + with prepared.model_context_factory(), self._autocast_context(): # Use forward_with_post_processing_fn for forward pass and post-processing (vals, idx), _metrics, _ = forward_with_post_processing_fn( model=self.model, + prepared=prepared, post_processing_fn=topk_post_processor, processed_mb=processed_mb, - is_reward_model=False, - allow_flash_attn_args=self.allow_flash_attn_args, sampling_params=self.sampling_params, sequence_dim=sequence_dim, ) @@ -926,24 +888,23 @@ def get_full_logits_ipc( forward_batch_size, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) for buf_idx, processed_mb in enumerate(processed_iterator): processed_inputs = processed_mb.processed_inputs - with get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ): + prepared = prepare_model_forward( + self.model, + processed_inputs, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + is_reward_model=False, + allow_flash_attn_args=self.allow_flash_attn_args, + ) + with prepared.model_context_factory(), self._autocast_context(): vals, _metrics, _ = forward_with_post_processing_fn( model=self.model, + prepared=prepared, post_processing_fn=post_processor, processed_mb=processed_mb, - is_reward_model=False, - allow_flash_attn_args=self.allow_flash_attn_args, sampling_params=self.sampling_params, sequence_dim=sequence_dim, ) diff --git a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py index ff0ac7d6a26..c836b085043 100644 --- a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py +++ b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py @@ -12,20 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import contextlib import gc import warnings from contextlib import AbstractContextManager, nullcontext -from typing import Any, Generator, Optional +from typing import Any, Optional import ray import torch -from nemo_automodel.components.distributed.context_parallel.utils import ( - create_context_parallel_ctx, -) -from nemo_automodel.components.distributed.context_parallel.utils import ( - get_train_context as get_train_context_automodel, -) from nemo_automodel.components.training.utils import scale_grads_and_clip_grad_norm from torch import nn from transformers import ( @@ -51,6 +44,7 @@ aggregate_training_statistics, automodel_forward_backward, forward_with_post_processing_fn, + prepare_model_forward, ) from nemo_rl.models.policy.utils import get_runtime_env_for_policy_worker from nemo_rl.models.policy.workers.base_policy_worker import AbstractPolicyWorker @@ -93,35 +87,6 @@ def __getattr__(self, name): return getattr(self._inner, name) -@contextlib.contextmanager -def get_train_context( - cp_size: int, - cp_mesh: Any, - cp_buffers: list, - sequence_dim: int, - dtype: torch.dtype, - autocast_enabled: bool = True, -) -> Generator[None, None, None]: - """Create combined context manager for training with context parallel and autocast.""" - with contextlib.ExitStack() as stack: - context_parallel_ctx = None - if cp_size > 1: - # Create context parallel context - context_parallel_ctx = create_context_parallel_ctx( - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - cp_seq_dims=[sequence_dim] * len(cp_buffers), - cp_no_restore_buffers=set(cp_buffers), - ) - - stack.enter_context( - get_train_context_automodel(False, False, context_parallel_ctx)() - ) - if autocast_enabled: - stack.enter_context(torch.autocast(device_type="cuda", dtype=dtype)) - yield - - # Classes with @ray.remote can't be inherited from, so we split the implementation out. # This is useful when using worker extension classes. class DTensorValueWorkerV2Impl(AbstractPolicyWorker): @@ -261,6 +226,12 @@ def __init__( _runtime_is_reward_model, ) = runtime_config + def _autocast_context(self) -> AbstractContextManager[Any]: + """Return the worker-owned precision context for one model forward.""" + if not self.autocast_enabled: + return nullcontext() + return torch.autocast(device_type="cuda", dtype=self.dtype) + @wrap_with_nvtx_name("dtensor_value_worker_v2/train") def train( self, @@ -310,17 +281,6 @@ def train( enable_seq_packing=self.enable_seq_packing, ) - # Create train context factory - def train_context_fn(processed_inputs): - return get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ) - # Setup cache clearing callback if configured empty_cache_steps = self.cfg.get("dtensor_cfg", {}).get( "clear_cache_every_n_steps" @@ -361,7 +321,6 @@ def on_microbatch_start(mb_idx): mbs, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) # Use automodel_forward_backward for the training loop. @@ -369,6 +328,9 @@ def on_microbatch_start(mb_idx): model=self.model, data_iterator=processed_iterator, post_processing_fn=loss_post_processor, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + autocast_context_factory=self._autocast_context, forward_only=eval_mode, is_reward_model=True, # Value models use reward model architecture allow_flash_attn_args=False, # Typically False for value models @@ -378,7 +340,6 @@ def on_microbatch_start(mb_idx): dp_size=self.dp_size, cp_size=self.cp_size, num_global_batches=num_global_batches, - train_context_fn=train_context_fn, num_valid_microbatches=iterator_len, on_microbatch_start=on_microbatch_start, ) @@ -473,27 +434,26 @@ def get_values( value_batch_size, self.dp_mesh, tokenizer=self.tokenizer, - cp_size=self.cp_size, ) for batch_idx, processed_mb in enumerate(processed_iterator): processed_inputs = processed_mb.processed_inputs + prepared = prepare_model_forward( + self.model, + processed_inputs, + device_mesh=self.device_mesh, + padding_token_id=self.tokenizer.pad_token_id or 0, + is_reward_model=True, + allow_flash_attn_args=False, + ) - with get_train_context( - cp_size=self.cp_size, - cp_mesh=self.cp_mesh, - cp_buffers=processed_inputs.cp_buffers, - sequence_dim=sequence_dim, - dtype=self.dtype, - autocast_enabled=self.autocast_enabled, - ): + with prepared.model_context_factory(), self._autocast_context(): # Use forward_with_post_processing_fn for forward pass. values, _metrics, _ = forward_with_post_processing_fn( model=self.model, + prepared=prepared, post_processing_fn=value_post_processor, processed_mb=processed_mb, - is_reward_model=True, # Value models use reward model architecture - allow_flash_attn_args=False, sequence_dim=sequence_dim, ) # Mirror train()'s right-shift so GAE / value clipping / From bbc781ac672bbfbdd4e74a2ae6caac75ab321f4c Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Tue, 4 Aug 2026 03:05:35 -0700 Subject: [PATCH 07/34] fix(automodel): refine context parallel handling Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/loss/loss_functions.py | 10 ++- nemo_rl/models/automodel/setup.py | 7 ++ nemo_rl/models/automodel/train.py | 86 ++++++++++++------- .../workers/dtensor_policy_worker_v2.py | 4 + .../value/workers/dtensor_value_worker_v2.py | 1 + 5 files changed, 76 insertions(+), 32 deletions(-) diff --git a/nemo_rl/algorithms/loss/loss_functions.py b/nemo_rl/algorithms/loss/loss_functions.py index 54af3216ac3..931c500b459 100755 --- a/nemo_rl/algorithms/loss/loss_functions.py +++ b/nemo_rl/algorithms/loss/loss_functions.py @@ -42,6 +42,7 @@ DistributedCrossEntropy, cp_shift_next, group_all_reduce_sum, + group_all_reduce_sum_with_grad, vocab_parallel_full_log_softmax, vocab_parallel_gather_columns, vocab_parallel_log_softmax, @@ -1643,6 +1644,7 @@ def __call__( global_valid_toks, student_next_token_logprobs=student_next_token_logprobs, student_next_token_mask=student_next_token_mask, + cp_group=cp_group, ) if self.kd_loss_mode == "sum": @@ -2660,6 +2662,7 @@ def _compute_ce( *, student_next_token_logprobs: Optional[torch.Tensor] = None, student_next_token_mask: Optional[torch.Tensor] = None, + cp_group: Optional[torch.distributed.ProcessGroup] = None, ) -> torch.Tensor: """Next-token CE on the student side (TP/CP handled by the helpers).""" if student_next_token_logprobs is not None: @@ -2669,11 +2672,16 @@ def _compute_ce( ) * to_local_if_dtensor(data["sample_mask"]).to( student_next_token_logprobs.device ).unsqueeze(-1) - return masked_mean( + local_ce = masked_mean( -student_next_token_logprobs, label_mask, global_normalization_factor=global_valid_toks, ) + # Each CP rank owns one contiguous CE window. Sum the normalized + # windows so every rank uses the same CE value (and therefore the + # same dynamic KD scale), while identity backward preserves the + # partitioned-loss gradient fanout of one. + return group_all_reduce_sum_with_grad(local_ce, cp_group) per_token_ce = student_next_token_ce( logits, input_ids=data["input_ids"], seq_index=data.get("seq_index") diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index 5d570badb2c..6137fe48ed3 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -312,6 +312,12 @@ def validate_and_prepare_config( # so we need to set it to None if sequence packing is disabled # See https://github.com/NVIDIA-NeMo/Automodel/blob/7e748be260651349307862426c0c168cebdeeec3/nemo_automodel/components/_transformers/auto_model.py#L180 cp_size_cfg = config["dtensor_cfg"]["context_parallel_size"] + if is_vlm and cp_size_cfg > 1: + raise ValueError( + "Context parallel is not supported for VLM models on the Automodel " + "policy worker. Set policy.dtensor_cfg.context_parallel_size = 1." + ) + attn_impl = ( "flash_attention_2" if (enable_seq_packing and cp_size_cfg == 1) @@ -380,6 +386,7 @@ def validate_and_prepare_config( "Context parallel is not supported for sequence packing. " "Refer to https://github.com/NVIDIA/NeMo-RL/blob/main/docs/model-quirks.md#context-parallel-with-fsdp2 for more details." ) + if sequence_parallel_enabled and tp_size == 1: print( "[WARNING]: sequence_parallel=True, but tp_size=1 which has no effect. " diff --git a/nemo_rl/models/automodel/train.py b/nemo_rl/models/automodel/train.py index 44451dad891..b9e8150e597 100644 --- a/nemo_rl/models/automodel/train.py +++ b/nemo_rl/models/automodel/train.py @@ -24,7 +24,7 @@ """ from collections import defaultdict -from contextlib import AbstractContextManager +from contextlib import AbstractContextManager, nullcontext from dataclasses import dataclass from functools import partial from typing import Any, Callable, Iterator, Optional, Tuple, Union @@ -75,10 +75,11 @@ @dataclass class PreparedModelForward: - """Model inputs and Automodel CP state resolved for one microbatch.""" + """Model inputs and optional Automodel CP state for one microbatch.""" model_batch: dict[str, Any] - cp_sharder: ContextParallelSharder + cp_size: int + cp_sharder: Optional[ContextParallelSharder] model_context_factory: Callable[[], AbstractContextManager[Any]] @@ -88,8 +89,9 @@ def _build_model_batch( *, is_reward_model: bool, allow_flash_attn_args: bool, + clone_model_tensors: bool, ) -> dict[str, Any]: - """Build a private model-facing batch from canonical inputs.""" + """Build a model-facing batch from canonical inputs.""" model_batch: dict[str, Any] = { "input_ids": processed_inputs.input_ids, "use_cache": False, @@ -122,18 +124,19 @@ def _build_model_batch( if is_reward_model or not allow_flash_attn_args: model_batch.pop("flash_attn_kwargs", None) - # Automodel may pad or shard these tensors in place. Keep the loss-side - # canonical tensors in ProcessedInputs/data_dict untouched. - for key in ( - "input_ids", - "position_ids", - "attention_mask", - "token_type_ids", - "mm_token_type_ids", - ): - value = model_batch.get(key) - if isinstance(value, torch.Tensor): - model_batch[key] = value.clone() + if clone_model_tensors: + # Automodel may pad or shard these tensors in place. Keep the loss-side + # canonical tensors in ProcessedInputs/data_dict untouched under CP. + for key in ( + "input_ids", + "position_ids", + "attention_mask", + "token_type_ids", + "mm_token_type_ids", + ): + value = model_batch.get(key) + if isinstance(value, torch.Tensor): + model_batch[key] = value.clone() return model_batch @@ -142,17 +145,28 @@ def prepare_model_forward( processed_inputs: ProcessedInputs, *, device_mesh: Optional[DeviceMesh], + cp_size: int, padding_token_id: int, is_reward_model: bool, allow_flash_attn_args: bool, ) -> PreparedModelForward: - """Resolve Automodel's model batch, CP layout, and forward context.""" + """Prepare the model batch and resolve Automodel CP state when active.""" model_batch = _build_model_batch( model, processed_inputs, is_reward_model=is_reward_model, allow_flash_attn_args=allow_flash_attn_args, + clone_model_tensors=cp_size > 1, ) + + if cp_size <= 1: + return PreparedModelForward( + model_batch=model_batch, + cp_size=cp_size, + cp_sharder=None, + model_context_factory=nullcontext, + ) + model_batch["labels"] = torch.full_like(processed_inputs.input_ids, -100) cp_sharder = ContextParallelSharder( @@ -166,6 +180,7 @@ def prepare_model_forward( model_batch.pop("labels", None) return PreparedModelForward( model_batch=model_batch, + cp_size=cp_size, cp_sharder=cp_sharder, model_context_factory=model_context_factory, ) @@ -307,6 +322,11 @@ def forward_with_post_processing_fn( # Extract the processed components data_dict = processed_mb.data_dict processed_inputs = processed_mb.processed_inputs + cp_sharder = prepared.cp_sharder + if prepared.cp_size > 1 and cp_sharder is None: + raise RuntimeError( + "ContextParallelSharder is required when context_parallel_size > 1" + ) # Model forward pass outputs = model_forward(model, prepared.model_batch) @@ -339,7 +359,7 @@ def forward_with_post_processing_fn( processed_inputs=processed_inputs, global_valid_seqs=global_valid_seqs, global_valid_toks=global_valid_toks, - cp_sharder=prepared.cp_sharder, + cp_sharder=cp_sharder, sequence_dim=sequence_dim, ) elif isinstance( @@ -352,7 +372,7 @@ def forward_with_post_processing_fn( processed_inputs=processed_inputs, original_batch_size=processed_mb.original_batch_size, original_seq_len=processed_mb.original_seq_len, - cp_sharder=prepared.cp_sharder, + cp_sharder=cp_sharder, sequence_dim=sequence_dim, ) if isinstance(post_processing_fn, LogprobsPostProcessor): @@ -367,7 +387,7 @@ def forward_with_post_processing_fn( processed_inputs=processed_inputs, original_batch_size=processed_mb.original_batch_size, original_seq_len=processed_mb.original_seq_len, - cp_sharder=prepared.cp_sharder, + cp_sharder=cp_sharder, sequence_dim=sequence_dim, ) metrics = {"full_logits": result} @@ -448,6 +468,7 @@ def automodel_forward_backward( model, processed_mb.processed_inputs, device_mesh=device_mesh, + cp_size=cp_size, padding_token_id=padding_token_id, is_reward_model=is_reward_model, allow_flash_attn_args=allow_flash_attn_args, @@ -567,7 +588,7 @@ def __call__( global_valid_seqs: torch.Tensor, global_valid_toks: torch.Tensor, *, - cp_sharder: ContextParallelSharder, + cp_sharder: Optional[ContextParallelSharder], sequence_dim: int = 1, ) -> tuple[torch.Tensor, dict[str, Any]]: """Compute loss from logits. @@ -578,7 +599,8 @@ def __call__( processed_inputs: Processed inputs global_valid_seqs: Global valid sequence count global_valid_toks: Global valid token count - cp_sharder: Per-microbatch Automodel sequence-layout owner. + cp_sharder: Per-microbatch Automodel sequence-layout owner, or None + when context parallelism is inactive. sequence_dim: Sequence dimension Returns: @@ -586,7 +608,7 @@ def __call__( """ # Under CP, ``logits`` is this rank's local shard while ``data_dict`` # stays canonical; the sharder maps between the two. - token_layout = cp_sharder if self.cp_size > 1 else None + token_layout = cp_sharder if token_layout is not None: input_type = self.loss_fn.input_type if input_type == LossInputType.LOGIT: @@ -682,7 +704,7 @@ def __call__( original_batch_size: int, original_seq_len: int, *, - cp_sharder: ContextParallelSharder, + cp_sharder: Optional[ContextParallelSharder], sequence_dim: int = 1, ) -> torch.Tensor: """Compute token log probabilities from logits. @@ -693,7 +715,8 @@ def __call__( processed_inputs: Processed inputs original_batch_size: Original batch size before packing original_seq_len: Original sequence length before packing - cp_sharder: Per-microbatch Automodel sequence-layout owner. + cp_sharder: Per-microbatch Automodel sequence-layout owner, or None + when context parallelism is inactive. sequence_dim: Sequence dimension Returns: @@ -701,7 +724,7 @@ def __call__( """ input_lengths = data_dict["input_lengths"] - if self.cp_size > 1: + if cp_sharder is not None: # ``processed_inputs.input_ids`` is the CP-local (and possibly padded) # shard once the forward context is entered, so the canonical # sequence has to come from the untouched microbatch data. @@ -880,7 +903,7 @@ def __call__( original_batch_size: int, original_seq_len: int, *, - cp_sharder: ContextParallelSharder, + cp_sharder: Optional[ContextParallelSharder], sequence_dim: int = 1, ) -> tuple[torch.Tensor, torch.Tensor]: """Compute top-k logits and indices from model outputs. @@ -891,7 +914,8 @@ def __call__( processed_inputs: Processed inputs original_batch_size: Original batch size before packing original_seq_len: Original sequence length before packing - cp_sharder: Per-microbatch Automodel sequence-layout owner. + cp_sharder: Per-microbatch Automodel sequence-layout owner, or None + when context parallelism is inactive. sequence_dim: Sequence dimension Returns: @@ -899,7 +923,7 @@ def __call__( """ input_lengths = data_dict["input_lengths"] - if self.cp_size > 1: + if cp_sharder is not None: # Deal with TP first; the logits are already this rank's CP shard. local_logits = to_local_if_dtensor(logits) # [B, S_cp, V_tp] @@ -1013,7 +1037,7 @@ def __call__( original_batch_size: int, original_seq_len: int, *, - cp_sharder: ContextParallelSharder, + cp_sharder: Optional[ContextParallelSharder], sequence_dim: int = 1, ) -> torch.Tensor: if self.enable_seq_packing: @@ -1032,7 +1056,7 @@ def __call__( # rank's contiguous slice, else heterogeneous teacher_cp != student_cp # lands teacher data at the wrong seq positions in the consumer's dest # tensor. - if self.cp_size > 1 and self.cp_mesh is not None: + if cp_sharder is not None and self.cp_mesh is not None: full = cp_sharder.gather_token_tensor( logits, seq_dim=sequence_dim, trim=True ) diff --git a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py index 5b11c598811..b4f1cb5c581 100644 --- a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py +++ b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py @@ -620,6 +620,7 @@ def get_logprobs( self.model, processed_inputs, device_mesh=self.device_mesh, + cp_size=self.cp_size, padding_token_id=self.tokenizer.pad_token_id or 0, is_reward_model=False, allow_flash_attn_args=self.allow_flash_attn_args, @@ -689,6 +690,7 @@ def score(self, data: BatchedDataDict) -> BatchedDataDict[ScoreOutputSpec]: self.model, processed_inputs, device_mesh=self.device_mesh, + cp_size=self.cp_size, padding_token_id=self.tokenizer.pad_token_id or 0, is_reward_model=True, allow_flash_attn_args=False, @@ -778,6 +780,7 @@ def get_topk_logits( self.model, processed_inputs, device_mesh=self.device_mesh, + cp_size=self.cp_size, padding_token_id=self.tokenizer.pad_token_id or 0, is_reward_model=False, allow_flash_attn_args=self.allow_flash_attn_args, @@ -895,6 +898,7 @@ def get_full_logits_ipc( self.model, processed_inputs, device_mesh=self.device_mesh, + cp_size=self.cp_size, padding_token_id=self.tokenizer.pad_token_id or 0, is_reward_model=False, allow_flash_attn_args=self.allow_flash_attn_args, diff --git a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py index c836b085043..a88263474af 100644 --- a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py +++ b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py @@ -442,6 +442,7 @@ def get_values( self.model, processed_inputs, device_mesh=self.device_mesh, + cp_size=self.cp_size, padding_token_id=self.tokenizer.pad_token_id or 0, is_reward_model=True, allow_flash_attn_args=False, From 9822ef363e0bf99013ba538dea68a3276c8b985a Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Tue, 4 Aug 2026 20:01:19 -0700 Subject: [PATCH 08/34] fix(automodel): align context parallel post-processing Signed-off-by: larkzhang-nv --- nemo_rl/distributed/model_utils.py | 9 ++- nemo_rl/models/automodel/train.py | 61 ++++++++----------- .../workers/dtensor_policy_worker_v2.py | 11 ---- .../value/workers/dtensor_value_worker_v2.py | 2 - 4 files changed, 32 insertions(+), 51 deletions(-) diff --git a/nemo_rl/distributed/model_utils.py b/nemo_rl/distributed/model_utils.py index cf516023912..33bce0eedb0 100644 --- a/nemo_rl/distributed/model_utils.py +++ b/nemo_rl/distributed/model_utils.py @@ -2064,6 +2064,11 @@ def get_distillation_topk_logprobs_from_logits( student_logits = student_logits parallel_group = None + # Automodel owns the sequence layout: shard the teacher indices into the + # model's local layout and neutralize ``cp_group``/``cp_size`` so the legacy + # relayout below (which assumes PyTorch's load-balanced order) stays out of + # the way. The gather back to canonical order runs through the sharder once + # the student log-probs exist. indices_for_logits = teacher_topk_indices if cp_sharder is not None: cp_group = None @@ -2080,7 +2085,7 @@ def get_distillation_topk_logprobs_from_logits( indices_local = indices_for_logits pad_len = 0 - if cp_size > 1 and cp_sharder is None: + if cp_size > 1: pad_len = student_logits.shape[1] * cp_size - indices_local.shape[1] if pad_len > 0: indices_local = torch.nn.functional.pad( @@ -2143,7 +2148,7 @@ def get_distillation_topk_logprobs_from_logits( student_logits, indices_for_logits, tp_group=parallel_group, - cp_group=cp_group if cp_sharder is None else None, + cp_group=cp_group, vocab_start_index=vocab_start_index, vocab_end_index=vocab_end_index, ) diff --git a/nemo_rl/models/automodel/train.py b/nemo_rl/models/automodel/train.py index b9e8150e597..105e9f1b376 100644 --- a/nemo_rl/models/automodel/train.py +++ b/nemo_rl/models/automodel/train.py @@ -167,6 +167,11 @@ def prepare_model_forward( model_context_factory=nullcontext, ) + # Automodel's generic CP prep reads ``batch["labels"]`` unconditionally and + # shards it alongside input_ids/position_ids (see ``shard_batch_load_balanced``). + # NeMo-RL computes its own masked losses from the returned logits, so pass an + # all-ignore placeholder purely to satisfy that contract and drop it again + # before the forward. ``pop`` tolerates a strategy that consumed it itself. model_batch["labels"] = torch.full_like(processed_inputs.input_ids, -100) cp_sharder = ContextParallelSharder( @@ -533,9 +538,7 @@ def __init__( self, loss_fn: LossFunction, cfg: PolicyConfig, - device_mesh: Any, cp_mesh: Any, - tp_mesh: Any, cp_size: int, dp_size: int, enable_seq_packing: bool = False, @@ -546,9 +549,9 @@ def __init__( Args: loss_fn: Loss function to compute loss cfg: Configuration dictionary - device_mesh: Full device mesh - cp_mesh: Context parallel mesh - tp_mesh: Tensor parallel mesh + cp_mesh: Context parallel mesh, used only to resolve the CP process + group handed to the loss. The sequence layout itself belongs to + the per-microbatch ``cp_sharder``. cp_size: Context parallel size dp_size: Data parallel size enable_seq_packing: Whether sequence packing is enabled @@ -556,9 +559,7 @@ def __init__( """ self.loss_fn: LossFunction = loss_fn self.cfg: PolicyConfig = cfg - self.device_mesh = device_mesh self.cp_mesh = cp_mesh - self.tp_mesh = tp_mesh self.cp_size = cp_size self.dp_size = dp_size self.enable_seq_packing = enable_seq_packing @@ -669,10 +670,6 @@ class LogprobsPostProcessor: def __init__( self, cfg: PolicyConfig, - device_mesh: Any, - cp_mesh: Any, - tp_mesh: Any, - cp_size: int, enable_seq_packing: bool = False, sampling_params: Optional[TrainingSamplingParams] = None, ): @@ -680,18 +677,10 @@ def __init__( Args: cfg: Configuration dictionary - device_mesh: Full device mesh - cp_mesh: Context parallel mesh - tp_mesh: Tensor parallel mesh - cp_size: Context parallel size enable_seq_packing: Whether sequence packing is enabled sampling_params: Sampling parameters """ self.cfg = cfg - self.device_mesh = device_mesh - self.cp_mesh = cp_mesh - self.tp_mesh = tp_mesh - self.cp_size = cp_size self.enable_seq_packing = enable_seq_packing self.sampling_params = sampling_params self.logprob_chunk_size = cfg.get("logprob_chunk_size", None) @@ -725,9 +714,10 @@ def __call__( input_lengths = data_dict["input_lengths"] if cp_sharder is not None: - # ``processed_inputs.input_ids`` is the CP-local (and possibly padded) - # shard once the forward context is entered, so the canonical - # sequence has to come from the untouched microbatch data. + # ``data_dict`` stays canonical under CP: ``_build_model_batch`` clones + # the model-facing tensors so Automodel's in-place buffer sharding + # cannot reach the loss-side ones. Shift and gather against that + # canonical sequence and let the sharder own the local layout. canonical_input_ids = data_dict["input_ids"] seq_len = canonical_input_ids.shape[1] token_logprobs = get_cp_sharded_next_token_logprobs( @@ -869,10 +859,7 @@ class TopkLogitsPostProcessor: def __init__( self, cfg: PolicyConfig, - device_mesh: Any, - cp_mesh: Any, tp_mesh: Any, - cp_size: int, k: int, enable_seq_packing: bool = False, ): @@ -880,18 +867,14 @@ def __init__( Args: cfg: Configuration dictionary - device_mesh: Full device mesh - cp_mesh: Context parallel mesh - tp_mesh: Tensor parallel mesh - cp_size: Context parallel size + tp_mesh: Tensor parallel mesh, used for the vocabulary-parallel + top-k. The sequence layout belongs to the per-microbatch + ``cp_sharder``. k: Number of top logits to return enable_seq_packing: Whether sequence packing is enabled """ self.cfg = cfg - self.device_mesh = device_mesh - self.cp_mesh = cp_mesh self.tp_mesh = tp_mesh - self.cp_size = cp_size self.k = k self.enable_seq_packing = enable_seq_packing @@ -1016,16 +999,22 @@ class FullLogitsPostProcessor: def __init__( self, cfg: PolicyConfig, - device_mesh: Any, cp_mesh: Any, - tp_mesh: Any, cp_size: int, enable_seq_packing: bool = False, ): + """Initialize FullLogitsPostProcessor. + + Args: + cfg: Configuration dictionary + cp_mesh: Context parallel mesh, used to pick this rank's contiguous + IPC window. The sequence layout of the logits themselves belongs + to the per-microbatch ``cp_sharder``. + cp_size: Context parallel size + enable_seq_packing: Whether sequence packing is enabled + """ self.cfg = cfg - self.device_mesh = device_mesh self.cp_mesh = cp_mesh - self.tp_mesh = tp_mesh self.cp_size = cp_size self.enable_seq_packing = enable_seq_packing diff --git a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py index b4f1cb5c581..526be19cf1b 100644 --- a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py +++ b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py @@ -425,9 +425,7 @@ def train( loss_post_processor = LossPostProcessor( loss_fn=loss_fn, cfg=self.cfg, - device_mesh=self.device_mesh, cp_mesh=self.cp_mesh, - tp_mesh=self.tp_mesh, cp_size=self.cp_size, dp_size=self.dp_size, enable_seq_packing=self.enable_seq_packing, @@ -595,10 +593,6 @@ def get_logprobs( # Create logprobs post-processor logprobs_post_processor = LogprobsPostProcessor( cfg=self.cfg, - device_mesh=self.device_mesh, - cp_mesh=self.cp_mesh, - tp_mesh=self.tp_mesh, - cp_size=self.cp_size, enable_seq_packing=self.enable_seq_packing, sampling_params=self.sampling_params, ) @@ -755,10 +749,7 @@ def get_topk_logits( # Create top-k post-processor topk_post_processor = TopkLogitsPostProcessor( cfg=self.cfg, - device_mesh=self.device_mesh, - cp_mesh=self.cp_mesh, tp_mesh=self.tp_mesh, - cp_size=self.cp_size, k=k, enable_seq_packing=self.enable_seq_packing, ) @@ -866,9 +857,7 @@ def get_full_logits_ipc( post_processor = FullLogitsPostProcessor( cfg=self.cfg, - device_mesh=self.device_mesh, cp_mesh=self.cp_mesh, - tp_mesh=self.tp_mesh, cp_size=self.cp_size, enable_seq_packing=self.enable_seq_packing, ) diff --git a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py index a88263474af..af69efb62d7 100644 --- a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py +++ b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py @@ -273,9 +273,7 @@ def train( loss_post_processor = LossPostProcessor( loss_fn=wrapped_loss_fn, cfg=self.cfg, - device_mesh=self.device_mesh, cp_mesh=self.cp_mesh, - tp_mesh=self.tp_mesh, cp_size=self.cp_size, dp_size=self.dp_size, enable_seq_packing=self.enable_seq_packing, From 4ed30bc16314dbdb91c06600fc99f52ae8a8d958 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Tue, 4 Aug 2026 20:01:42 -0700 Subject: [PATCH 09/34] test: update context parallel migration coverage Signed-off-by: larkzhang-nv --- tests/unit/algorithms/test_loss_functions.py | 30 ++ .../algorithms/x_token/test_loss_utils.py | 56 +++ .../automodel/test_automodel_cp_migration.py | 315 +++++++++++++++ .../models/automodel/test_automodel_data.py | 150 -------- .../models/automodel/test_automodel_setup.py | 24 ++ .../models/automodel/test_automodel_train.py | 360 +++++------------- .../models/automodel/test_logprob_memory.py | 4 - .../models/policy/test_dtensor_worker_v2.py | 194 +--------- 8 files changed, 534 insertions(+), 599 deletions(-) create mode 100644 tests/unit/models/automodel/test_automodel_cp_migration.py diff --git a/tests/unit/algorithms/test_loss_functions.py b/tests/unit/algorithms/test_loss_functions.py index 8f0b8b0fa05..ff7fe32294e 100644 --- a/tests/unit/algorithms/test_loss_functions.py +++ b/tests/unit/algorithms/test_loss_functions.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import itertools +from unittest.mock import patch import pytest import torch @@ -2709,6 +2710,35 @@ def test_cross_tokenizer_ce_respects_sample_mask(tmp_path): assert torch.allclose(ce_masked, ce_single, atol=1e-6) +def test_cross_tokenizer_precomputed_ce_reduces_partitioned_cp_windows(tmp_path): + """Precomputed CE sums contiguous CP-window contributions exactly once.""" + loss_fn = CrossTokenizerDistillationLossFn( + _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) + ) + data = BatchedDataDict({"sample_mask": torch.ones(1)}) + next_token_logprobs = torch.tensor([[-1.0, -2.0]]) + next_token_mask = torch.ones_like(next_token_logprobs) + cp_group = object() + + with patch( + "nemo_rl.algorithms.loss.loss_functions.group_all_reduce_sum_with_grad", + side_effect=lambda value, group: value, + ) as reduce_sum: + ce = loss_fn._compute_ce( + torch.empty(0), + data, + torch.tensor(2.0), + student_next_token_logprobs=next_token_logprobs, + student_next_token_mask=next_token_mask, + cp_group=cp_group, + ) + + torch.testing.assert_close(ce, torch.tensor(1.5)) + reduced_value, reduced_group = reduce_sum.call_args.args + torch.testing.assert_close(reduced_value, torch.tensor(1.5)) + assert reduced_group is cp_group + + # ── Metric-normalization advertisement (PR #2683) ───────────────────────── diff --git a/tests/unit/algorithms/x_token/test_loss_utils.py b/tests/unit/algorithms/x_token/test_loss_utils.py index 9bc88fc41ec..7bd1fde6c94 100644 --- a/tests/unit/algorithms/x_token/test_loss_utils.py +++ b/tests/unit/algorithms/x_token/test_loss_utils.py @@ -25,6 +25,7 @@ import traceback from dataclasses import fields from pathlib import Path +from unittest.mock import MagicMock, patch import numpy as np import pytest @@ -45,6 +46,7 @@ get_topk_projection, localize_alignment, parse_projection_file, + prepare_xtoken_cross_tokenizer_loss_input, slice_sparse_projection_cols, valid_chunk_mask, ) @@ -100,6 +102,60 @@ def test_values_are_tensor_identity_preserved(self): assert ab.num_chunks is flat["alignment_num_chunks"] +def test_automodel_cp_layout_localizes_xtoken_windows_after_global_shift(): + """Automodel layout restoration precedes contiguous x-token localization.""" + cp_group = object() + local_logits = torch.randn(1, 3, 2) + full_student_logits = torch.arange(12, dtype=torch.float32).reshape(1, 6, 2) + teacher_logits = torch.randn(1, 2, 4) + cp_sharder = MagicMock() + cp_sharder.gather_token_tensor.return_value = full_student_logits + teacher_ipc = [{"opaque": "handle"}] + data = { + "input_ids": torch.arange(6).unsqueeze(0), + "token_mask": torch.ones(1, 6), + "sample_mask": torch.ones(1), + "teacher_0_full_logits_ipc": teacher_ipc, + "alignment_0_student_chunk_id": torch.tensor([[10, 11, 12, 13, 14, 15]]), + "alignment_0_teacher_chunk_id": torch.tensor([[20, 21, 22, 23]]), + "alignment_0_pair_valid": torch.ones(1, 2, dtype=torch.bool), + "alignment_0_pair_is_correct": torch.ones(1, 2, dtype=torch.bool), + } + + with ( + patch("torch.cuda.current_device", return_value=0), + patch("torch.distributed.get_world_size", return_value=2), + patch("torch.distributed.get_rank", return_value=1), + patch( + "nemo_rl.algorithms.x_token.loss_utils." + "rebuild_teacher_full_logits_from_ipc", + return_value=teacher_logits, + ) as rebuild_teacher, + ): + student_logits, teachers, aligns, tp_group, returned_cp_group = ( + prepare_xtoken_cross_tokenizer_loss_input( + local_logits, + data, + projection_matrix_paths=["projection.pt"], + context_parallel_group=cp_group, + cp_sharder=cp_sharder, + ) + ) + + torch.testing.assert_close(student_logits, full_student_logits[:, 3:6]) + assert teachers[0] is teacher_logits + assert tp_group is None + assert returned_cp_group is cp_group + torch.testing.assert_close(aligns[0].student_input_ids, data["input_ids"][:, 3:6]) + torch.testing.assert_close(aligns[0].student_token_mask, data["token_mask"][:, 3:6]) + torch.testing.assert_close(aligns[0].student_chunk_id, torch.tensor([[14, 15, -1]])) + torch.testing.assert_close(aligns[0].teacher_chunk_id, torch.tensor([[23, -1]])) + cp_sharder.gather_token_tensor.assert_called_once_with( + local_logits, seq_dim=1, trim=True + ) + rebuild_teacher.assert_called_once_with(teacher_ipc, cp_group=cp_group, device=0) + + # --------------------------------------------------------------------------- # chunk_average_log_probs # --------------------------------------------------------------------------- diff --git a/tests/unit/models/automodel/test_automodel_cp_migration.py b/tests/unit/models/automodel/test_automodel_cp_migration.py new file mode 100644 index 00000000000..824ee3df8fd --- /dev/null +++ b/tests/unit/models/automodel/test_automodel_cp_migration.py @@ -0,0 +1,315 @@ +# Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Contract tests for the Automodel context-parallel API migration.""" + +from contextlib import nullcontext +from unittest.mock import MagicMock, patch + +import pytest +import torch + +try: + import nemo_automodel # noqa: F401 +except ImportError: + pytest.skip("nemo_automodel not available", allow_module_level=True) + +from nemo_rl.algorithms.loss.interfaces import LossInputType +from nemo_rl.distributed.batched_data_dict import BatchedDataDict +from nemo_rl.distributed.model_utils import ( + get_cp_sharded_next_token_logprobs, + get_distillation_topk_logprobs_from_logits, +) +from nemo_rl.models.automodel.data import ProcessedInputs, ProcessedMicrobatch +from nemo_rl.models.automodel.train import ( + FullLogitsPostProcessor, + LossPostProcessor, + PreparedModelForward, + ScorePostProcessor, + forward_with_post_processing_fn, + prepare_model_forward, +) + + +class _PermutationTokenLayout: + """Small non-identity layout implementing Automodel's token verbs.""" + + def __init__(self, order: torch.Tensor) -> None: + self.order = order + self.inverse_order = torch.argsort(order) + + def shard_token_tensor( + self, tensor: torch.Tensor, *, seq_dim: int, fill: int + ) -> torch.Tensor: + del fill + return tensor.index_select(seq_dim, self.order) + + def gather_token_tensor( + self, tensor: torch.Tensor, *, seq_dim: int, trim: bool + ) -> torch.Tensor: + assert trim + return tensor.index_select(seq_dim, self.inverse_order) + + +@pytest.mark.automodel +class TestPrepareModelForward: + def test_cp1_keeps_canonical_batch_and_skips_sharder(self) -> None: + input_ids = torch.tensor([[1, 2, 3, 4]]) + attention_mask = torch.ones_like(input_ids) + processed_inputs = ProcessedInputs( + input_ids=input_ids, + seq_len=4, + attention_mask=attention_mask, + position_ids=None, + ) + + with patch( + "nemo_rl.models.automodel.train.ContextParallelSharder" + ) as sharder_cls: + prepared = prepare_model_forward( + torch.nn.Identity(), + processed_inputs, + device_mesh=None, + cp_size=1, + padding_token_id=0, + is_reward_model=False, + allow_flash_attn_args=True, + ) + + sharder_cls.assert_not_called() + assert prepared.cp_size == 1 + assert prepared.cp_sharder is None + assert prepared.model_batch["input_ids"] is input_ids + assert prepared.model_batch["attention_mask"] is attention_mask + assert "position_ids" not in prepared.model_batch + assert "labels" not in prepared.model_batch + with prepared.model_context_factory(): + pass + + def test_cp2_clones_model_tensors_and_delegates_layout(self) -> None: + input_ids = torch.tensor([[1, 2, 3, 4]]) + attention_mask = torch.ones_like(input_ids) + processed_inputs = ProcessedInputs( + input_ids=input_ids, + seq_len=4, + attention_mask=attention_mask, + position_ids=None, + ) + model = torch.nn.Identity() + device_mesh = MagicMock() + sharder = MagicMock() + observed_batch: dict[str, object] = {} + + def shard(model_batch: dict[str, object]): + observed_batch.update(model_batch) + assert torch.equal(model_batch["labels"], torch.full_like(input_ids, -100)) + return nullcontext, model_batch + + sharder.shard.side_effect = shard + with patch( + "nemo_rl.models.automodel.train.ContextParallelSharder", + return_value=sharder, + ) as sharder_cls: + prepared = prepare_model_forward( + model, + processed_inputs, + device_mesh=device_mesh, + cp_size=2, + padding_token_id=7, + is_reward_model=False, + allow_flash_attn_args=True, + ) + + constructor_args = sharder_cls.call_args + assert constructor_args.args[:2] == (model, device_mesh) + assert constructor_args.kwargs == {"padding_token_id": 7, "num_chunks": 1} + assert prepared.cp_sharder is sharder + assert prepared.model_context_factory is nullcontext + assert prepared.model_batch["input_ids"] is not input_ids + assert prepared.model_batch["attention_mask"] is not attention_mask + assert torch.equal(prepared.model_batch["input_ids"], input_ids) + assert torch.equal(prepared.model_batch["attention_mask"], attention_mask) + assert "position_ids" not in prepared.model_batch + assert "labels" not in prepared.model_batch + assert "labels" in observed_batch + assert processed_inputs.input_ids is input_ids + + +@pytest.mark.automodel +def test_cp_forward_requires_the_prepared_sharder() -> None: + input_ids = torch.tensor([[1, 2, 3, 4]]) + processed_inputs = ProcessedInputs(input_ids=input_ids, seq_len=4) + processed_mb = ProcessedMicrobatch( + data_dict=BatchedDataDict({"input_ids": input_ids}), + processed_inputs=processed_inputs, + original_batch_size=1, + original_seq_len=4, + ) + prepared = PreparedModelForward( + model_batch={"input_ids": input_ids}, + cp_size=2, + cp_sharder=None, + model_context_factory=nullcontext, + ) + model = MagicMock() + + with pytest.raises(RuntimeError, match="ContextParallelSharder is required"): + forward_with_post_processing_fn( + model=model, + prepared=prepared, + post_processing_fn=ScorePostProcessor(cfg={}), + processed_mb=processed_mb, + ) + + model.assert_not_called() + + +@pytest.mark.automodel +def test_grpo_logprobs_follow_automodel_sequence_layout() -> None: + torch.manual_seed(11) + order = torch.tensor([0, 3, 1, 2]) + layout = _PermutationTokenLayout(order) + input_ids = torch.tensor([[0, 1, 2, 3]]) + canonical_logits = torch.randn(1, 4, 5) + local_logits = canonical_logits.index_select(1, order).requires_grad_() + + actual = get_cp_sharded_next_token_logprobs( + local_logits, + input_ids, + layout, + ) + expected = ( + torch.log_softmax(canonical_logits.float(), dim=-1)[:, :-1] + .gather(dim=-1, index=input_ids[:, 1:].unsqueeze(-1)) + .squeeze(-1) + ) + + torch.testing.assert_close(actual, expected) + actual.sum().backward() + assert local_logits.grad is not None + assert torch.isfinite(local_logits.grad).all() + + +@pytest.mark.automodel +def test_standard_distillation_statistics_follow_automodel_sequence_layout() -> None: + torch.manual_seed(17) + order = torch.tensor([0, 3, 1, 2]) + layout = _PermutationTokenLayout(order) + teacher_topk_indices = torch.tensor( + [[[0, 2], [1, 3], [2, 4], [0, 4]]], dtype=torch.long + ) + teacher_topk_logits = torch.randn(1, 4, 2) + canonical_student_logits = torch.randn(1, 4, 5) + local_student_logits = canonical_student_logits.index_select(1, order) + + student_logprobs, teacher_logprobs, entropy = ( + get_distillation_topk_logprobs_from_logits( + student_logits=local_student_logits, + teacher_topk_logits=teacher_topk_logits, + teacher_topk_indices=teacher_topk_indices, + zero_outside_topk=True, + calculate_entropy=True, + cp_sharder=layout, + ) + ) + + canonical_student_logprobs = torch.log_softmax( + canonical_student_logits.float(), dim=-1 + ) + expected_student = canonical_student_logprobs.gather( + dim=-1, index=teacher_topk_indices + )[:, :-1] + expected_teacher = torch.log_softmax(teacher_topk_logits.float(), dim=-1)[:, :-1] + expected_entropy = ( + canonical_student_logprobs.exp() * canonical_student_logprobs + ).sum(dim=-1)[:, :-1] + + torch.testing.assert_close(student_logprobs, expected_student) + torch.testing.assert_close(teacher_logprobs, expected_teacher) + torch.testing.assert_close(entropy, expected_entropy) + + +@pytest.mark.automodel +def test_full_logits_postprocessor_emits_contiguous_cp_window() -> None: + local_logits = torch.randn(1, 3, 4, dtype=torch.bfloat16) + full_logits = torch.randn(1, 6, 4) + cp_group = object() + cp_mesh = MagicMock() + cp_mesh.get_group.return_value = cp_group + cp_sharder = MagicMock() + cp_sharder.gather_token_tensor.return_value = full_logits + processor = FullLogitsPostProcessor( + cfg={}, + cp_mesh=cp_mesh, + cp_size=2, + ) + + with patch("torch.distributed.get_rank", return_value=1) as get_rank: + actual = processor( + logits=local_logits, + data_dict=BatchedDataDict({}), + processed_inputs=MagicMock(), + original_batch_size=1, + original_seq_len=6, + cp_sharder=cp_sharder, + ) + + torch.testing.assert_close(actual, full_logits[:, 3:6].float()) + gathered_logits = cp_sharder.gather_token_tensor.call_args.args[0] + torch.testing.assert_close(gathered_logits, local_logits.float()) + assert cp_sharder.gather_token_tensor.call_args.kwargs == { + "seq_dim": 1, + "trim": True, + } + get_rank.assert_called_once_with(cp_group) + + +@pytest.mark.automodel +@pytest.mark.parametrize( + ("input_type", "expected_fanout"), + [ + (LossInputType.LOGIT, 2), + (LossInputType.LOGPROB, 2), + (LossInputType.DISTILLATION, 2), + (LossInputType.DISTILLATION_CROSS_TOKENIZER, 1), + (LossInputType.DRAFT, 1), + ], +) +def test_loss_cp_gradient_fanout_contract( + input_type: LossInputType, expected_fanout: int +) -> None: + loss_fn = MagicMock(input_type=input_type) + processor = LossPostProcessor( + loss_fn=loss_fn, + cfg={}, + cp_mesh=None, + cp_size=2, + dp_size=1, + ) + + assert processor.cp_gradient_fanout == expected_fanout + + +@pytest.mark.automodel +def test_cp1_loss_gradient_fanout_is_identity() -> None: + loss_fn = MagicMock(input_type=LossInputType.LOGPROB) + processor = LossPostProcessor( + loss_fn=loss_fn, + cfg={}, + cp_mesh=None, + cp_size=1, + dp_size=1, + ) + + assert processor.cp_gradient_fanout == 1 diff --git a/tests/unit/models/automodel/test_automodel_data.py b/tests/unit/models/automodel/test_automodel_data.py index 737f1252c1c..59e37ddfbe4 100644 --- a/tests/unit/models/automodel/test_automodel_data.py +++ b/tests/unit/models/automodel/test_automodel_data.py @@ -78,7 +78,6 @@ def test_regular_batching(self, mock_tokenizer): mbs=mbs, dp_mesh=mock_dp_mesh, tokenizer=mock_tokenizer, - cp_size=1, ) # Verify iterator length @@ -142,7 +141,6 @@ def test_dynamic_batching(self, mock_tokenizer): mbs=mbs, dp_mesh=mock_dp_mesh, tokenizer=mock_tokenizer, - cp_size=1, ) # Verify dynamic batching was used @@ -211,7 +209,6 @@ def side_effect(tensor, *args, **kwargs): mbs=mbs, dp_mesh=mock_dp_mesh, tokenizer=mock_tokenizer, - cp_size=1, ) # Verify sequence packing was used @@ -277,7 +274,6 @@ def side_effect(tensor, *args, **kwargs): mbs=mbs, dp_mesh=mock_dp_mesh, tokenizer=mock_tokenizer, - cp_size=1, ) # Verify local iterator_len is still 1 (not modified) @@ -303,14 +299,11 @@ def test_regular_batching(self, mock_tokenizer): "dtensor_cfg": {"sequence_parallel": False}, } enable_seq_packing = False - cp_size = 1 - result = process_microbatch( mb=mb, tokenizer=mock_tokenizer, enable_seq_packing=enable_seq_packing, cfg=cfg, - cp_size=cp_size, ) # Verify outputs @@ -322,8 +315,6 @@ def test_regular_batching(self, mock_tokenizer): assert result.position_ids.shape == (4, 64) assert result.flash_attn_kwargs == {} assert result.vlm_kwargs == {} - assert result.cp_buffers == [] - assert result.seq_index is None assert result.seq_len == 64 @patch("nemo_rl.models.automodel.data.pack_sequences") @@ -347,8 +338,6 @@ def test_sequence_packing( "sequence_packing": {"train_mb_tokens": 256}, } enable_seq_packing = True - cp_size = 1 - # Mock pack_sequences to return packed inputs packed_input_ids = torch.randint(0, 1000, (1, 204)) # Sum of lengths packed_position_ids = torch.arange(204).unsqueeze(0) @@ -364,7 +353,6 @@ def test_sequence_packing( tokenizer=mock_tokenizer, enable_seq_packing=enable_seq_packing, cfg=cfg, - cp_size=cp_size, ) # Verify pack_sequences was called @@ -400,14 +388,11 @@ def test_with_multimodal_inputs(self, mock_tokenizer): "dtensor_cfg": {"sequence_parallel": False}, } enable_seq_packing = False - cp_size = 1 - result = process_microbatch( mb=mb, tokenizer=mock_tokenizer, enable_seq_packing=enable_seq_packing, cfg=cfg, - cp_size=cp_size, ) # Verify multimodal kwargs were extracted @@ -423,68 +408,6 @@ def test_with_multimodal_inputs(self, mock_tokenizer): # When multimodal inputs are present, position_ids should be None assert result.position_ids is None - def test_with_context_parallel(self, mock_tokenizer): - # Create test microbatch - mb = BatchedDataDict( - { - "input_ids": torch.randint(0, 1000, (2, 128)), - "sample_mask": torch.ones(2, dtype=torch.bool), - } - ) - - cfg = { - "dtensor_cfg": {"sequence_parallel": False}, - } - enable_seq_packing = False - cp_size = 2 # Context parallel enabled - - result = process_microbatch( - mb=mb, - tokenizer=mock_tokenizer, - enable_seq_packing=enable_seq_packing, - cfg=cfg, - cp_size=cp_size, - ) - - # Verify context parallel buffers were created - assert isinstance(result, ProcessedInputs) - assert len(result.cp_buffers) == 3 # input_ids, position_ids, seq_index - assert result.seq_index is not None - assert result.seq_index.shape == (1, 128) - # Verify no multimodal inputs with CP - assert result.vlm_kwargs == {} - - def test_context_parallel_with_multimodal_raises_error(self, mock_tokenizer): - # Create test microbatch with multimodal data - mb = BatchedDataDict( - { - "input_ids": torch.randint(0, 1000, (2, 64)), - "sample_mask": torch.ones(2, dtype=torch.bool), - "pixel_values": torch.randn(2, 3, 224, 224), - } - ) - - # Mock get_multimodal_dict to return non-empty dict - mock_multimodal_dict = {"pixel_values": torch.randn(2, 3, 224, 224)} - mb.get_multimodal_dict = MagicMock(return_value=mock_multimodal_dict) - - cfg = { - "dtensor_cfg": {"sequence_parallel": False}, - } - enable_seq_packing = False - cp_size = 2 # Context parallel enabled - - with pytest.raises( - AssertionError, match="are not supported for context parallel" - ): - process_microbatch( - mb=mb, - tokenizer=mock_tokenizer, - enable_seq_packing=enable_seq_packing, - cfg=cfg, - cp_size=cp_size, - ) - def test_sequence_packing_with_multimodal_raises_error(self, mock_tokenizer): # Create test microbatch with multimodal data mb = BatchedDataDict( @@ -505,8 +428,6 @@ def test_sequence_packing_with_multimodal_raises_error(self, mock_tokenizer): "sequence_packing": {"train_mb_tokens": 128}, } enable_seq_packing = True - cp_size = 1 - with pytest.raises( AssertionError, match="multimodal kwargs are not supported for sequence packing", @@ -516,7 +437,6 @@ def test_sequence_packing_with_multimodal_raises_error(self, mock_tokenizer): tokenizer=mock_tokenizer, enable_seq_packing=enable_seq_packing, cfg=cfg, - cp_size=cp_size, ) def test_sequence_parallel_with_multimodal_raises_error(self, mock_tokenizer): @@ -537,8 +457,6 @@ def test_sequence_parallel_with_multimodal_raises_error(self, mock_tokenizer): "dtensor_cfg": {"sequence_parallel": True}, } enable_seq_packing = False - cp_size = 1 - with pytest.raises( AssertionError, match="Sequence parallel is not supported with multimodal" ): @@ -547,7 +465,6 @@ def test_sequence_parallel_with_multimodal_raises_error(self, mock_tokenizer): tokenizer=mock_tokenizer, enable_seq_packing=enable_seq_packing, cfg=cfg, - cp_size=cp_size, ) @@ -555,32 +472,6 @@ def test_sequence_parallel_with_multimodal_raises_error(self, mock_tokenizer): class TestProcessedInputsProperties: """Test ProcessedInputs dataclass properties.""" - def test_has_context_parallel_true(self): - """Test has_context_parallel returns True when cp_buffers is non-empty.""" - processed_inputs = ProcessedInputs( - input_ids=torch.randint(0, 1000, (2, 64)), - seq_len=64, - cp_buffers=[torch.randn(2, 64), torch.randn(2, 64)], - ) - assert processed_inputs.has_context_parallel is True - - def test_has_context_parallel_false(self): - """Test has_context_parallel returns False when cp_buffers is empty.""" - processed_inputs = ProcessedInputs( - input_ids=torch.randint(0, 1000, (2, 64)), - seq_len=64, - cp_buffers=[], - ) - assert processed_inputs.has_context_parallel is False - - def test_has_context_parallel_default(self): - """Test has_context_parallel returns False by default.""" - processed_inputs = ProcessedInputs( - input_ids=torch.randint(0, 1000, (2, 64)), - seq_len=64, - ) - assert processed_inputs.has_context_parallel is False - def test_has_flash_attention_true_with_dict(self): """Test has_flash_attention returns True when flash_attn_kwargs has data.""" processed_inputs = ProcessedInputs( @@ -642,10 +533,7 @@ def test_combined_properties(self): position_ids=torch.arange(64).unsqueeze(0).expand(2, -1), flash_attn_kwargs={"cu_seqlens": torch.tensor([0, 32, 64])}, vlm_kwargs={"pixel_values": torch.randn(2, 3, 224, 224)}, - cp_buffers=[torch.randn(2, 64)], - seq_index=torch.arange(64).unsqueeze(0), ) - assert processed_inputs.has_context_parallel is True assert processed_inputs.has_flash_attention is True assert processed_inputs.is_multimodal is True @@ -747,7 +635,6 @@ def test_basic_iteration(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) # Collect all processed microbatches @@ -784,7 +671,6 @@ def test_preserves_data_dict_reference(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) processed_mb = next(processed_iterator) @@ -814,7 +700,6 @@ def test_processed_inputs_are_correct(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) processed_mb = next(processed_iterator) @@ -827,37 +712,8 @@ def test_processed_inputs_are_correct(self, mock_tokenizer): assert processed_inputs.position_ids is not None assert processed_inputs.position_ids.shape == (3, 48) assert processed_inputs.seq_len == 48 - assert processed_inputs.cp_buffers == [] assert processed_inputs.vlm_kwargs == {} - def test_with_context_parallel(self, mock_tokenizer): - """Test iteration with context parallel enabled.""" - batch = BatchedDataDict( - { - "input_ids": torch.randint(0, 1000, (2, 64)), - "sample_mask": torch.ones(2, dtype=torch.bool), - } - ) - - raw_iterator = iter([batch]) - cfg = { - "sequence_packing": {"enabled": False}, - "dtensor_cfg": {"sequence_parallel": False}, - } - - processed_iterator = make_processed_microbatch_iterator( - raw_iterator=raw_iterator, - tokenizer=mock_tokenizer, - cfg=cfg, - cp_size=2, # Context parallel enabled - ) - - processed_mb = next(processed_iterator) - - # Verify context parallel buffers are created - assert len(processed_mb.processed_inputs.cp_buffers) == 3 - assert processed_mb.processed_inputs.seq_index is not None - def test_empty_iterator(self, mock_tokenizer): """Test that empty iterator yields nothing.""" raw_iterator = iter([]) @@ -870,7 +726,6 @@ def test_empty_iterator(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) processed_mbs = list(processed_iterator) @@ -907,7 +762,6 @@ def test_varying_batch_sizes(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) processed_mbs = list(processed_iterator) @@ -957,7 +811,6 @@ def test_with_sequence_packing_enabled( raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) processed_mbs = list(processed_iterator) @@ -992,7 +845,6 @@ def test_config_without_sequence_packing_key(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) processed_mbs = list(processed_iterator) @@ -1345,7 +1197,6 @@ def test_full_pipeline_regular_batching( "dtensor_cfg": {"sequence_parallel": False}, } mbs = 4 - cp_size = 1 # Mock get_batch def get_batch_side_effect(batch_idx, batch_size): @@ -1385,7 +1236,6 @@ def all_reduce_side_effect(tensor, *args, **kwargs): mbs=2, dp_mesh=mock_dp_mesh, tokenizer=mock_tokenizer, - cp_size=cp_size, ) # Step 3: Iterate through processed microbatches diff --git a/tests/unit/models/automodel/test_automodel_setup.py b/tests/unit/models/automodel/test_automodel_setup.py index 9aba2d99fc7..d8b7e7fef49 100644 --- a/tests/unit/models/automodel/test_automodel_setup.py +++ b/tests/unit/models/automodel/test_automodel_setup.py @@ -162,6 +162,30 @@ def test_sequence_packing_with_vlm_raises_error( rank=0, ) + @patch("nemo_rl.models.automodel.setup.AutoConfig") + @patch("nemo_rl.models.automodel.setup.resolve_model_class") + @patch("nemo_rl.models.automodel.setup.configure_dynamo_cache") + def test_context_parallel_with_vlm_raises_error( + self, + mock_dynamo, + mock_resolve_class, + mock_autoconfig_class, + mock_config, + ): + """VLM CP fails during setup before model construction.""" + mock_config["dtensor_cfg"]["context_parallel_size"] = 2 + + with pytest.raises( + ValueError, match="Context parallel is not supported for VLM" + ): + validate_and_prepare_config( + config=mock_config, + processor=MagicMock(), + rank=0, + ) + + mock_autoconfig_class.from_pretrained.assert_not_called() + @patch("nemo_rl.models.automodel.setup.AutoConfig") @patch("nemo_rl.models.automodel.setup.resolve_model_class") @patch("nemo_rl.models.automodel.setup.configure_dynamo_cache") diff --git a/tests/unit/models/automodel/test_automodel_train.py b/tests/unit/models/automodel/test_automodel_train.py index 300a0e7b433..819a969fed9 100644 --- a/tests/unit/models/automodel/test_automodel_train.py +++ b/tests/unit/models/automodel/test_automodel_train.py @@ -12,12 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +from contextlib import nullcontext from dataclasses import dataclass +from typing import Any from unittest.mock import MagicMock, patch import pytest import torch -from torch.distributed.tensor import DTensor try: import nemo_automodel # noqa: F401 @@ -34,6 +35,7 @@ make_processed_microbatch_iterator, ) from nemo_rl.models.automodel.train import ( + PreparedModelForward, LogprobsPostProcessor, LossPostProcessor, ScorePostProcessor, @@ -43,9 +45,28 @@ extract_logits, forward_with_post_processing_fn, model_forward, + prepare_model_forward, ) +def _prepare_cp1( + model: Any, + processed_inputs: ProcessedInputs, + *, + is_reward_model: bool = False, + allow_flash_attn_args: bool = True, +) -> PreparedModelForward: + return prepare_model_forward( + model, + processed_inputs, + device_mesh=None, + cp_size=1, + padding_token_id=0, + is_reward_model=is_reward_model, + allow_flash_attn_args=allow_flash_attn_args, + ) + + @pytest.fixture def mock_tokenizer(): tokenizer = MagicMock() @@ -109,8 +130,6 @@ def processed_inputs_no_flash(): position_ids=torch.arange(64).repeat(4, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) @@ -128,8 +147,6 @@ class MockFlashAttnKwargs: position_ids=torch.arange(128).unsqueeze(0), flash_attn_kwargs=flash_kwargs, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) @@ -142,8 +159,6 @@ def processed_inputs_multimodal(): position_ids=None, flash_attn_kwargs={}, vlm_kwargs={"pixel_values": torch.randn(2, 3, 224, 224)}, - cp_buffers=[], - seq_index=None, ) @@ -153,7 +168,8 @@ def processed_inputs_multimodal(): @pytest.mark.automodel class TestModelForward: def test_basic_forward(self, mock_model, processed_inputs_no_flash): - result = model_forward(mock_model, processed_inputs_no_flash) + prepared = _prepare_cp1(mock_model, processed_inputs_no_flash) + model_forward(mock_model, prepared.model_batch) mock_model.assert_called_once() call_kwargs = mock_model.call_args[1] @@ -165,14 +181,16 @@ def test_basic_forward(self, mock_model, processed_inputs_no_flash): def test_forward_with_flash_attention( self, mock_model, processed_inputs_with_flash ): - result = model_forward(mock_model, processed_inputs_with_flash) + prepared = _prepare_cp1(mock_model, processed_inputs_with_flash) + model_forward(mock_model, prepared.model_batch) mock_model.assert_called_once() call_kwargs = mock_model.call_args[1] assert "flash_attn_kwargs" in call_kwargs def test_forward_with_multimodal(self, mock_model, processed_inputs_multimodal): - result = model_forward(mock_model, processed_inputs_multimodal) + prepared = _prepare_cp1(mock_model, processed_inputs_multimodal) + model_forward(mock_model, prepared.model_batch) mock_model.assert_called_once() call_kwargs = mock_model.call_args[1] @@ -334,9 +352,10 @@ def forward(self, **kwargs): def test_forward_reward_model_removes_flash_attn( self, mock_model, processed_inputs_with_flash ): - result = model_forward( + prepared = _prepare_cp1( mock_model, processed_inputs_with_flash, is_reward_model=True ) + model_forward(mock_model, prepared.model_batch) mock_model.assert_called_once() call_kwargs = mock_model.call_args[1] @@ -346,9 +365,12 @@ def test_forward_reward_model_removes_flash_attn( def test_forward_disallow_flash_attn_args( self, mock_model, processed_inputs_with_flash ): - result = model_forward( - mock_model, processed_inputs_with_flash, allow_flash_attn_args=False + prepared = _prepare_cp1( + mock_model, + processed_inputs_with_flash, + allow_flash_attn_args=False, ) + model_forward(mock_model, prepared.model_batch) mock_model.assert_called_once() call_kwargs = mock_model.call_args[1] @@ -360,7 +382,8 @@ def test_forward_injects_mm_token_type_ids_for_gemma4( # Gemma 4 needs mm_token_type_ids even for text-only inputs. mock_model.config.model_type = "gemma4" - result = model_forward(mock_model, processed_inputs_no_flash) + prepared = _prepare_cp1(mock_model, processed_inputs_no_flash) + model_forward(mock_model, prepared.model_batch) call_kwargs = mock_model.call_args[1] assert "mm_token_type_ids" in call_kwargs @@ -374,7 +397,8 @@ def test_forward_omits_mm_token_type_ids_for_non_gemma4( ): mock_model.config.model_type = "llama" - result = model_forward(mock_model, processed_inputs_no_flash) + prepared = _prepare_cp1(mock_model, processed_inputs_no_flash) + model_forward(mock_model, prepared.model_batch) call_kwargs = mock_model.call_args[1] assert "mm_token_type_ids" not in call_kwargs @@ -462,9 +486,7 @@ def test_basic_loss_computation( processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -489,6 +511,7 @@ def test_basic_loss_computation( processed_inputs=processed_inputs_no_flash, global_valid_seqs=global_valid_seqs, global_valid_toks=global_valid_toks, + cp_sharder=None, ) # Verify loss function was called @@ -517,9 +540,7 @@ def test_loss_with_sequence_packing( processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, enable_seq_packing=True, @@ -545,6 +566,7 @@ def test_loss_with_sequence_packing( processed_inputs=processed_inputs_with_flash, global_valid_seqs=global_valid_seqs, global_valid_toks=global_valid_toks, + cp_sharder=None, ) # Verify SequencePackingLossWrapper was created @@ -563,9 +585,7 @@ def test_loss_processor_initialization( processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=2, dp_size=4, ) @@ -614,10 +634,6 @@ def test_basic_logprobs_computation( ): processor = LogprobsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, - cp_size=1, ) batch_size = 4 @@ -636,8 +652,6 @@ def test_basic_logprobs_computation( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) result = processor( @@ -646,6 +660,7 @@ def test_basic_logprobs_computation( processed_inputs=processed_inputs, original_batch_size=batch_size, original_seq_len=seq_len, + cp_sharder=None, ) assert result.shape == (batch_size, seq_len) @@ -656,10 +671,6 @@ def test_logprobs_with_chunking( cfg_with_chunk = {**base_cfg, "logprob_chunk_size": 16} processor = LogprobsPostProcessor( cfg=cfg_with_chunk, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, - cp_size=1, ) batch_size = 4 @@ -678,8 +689,6 @@ def test_logprobs_with_chunking( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) result = processor( @@ -688,6 +697,7 @@ def test_logprobs_with_chunking( processed_inputs=processed_inputs, original_batch_size=batch_size, original_seq_len=seq_len, + cp_sharder=None, ) assert result.shape == (batch_size, seq_len) @@ -702,10 +712,7 @@ def test_basic_topk(self, base_cfg, mock_device_mesh, mock_cp_mesh, mock_tp_mesh k = 10 processor = TopkLogitsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, tp_mesh=mock_tp_mesh, - cp_size=1, k=k, ) @@ -724,8 +731,6 @@ def test_basic_topk(self, base_cfg, mock_device_mesh, mock_cp_mesh, mock_tp_mesh position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) vals, idx = processor( @@ -734,6 +739,7 @@ def test_basic_topk(self, base_cfg, mock_device_mesh, mock_cp_mesh, mock_tp_mesh processed_inputs=processed_inputs, original_batch_size=batch_size, original_seq_len=seq_len, + cp_sharder=None, ) assert vals.shape == (batch_size, seq_len, k) @@ -801,7 +807,6 @@ def test_basic_iteration(self, mock_tokenizer): raw_iterator=raw_iterator, tokenizer=mock_tokenizer, cfg=cfg, - cp_size=1, ) results = list(processed_iterator) @@ -865,27 +870,6 @@ def test_ignores_1d_tensors(self): # ===================== @pytest.mark.automodel class TestProcessedInputsProperties: - def test_has_context_parallel_false(self, processed_inputs_no_flash): - assert processed_inputs_no_flash.has_context_parallel is False - - def test_has_context_parallel_true(self): - input_ids = torch.randint(0, 1000, (2, 128)) - position_ids = torch.arange(128).repeat(2, 1) - seq_index = torch.arange(128).repeat(1, 1) - - processed = ProcessedInputs( - input_ids=input_ids, - seq_len=128, - attention_mask=torch.ones(2, 128, dtype=torch.bool), - position_ids=position_ids, - flash_attn_kwargs={}, - vlm_kwargs={}, - cp_buffers=[input_ids, position_ids, seq_index], - seq_index=seq_index, - ) - - assert processed.has_context_parallel is True - def test_has_flash_attention_false(self, processed_inputs_no_flash): assert processed_inputs_no_flash.has_flash_attention is False @@ -926,8 +910,6 @@ def test_forward_with_loss_post_processor( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -951,9 +933,7 @@ def test_forward_with_loss_post_processor( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -961,6 +941,7 @@ def test_forward_with_loss_post_processor( # Call forward_with_post_processing_fn _, _, returned_mb = forward_with_post_processing_fn( model=mock_model, + prepared=_prepare_cp1(mock_model, processed_inputs), post_processing_fn=loss_post_processor, processed_mb=processed_mb, global_valid_seqs=torch.tensor(batch_size), @@ -997,8 +978,6 @@ def test_forward_with_score_post_processor( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1024,9 +1003,9 @@ def test_forward_with_score_post_processor( # Call forward_with_post_processing_fn result, metrics, _ = forward_with_post_processing_fn( model=mock_model, + prepared=_prepare_cp1(mock_model, processed_inputs, is_reward_model=True), post_processing_fn=score_post_processor, processed_mb=processed_mb, - is_reward_model=True, ) # Verify model was called @@ -1066,8 +1045,6 @@ def test_forward_backward_single_microbatch( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1091,9 +1068,7 @@ def test_forward_backward_single_microbatch( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -1103,6 +1078,9 @@ def test_forward_backward_single_microbatch( model=mock_model, data_iterator=iter([processed_mb]), post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=nullcontext, forward_only=True, global_valid_seqs=torch.tensor(batch_size), global_valid_toks=torch.tensor(batch_size * seq_len), @@ -1140,8 +1118,6 @@ def test_forward_backward_multiple_microbatches( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) data_dict = BatchedDataDict( @@ -1165,9 +1141,7 @@ def test_forward_backward_multiple_microbatches( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -1177,6 +1151,9 @@ def test_forward_backward_multiple_microbatches( model=mock_model, data_iterator=iter(processed_mbs), post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=nullcontext, forward_only=True, global_valid_seqs=torch.tensor(batch_size * num_microbatches), global_valid_toks=torch.tensor(batch_size * seq_len * num_microbatches), @@ -1191,8 +1168,10 @@ def test_forward_backward_multiple_microbatches( # Verify loss function was called num_microbatches times assert mock_loss_fn.call_count == num_microbatches - def test_forward_backward_with_train_context_fn( + @patch("nemo_rl.models.automodel.train.prepare_model_forward") + def test_forward_backward_enters_prepared_and_autocast_contexts( self, + mock_prepare_model_forward, mock_model, mock_loss_fn, base_cfg, @@ -1200,7 +1179,7 @@ def test_forward_backward_with_train_context_fn( mock_cp_mesh, mock_tp_mesh, ): - """Test automodel_forward_backward with train_context_fn callback.""" + """The loop enters the Automodel and worker precision contexts.""" batch_size = 4 seq_len = 64 vocab_size = 32000 @@ -1214,8 +1193,6 @@ def test_forward_backward_with_train_context_fn( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1239,41 +1216,50 @@ def test_forward_backward_with_train_context_fn( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) - # Track context manager calls context_calls = [] class MockContext: + def __init__(self, name): + self.name = name + def __enter__(self): - context_calls.append("enter") + context_calls.append(f"{self.name}_enter") return self def __exit__(self, *args): - context_calls.append("exit") + context_calls.append(f"{self.name}_exit") return False - def mock_train_context_fn(processed_inputs): - return MockContext() + mock_prepare_model_forward.return_value = PreparedModelForward( + model_batch={"input_ids": input_ids, "use_cache": False}, + cp_size=1, + cp_sharder=None, + model_context_factory=lambda: MockContext("model"), + ) - # Call automodel_forward_backward with train_context_fn results = automodel_forward_backward( model=mock_model, data_iterator=iter([processed_mb]), post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=lambda: MockContext("autocast"), forward_only=True, global_valid_seqs=torch.tensor(batch_size), global_valid_toks=torch.tensor(batch_size * seq_len), - train_context_fn=mock_train_context_fn, ) - # Verify context manager was called - assert context_calls == ["enter", "exit"] + assert context_calls == [ + "model_enter", + "autocast_enter", + "autocast_exit", + "model_exit", + ] assert len(results) == 1 def test_forward_backward_with_on_microbatch_start( @@ -1302,8 +1288,6 @@ def test_forward_backward_with_on_microbatch_start( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) data_dict = BatchedDataDict( @@ -1327,9 +1311,7 @@ def test_forward_backward_with_on_microbatch_start( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -1345,6 +1327,9 @@ def on_microbatch_start(mb_idx): model=mock_model, data_iterator=iter(processed_mbs), post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=nullcontext, forward_only=True, global_valid_seqs=torch.tensor(batch_size * num_microbatches), global_valid_toks=torch.tensor(batch_size * seq_len * num_microbatches), @@ -1382,8 +1367,6 @@ def test_forward_backward_with_dummy_batches( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) data_dict = BatchedDataDict( @@ -1407,9 +1390,7 @@ def test_forward_backward_with_dummy_batches( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -1419,6 +1400,9 @@ def test_forward_backward_with_dummy_batches( model=mock_model, data_iterator=iter(processed_mbs), post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=nullcontext, forward_only=True, global_valid_seqs=torch.tensor(batch_size * num_valid_microbatches), global_valid_toks=torch.tensor( @@ -1462,8 +1446,6 @@ def test_forward_with_logprobs_post_processor( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1486,15 +1468,12 @@ def test_forward_with_logprobs_post_processor( # Create logprobs post-processor logprobs_post_processor = LogprobsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, - cp_size=1, ) # Call forward_with_post_processing_fn result, metrics, returned_mb = forward_with_post_processing_fn( model=mock_model, + prepared=_prepare_cp1(mock_model, processed_inputs), post_processing_fn=logprobs_post_processor, processed_mb=processed_mb, ) @@ -1534,8 +1513,6 @@ def test_forward_with_topk_post_processor( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1558,16 +1535,14 @@ def test_forward_with_topk_post_processor( # Create topk post-processor topk_post_processor = TopkLogitsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, tp_mesh=mock_tp_mesh, - cp_size=1, k=k, ) # Call forward_with_post_processing_fn result, metrics, _ = forward_with_post_processing_fn( model=mock_model, + prepared=_prepare_cp1(mock_model, processed_inputs), post_processing_fn=topk_post_processor, processed_mb=processed_mb, ) @@ -1603,8 +1578,6 @@ def test_forward_with_unknown_post_processor_raises_error( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1634,6 +1607,7 @@ class UnknownPostProcessor: with pytest.raises(TypeError, match="Unknown post-processing function type"): forward_with_post_processing_fn( model=mock_model, + prepared=_prepare_cp1(mock_model, processed_inputs), post_processing_fn=unknown_post_processor, processed_mb=processed_mb, ) @@ -1661,8 +1635,6 @@ def test_forward_with_processed_mb_directly( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -1686,9 +1658,7 @@ def test_forward_with_processed_mb_directly( loss_post_processor = LossPostProcessor( loss_fn=mock_loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -1696,6 +1666,7 @@ def test_forward_with_processed_mb_directly( # Call forward_with_post_processing_fn with processed_mb directly (no iterator) _, _, returned_mb = forward_with_post_processing_fn( model=mock_model, + prepared=_prepare_cp1(mock_model, processed_inputs), post_processing_fn=loss_post_processor, processed_mb=processed_mb, # Directly provided global_valid_seqs=torch.tensor(batch_size), @@ -1709,138 +1680,6 @@ def test_forward_with_processed_mb_directly( assert returned_mb is processed_mb -# ===================== -# Test redistribute_logits_for_cp -# ===================== -@pytest.mark.automodel -class TestRedistributeLogitsForCP: - def test_redistribute_regular_tensor(self, mock_device_mesh, mock_cp_mesh): - """Test redistribute_logits_for_cp with regular tensor input.""" - from nemo_rl.models.automodel.train import redistribute_logits_for_cp - - batch_size = 4 - seq_len = 64 - vocab_size = 32000 - - logits = torch.randn(batch_size, seq_len, vocab_size) - - # Mock device_mesh to return cp_mesh - mock_device_mesh.__getitem__ = MagicMock(return_value=mock_cp_mesh) - - with patch( - "nemo_rl.models.automodel.train.DTensor.from_local" - ) as mock_from_local: - mock_dtensor = MagicMock() - mock_from_local.return_value = mock_dtensor - - result = redistribute_logits_for_cp( - logits, mock_device_mesh, mock_cp_mesh, sequence_dim=1 - ) - - # Verify DTensor.from_local was called with correct args - mock_from_local.assert_called_once() - call_args = mock_from_local.call_args - assert torch.equal(call_args[0][0], logits) - - def test_redistribute_dtensor_input(self, mock_device_mesh, mock_cp_mesh): - """Test redistribute_logits_for_cp with DTensor input.""" - from nemo_rl.models.automodel.train import redistribute_logits_for_cp - - batch_size = 4 - seq_len = 64 - vocab_size = 32000 - - # Create mock DTensor - mock_dtensor = MagicMock(spec=DTensor) - mock_dtensor.to_local.return_value = torch.randn( - batch_size, seq_len, vocab_size - ) - - # Mock device_mesh properties - mock_tp_mesh = MagicMock() - mock_tp_mesh.ndim = 1 - mock_tp_mesh.mesh_dim_names = ["tp"] - mock_dtensor.device_mesh = mock_tp_mesh - - mock_device_mesh.__getitem__ = MagicMock(return_value=mock_cp_mesh) - - with patch( - "nemo_rl.models.automodel.train.DTensor.from_local" - ) as mock_from_local: - mock_result_dtensor = MagicMock() - mock_from_local.return_value = mock_result_dtensor - - result = redistribute_logits_for_cp( - mock_dtensor, mock_device_mesh, mock_cp_mesh, sequence_dim=1 - ) - - # Verify to_local was called - mock_dtensor.to_local.assert_called_once() - - # Verify DTensor.from_local was called - mock_from_local.assert_called_once() - - -# ===================== -# Test prepare_data_for_cp -# ===================== -@pytest.mark.automodel -class TestPrepareDataForCP: - def test_prepare_data_for_cp(self, mock_cp_mesh): - """Test prepare_data_for_cp function.""" - from nemo_rl.models.automodel.train import prepare_data_for_cp - - batch_size = 4 - seq_len = 64 - vocab_size = 32000 - - # Create input data - input_ids = torch.randint(0, vocab_size, (batch_size, seq_len)) - position_ids = torch.arange(seq_len).repeat(batch_size, 1) - seq_index = torch.arange(seq_len).unsqueeze(0) - - # Create processed inputs with cp_buffers - processed_inputs = ProcessedInputs( - input_ids=input_ids, - seq_len=seq_len, - attention_mask=torch.ones(batch_size, seq_len, dtype=torch.bool), - position_ids=position_ids, - flash_attn_kwargs={}, - vlm_kwargs={}, - cp_buffers=[input_ids, position_ids], - seq_index=seq_index, - ) - - # Create data dict - mb = BatchedDataDict( - { - "input_ids": input_ids, - "position_ids": position_ids, - "other_tensor": torch.ones(batch_size, seq_len), - } - ) - - with patch( - "nemo_rl.models.automodel.train.DTensor.from_local" - ) as mock_from_local: - # Mock DTensor behavior - mock_dtensor = MagicMock() - mock_full_tensor = MagicMock() - mock_full_tensor.squeeze.return_value = seq_index.squeeze(0) - mock_dtensor.full_tensor.return_value = mock_full_tensor - mock_from_local.return_value = mock_dtensor - - seq_index_result, updated_mb = prepare_data_for_cp( - mb, processed_inputs, mock_cp_mesh, sequence_dim=1 - ) - - # Verify seq_index was added to mb - assert "seq_index" in updated_mb - - # Verify DTensor.from_local was called for cp_buffers - assert mock_from_local.call_count >= 1 - - # ===================== # Test LogprobsPostProcessor with sequence packing # ===================== @@ -1852,10 +1691,6 @@ def test_logprobs_with_sequence_packing( """Test LogprobsPostProcessor with sequence packing enabled.""" processor = LogprobsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, - cp_size=1, enable_seq_packing=True, ) @@ -1884,8 +1719,6 @@ class MockFlashAttnKwargs: position_ids=torch.arange(packed_seq_len).unsqueeze(0), flash_attn_kwargs=flash_kwargs, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) result = processor( @@ -1894,6 +1727,7 @@ class MockFlashAttnKwargs: processed_inputs=processed_inputs, original_batch_size=original_batch_size, original_seq_len=original_seq_len, + cp_sharder=None, ) # Result should be unpacked to original shape @@ -1905,10 +1739,6 @@ def test_logprobs_masking_without_sequence_packing( """Test LogprobsPostProcessor applies mask when sequence packing is disabled.""" processor = LogprobsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, - cp_size=1, ) batch_size = 4 @@ -1927,8 +1757,6 @@ def test_logprobs_masking_without_sequence_packing( position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) result = processor( @@ -1937,6 +1765,7 @@ def test_logprobs_masking_without_sequence_packing( processed_inputs=processed_inputs, original_batch_size=batch_size, original_seq_len=seq_len, + cp_sharder=None, ) # Verify result shape @@ -1960,10 +1789,7 @@ def test_topk_with_sequence_packing( k = 10 processor = TopkLogitsPostProcessor( cfg=base_cfg, - device_mesh=mock_device_mesh, - cp_mesh=mock_cp_mesh, tp_mesh=mock_tp_mesh, - cp_size=1, k=k, enable_seq_packing=True, ) @@ -1992,8 +1818,6 @@ class MockFlashAttnKwargs: position_ids=torch.arange(packed_seq_len).unsqueeze(0), flash_attn_kwargs=flash_kwargs, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) vals, idx = processor( @@ -2002,6 +1826,7 @@ class MockFlashAttnKwargs: processed_inputs=processed_inputs, original_batch_size=original_batch_size, original_seq_len=original_seq_len, + cp_sharder=None, ) # Result should be unpacked to original shape @@ -2051,8 +1876,6 @@ def forward(self, input_ids, **kwargs): position_ids=torch.arange(seq_len).repeat(batch_size, 1), flash_attn_kwargs={}, vlm_kwargs={}, - cp_buffers=[], - seq_index=None, ) # Create data dict @@ -2083,9 +1906,7 @@ def loss_fn(logits, data, global_valid_seqs, global_valid_toks): loss_post_processor = LossPostProcessor( loss_fn=loss_fn, cfg=base_cfg, - device_mesh=mock_device_mesh, cp_mesh=mock_cp_mesh, - tp_mesh=mock_tp_mesh, cp_size=1, dp_size=1, ) @@ -2098,6 +1919,9 @@ def loss_fn(logits, data, global_valid_seqs, global_valid_toks): model=model, data_iterator=iter([processed_mb]), post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=nullcontext, forward_only=False, # Enable backward pass global_valid_seqs=torch.tensor(batch_size), global_valid_toks=torch.tensor(batch_size * seq_len), diff --git a/tests/unit/models/automodel/test_logprob_memory.py b/tests/unit/models/automodel/test_logprob_memory.py index 7aa820c4806..735391f7ef8 100644 --- a/tests/unit/models/automodel/test_logprob_memory.py +++ b/tests/unit/models/automodel/test_logprob_memory.py @@ -31,10 +31,6 @@ def _make_processor( ) -> LogprobsPostProcessor: return LogprobsPostProcessor( cfg={"logprob_chunk_size": chunk_size}, - device_mesh=None, - cp_mesh=None, - tp_mesh=None, - cp_size=1, sampling_params=sampling_params, ) diff --git a/tests/unit/models/policy/test_dtensor_worker_v2.py b/tests/unit/models/policy/test_dtensor_worker_v2.py index 57eec2c4bd9..a02c6e5c2e7 100644 --- a/tests/unit/models/policy/test_dtensor_worker_v2.py +++ b/tests/unit/models/policy/test_dtensor_worker_v2.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import contextlib import os import tempfile from unittest.mock import MagicMock, Mock, patch @@ -40,7 +39,6 @@ DTensorPolicyWorkerV2Impl, _maybe_adapt_tensor_to_hf, dtensor_params_generator, - get_train_context, ) NEMO_AUTOMODEL_AVAILABLE = True @@ -871,186 +869,28 @@ def __init__(self): @pytest.mark.automodel @pytest.mark.skipif(not NEMO_AUTOMODEL_AVAILABLE, reason="nemo_automodel not available") -class TestGetTrainContext: - """Tests for the get_train_context context manager function.""" +class TestAutocastContext: + """Tests for the precision context retained by the policy worker.""" - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.get_train_context_automodel" - ) - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.create_context_parallel_ctx" - ) - def test_no_cp_with_autocast(self, mock_create_cp_ctx, mock_get_train_ctx_am): - """Test context creation without context parallel but with autocast.""" - # Arrange - mock_get_train_ctx_am.return_value = lambda: contextlib.nullcontext() - - cp_size = 1 - cp_mesh = None - cp_buffers = [] - sequence_dim = 1 - dtype = torch.bfloat16 - - # Act - with get_train_context( - cp_size=cp_size, - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - sequence_dim=sequence_dim, - dtype=dtype, - autocast_enabled=True, - ): - pass - - # Assert - CP context should not be created when cp_size=1 - mock_create_cp_ctx.assert_not_called() - mock_get_train_ctx_am.assert_called_once_with(False, False, None) - - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.get_train_context_automodel" - ) - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.create_context_parallel_ctx" - ) - def test_with_cp_and_autocast(self, mock_create_cp_ctx, mock_get_train_ctx_am): - """Test context creation with context parallel and autocast.""" - # Arrange - mock_cp_ctx = MagicMock() - mock_create_cp_ctx.return_value = mock_cp_ctx - mock_get_train_ctx_am.return_value = lambda: contextlib.nullcontext() - - cp_size = 2 - cp_mesh = MagicMock() - cp_buffers = [torch.randn(2, 10), torch.randn(2, 10)] - sequence_dim = 1 - dtype = torch.bfloat16 + def test_disabled_returns_noop_context(self): + worker = object.__new__(DTensorPolicyWorkerV2Impl) + worker.autocast_enabled = False - # Act - with get_train_context( - cp_size=cp_size, - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - sequence_dim=sequence_dim, - dtype=dtype, - autocast_enabled=True, - ): - pass - - # Assert - CP context should be created when cp_size > 1 - mock_create_cp_ctx.assert_called_once_with( - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - cp_seq_dims=[sequence_dim] * len(cp_buffers), - cp_no_restore_buffers=set(cp_buffers), - ) - mock_get_train_ctx_am.assert_called_once_with(False, False, mock_cp_ctx) + with worker._autocast_context(): + assert not torch.is_autocast_enabled("cuda") - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.get_train_context_automodel" - ) - def test_autocast_disabled(self, mock_get_train_ctx_am): - """Test context creation with autocast disabled.""" - # Arrange - mock_get_train_ctx_am.return_value = lambda: contextlib.nullcontext() + @patch("nemo_rl.models.policy.workers.dtensor_policy_worker_v2.torch.autocast") + def test_enabled_uses_worker_dtype(self, mock_autocast): + worker = object.__new__(DTensorPolicyWorkerV2Impl) + worker.autocast_enabled = True + worker.dtype = torch.bfloat16 + expected_context = MagicMock() + mock_autocast.return_value = expected_context - cp_size = 1 - cp_mesh = None - cp_buffers = [] - sequence_dim = 1 - dtype = torch.bfloat16 + result = worker._autocast_context() - # Act - with get_train_context( - cp_size=cp_size, - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - sequence_dim=sequence_dim, - dtype=dtype, - autocast_enabled=False, - ): - # Verify we're NOT in autocast mode - assert not torch.is_autocast_enabled("cuda"), ( - "Autocast should be disabled when autocast_enabled=False" - ) - - # Assert - mock_get_train_ctx_am.assert_called_once_with(False, False, None) - - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.get_train_context_automodel" - ) - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.create_context_parallel_ctx" - ) - def test_cp_buffers_empty_when_cp_size_one( - self, mock_create_cp_ctx, mock_get_train_ctx_am - ): - """Test that CP context is not created when cp_size is 1.""" - # Arrange - mock_get_train_ctx_am.return_value = lambda: contextlib.nullcontext() - - cp_size = 1 - cp_mesh = MagicMock() - cp_buffers = [] # Empty buffers for cp_size=1 - sequence_dim = 1 - dtype = torch.float32 - - # Act - with get_train_context( - cp_size=cp_size, - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - sequence_dim=sequence_dim, - dtype=dtype, - autocast_enabled=True, - ): - pass - - # Assert - CP context should not be created when cp_size=1 - mock_create_cp_ctx.assert_not_called() - - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.get_train_context_automodel" - ) - @patch( - "nemo_rl.models.policy.workers.dtensor_policy_worker_v2.create_context_parallel_ctx" - ) - def test_multiple_cp_buffers_sequence_dim_replication( - self, mock_create_cp_ctx, mock_get_train_ctx_am - ): - """Test that sequence_dim is properly replicated for each CP buffer.""" - # Arrange - mock_cp_ctx = MagicMock() - mock_create_cp_ctx.return_value = mock_cp_ctx - mock_get_train_ctx_am.return_value = lambda: contextlib.nullcontext() - - cp_size = 2 - cp_mesh = MagicMock() - # Three buffers - cp_buffers = [torch.randn(2, 10), torch.randn(2, 10), torch.randn(2, 10)] - sequence_dim = 1 - dtype = torch.float16 - - # Act - with get_train_context( - cp_size=cp_size, - cp_mesh=cp_mesh, - cp_buffers=cp_buffers, - sequence_dim=sequence_dim, - dtype=dtype, - autocast_enabled=True, - ): - pass - - # Assert - sequence_dim should be replicated for each buffer - mock_create_cp_ctx.assert_called_once() - call_kwargs = mock_create_cp_ctx.call_args[1] - assert call_kwargs["cp_seq_dims"] == [ - sequence_dim, - sequence_dim, - sequence_dim, - ], "sequence_dim should be replicated for each buffer" - assert len(call_kwargs["cp_seq_dims"]) == 3 + assert result is expected_context + mock_autocast.assert_called_once_with(device_type="cuda", dtype=torch.bfloat16) def _init_v2_worker_mocked( From a1d830d2bfc45f699c58bb4695e553fd13c69362 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Tue, 4 Aug 2026 22:13:43 -0700 Subject: [PATCH 10/34] docs: add Automodel upgrade introduction Signed-off-by: larkzhang-nv --- docs/assets/cp-upgrade-exp/gemma4-26b.png | Bin 0 -> 186341 bytes docs/assets/cp-upgrade-exp/gemma4-e2b.png | Bin 0 -> 176236 bytes docs/assets/cp-upgrade-exp/qwen3.5-35ba3b.png | Bin 0 -> 174445 bytes docs/design-docs/automodel-upgrade-intro.md | 207 ++++++++++++++++++ 4 files changed, 207 insertions(+) create mode 100644 docs/assets/cp-upgrade-exp/gemma4-26b.png create mode 100644 docs/assets/cp-upgrade-exp/gemma4-e2b.png create mode 100644 docs/assets/cp-upgrade-exp/qwen3.5-35ba3b.png create mode 100644 docs/design-docs/automodel-upgrade-intro.md diff --git a/docs/assets/cp-upgrade-exp/gemma4-26b.png b/docs/assets/cp-upgrade-exp/gemma4-26b.png new file mode 100644 index 0000000000000000000000000000000000000000..6555c302538bfe8c4f8e6f597325dc0484242b7d GIT binary patch literal 186341 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℘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 $3mfAD6p#m@ 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

Ja@ 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

BF(F}VP%&5_<>W9Sb_C$a9`)i&zI0i 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 z z1Na%>5}@hG2|b=#OoBR&9zn_~x#%;N=Sz3@*Gj6(D{1!<0_XJ!teMpK-IsADert_Yh+Yxdw&lkj%(c}geb>bNysdWXtRBP#roUrp5qf47~6LxYQJ2zD{eYK`3rj1x*@pnlpc9qKzD^i4ev70_W!8wFq5!>8s-0 z2!q^gee4^Wt}hSdNO^EbA{qq=>r?Y?=G0!+Ht$jm_!kB;(~Eg07<3dY3nl<{IAdKB4j#PGWsK^EdSS!!Oetafg-TZA?@CQY%GzI+U`KR zXTpW4B1uF0{Y}*HgJWgOLM8WOm;x2su~-9YfKBmG3$-4;zSymnvbXhfg!R{y6l50T z{A0?lMco$28b@hxE9us2+NHbNOqz-pRzXy4vJWRg&;Av#;nLs;$4?j$M;rE4p}j$$ z1KpX5Y)2c%B$-olIzxNTe;Bf3iv7ByzzooC4J^n2rwH&2AUee{OBstrSY#jR(nbyrxi=I;ZZWmoT1s4uFYd2*Lm* zie!SQ@IwGa7}~lwMH<~}_PhBKEJ~}>ta}DYNh!*#XHd!v&R^e%3zfQgiOtJZ=>MKK z{_N-g-r|?BN=NIKog9wN63$PeQHB$Ztt8Zo&+X=lf3O?)Buv()GvEsf&6}Ys4-m_+ zF@4VHSDaAD1_b#lt8I_7ajP=a!NYs=lL(~!jS^fsu%NKek{@{8-;L-XUDUba4Y)b5 zFRn90ImRhlI@7wrQPeLn%xMY>ptz+i1{LpGc4kWiUiu!m|JvGqD2+VutkrV<7M)&z zGxm;8SoZcV(IqE2^_g|#NIy0_&Tsjmc&Attj)i*^314Hq{{qXrarT^QnKRoFS;aPP z&b&7@d?(Zuqlnu6Ryyh_U^{!Rg~~lKtk+^bj=+Nm z;75Niov*Zq>wHhA4;j+2-lI84xF1WMa0TotWG>Q-U|sF5*_HnF0rjZ8ekaJFQ_LnCox7g+aHe&UE+rEE!j{vM_SS5D*I}fxT5R9< zxwtWk(;tts+rMGUxMhdT@hK~sw$cNqNLDd~OTJOA%AbZ5ccdtYx=l7e;701rBNQ3g zJ&YkmCeO0N;-<6Ql7LaEyM>FG!UTTT&$5R8x;)$P!_U8EaEBba48pT8wV7`G058iD z48Xc^cD9kIki$(8@DG4Hph0g~u}6>ZWBZRp36R?yYd zloZkr#h}HloX4{I@AUyl!{Z*2$!cz3ZVVcPkAGag9g9&T9gBky+&?}b~hhAagxmqeWS_BwrO>lZ&ame|OLS}yRf zWb;akpWf|$q%1%m>j~(nPP52^7F_c_I14$^7*eI=&zWCZ-Q3}cdG;cb zA84X&|N`R_80^o<)d`D|G5g|jAU zJ=gB0MoF(M)()ai(Fem&Ff6bTbXgRVBt ze-5+FDO)9CyqBF2xWINjsDX#qhqJW5%v;U?MVv{m=9>kg4-zZO%tqMPM?5Vm+N7DU zrtNB1F5y*&2P{(WmioyiEL*P$-cc#)^D8b(-wO|N+bC!bl_cUvoJQZRy)VnG%>87? zvna{yeN)@ZxxnA#!UWFDz_g0W_t^Mx=9V&TnjO%Do?~zXfPw-vDr+`W*1m=3DaRLS zl+q{sGcMYx=PeneFGlrP&&TGKU&AW#Y*TV^DuPJ0sk*617AvH>y(5DWQ*kvzzgO`y zxChfwDQzpdf3bXhK0{0%4lSy&$jfN`5NXAuq^@kgbAd;eD`APEmn!3-aj^9n1hrYC*A;F4zk5!$DrYTB%V&bmdC1_;J zPALz(2A&ng;(Uj$x@aPrW)nkGz9QKFS8ZVk|L?5kv}&S z50x*27+Buz&N$xEAxy9%D}asakiQyUl9RJ;=kE4pV!Y|ocGNcPu*V4j?V3G^9e1;+Ryq86{ zOp5`VD%EAsswz}Oj=P>D^0S&ASCeeFU`Q-we&;@r4wl#QM20l|9+PHm^@`isvD(In z5`px%HNVxm{a8#iIkd005+#uhicnUtGGSpIeh2RQL|VuxoC^ifp+F#bHMNDsk_12I z_q?gRD8Jcrh?BQ*OMKS;%;iMQkoBH@(0ip@pfN;5=vCgJw|r5zCPeR?+41O`GZK9D z;iaU(Eem|4@Ix{YRewx-K@RIJJ3jXU)r-vd*+zOtY=cR5V?t_%QmTHkDA<)kq}0|v zxgxArooXog_##s9R~Z*A-;AwWHJ|#hwpOSFEk*PjMCSyr9Q`QxT&bS~!6LHe0-sX7 z=&3iC2$Ao{W>GBF;j5MI$pQ~w>2oQ%4;az=T@<>3S5n(S(DRlT_EExzzAHzCs$wQF z$0=x`v3s$+x&89L!YoQX23gPBV)NhU02z}2f;F6!+eL?~N|%o=W3r3DiU95#G~+{6 zZEMVSeI?trfpJwg`22LH8h8Pv-Pz07RyIY{h19CHjd=c9mmMi3>;kFGRRhtNMrk&j z^cU;4XJL9;$@8<{2j4hepwxrlTwx0QBJgh+MnebK@RtCeEg7xofRo878lX?W>fAD8 z()eNYr=N>@3>gxc0YZz~b(3bM-gU|IiKK`pfzD>B@Y^U_fZ!8rLcrW+DN&Q2vh(MS z-Mu-2H1gjQn(j3sQ>~Gz%R`}v@lnr*f!4feq9oIAYC>JB#pU&}@(m`r+p$kF^Be@y zG!C5Ln9Et6;x7ow9WanTjZcb#d72e{>RFZW3N2gO+U&@xcI6G*Q|$;HWvd;@=j=m3 z!{2bRSP3X8`dnt?#|f~ci|Q*fGah=Z*BBUcSw+rumtV(T;SY?7Lr&rA%94SxpLuGz z``!np{s*)waJ!vD$;mx!7$nq+g|fG*v*uEVRrLBrzY- zJ~HIP5#B!k0oMgAc~gEdl+_9nyum$`Ucl!5l6wE?FVa0tX66&k#QK2Z*sbn3d)v}C zsO|NV;HX~RcxamNbEfio=U}gauDpI>>*;8X_!X{od_IAfiyr+%_|syU?(skFk(yOS zB#oGMV&Gxq&iognQ^6JLe_*E75$7u2=469DL&d_wS7)AAWRy&4A z($e#&7D@SsQ2HnhXh|pVl0(aKDW)0rG+f!P4Z05z$Rooo_%2;FDZks>=)i75GQ@Je zf1+LjC0e(iq$P?6P^A#puwDy}?>PubilvZ--m|b)uoT=WQz?p7IA;_o=)R9<`gjF* zW*v!-s<4tXx$p3vJs&(B&mP9e_sk*FEs^km(QY;Som~`bSz4VvoQU35pzq#iKAekk zxq5VVPJQ-!XkN_va_w5ImFz|gw1zLB_tX58S=g`>stsgBk})Ozr%w@e-vC@u5pOlu zOvi7IF0leKA4ONmx5abIS8w|4@c5E56fE}1PYxLXWS#~AZL?Yy*Y~Wc)Y2n--aN3Z zfp1&=bvYFB*joI1{bUYcp!`l(Q5CBViSzie#2dQ`YZau_xtMBKk ziNejxqvAe{xpK!4Xc0900+{4(y*Pc??Cn1134}S8LLRq_#*bZ!!(<oj3k=PPdzNW1J`}Rjk>ZVRF-)-dfV$t&82wFpL=6 zHjGexPzbbp%9Tl&l7ZGcjQYnjz{QxvT9Uc()qMdE8W8NIZ!Gt277LDp+a*nJu*$p~ zmiyoh;9fO@+%v)YvoM#_-YzOH8j=_G?mAlu`YcV>+Wd_MA?S#K{$F~KEFK#Zo7E8WegN3rUL+0&Hd9N5_Bo|Q49 z&&~#w2sa*`b5CfZCxkh@{GQEJTObwR(1U7uKPt+E%w_SI_*CK{xS=giQQLXBX2zHR zXrWr8&GLt)*ZG-xnrZp><)g|$McqG<|DC{A1zZTMoDu*d2Lwp6BP5W8FBFc z%WD1m(8jx0KF(>IgH}H*HLee<#=KDqrXgxPh2vlMFiLYHJQplU6Y$Om z{QBjfaX0dkf`+zmt0&QLGLYtC&J$Jmcm!!iAkv}9`NH<}#IQ~2;l#W>uhrWP9ylp~ znBfyu!pLYbIb{1E@>o?FJnxhtc>5L9GoZ5iMXTw!kGpC7tcuT0!>BVS<#z(j%=dMI z6cAOWwxJ)V02X^&$uFm!#s%fW^me*HPHuoAD7bpIvyYYOQQ=wp<&~B5$N&a!A0Yu? zS0YqH%C1-q{f{YCmu)5i$>m5TC@0MaRg2*^k6HWtIcif>1U!bA2A(BM*pI{e1B zzALT>dy;7smA=>|>-JfQU&T!7A0c3qbz{ha7T30WNNqDxswba@B*8McS|z=DAp1CY zLKy%H+FIS=KTr=R&J7l46c)BE1pxF*NU*7AT}P6Q=w>>z17rT{ zi-O(IU-$Bzxm^_%kD(K$>=_Sv+CO&taIwVsds}yq9Pnh+O@!}Yi6Rw}!2Ujx-lJ(( zLX&-UGlwu3BlRlpry6AMS=Y^BJrg9R7S#KHd z1?gLnXQ!^Jy7Oi;Z!$KKsH(#aKNlLFTd;5`lARo;zLT$pehJLgm>N`S2vNixdDnH- z3Ssd0@B#6Bg~|$V8dgE2v9-|j^3$?QsrO1%8+#@B|hKs~5MO3)iEhTx~J z{YKgCO?har00^#wStv!rsI@7oGtQo z&^0G?Z5ysT+{(9QDO2k&K5i1H5D@-&dMgGH+eZVrtj^-8Qnuxz9!L}w6~m?q!6BL@&$uS?N&dW2v}6vRe^;O4?G zfAQg#8-V3BmG45JP7Hb+ze0kWz!2P*?F>v3KCwSC@aWuS5g#ehx;c%pD7VX>@JD`5 z@<_krp+(*tdAWmI!D8OS@5i@(CSR94y@gupl>OAOWDxe< zHNHn4%X6WfCMYBSUST9DyEx)*y;0qmO5X}vJO8Bz6r0Ewh{f0t}}LciE*A`=b*ln=j; zQf%LuBymb87fbRD$2Gsx(9>%L3sIxORAu^Bh#MpAuWlY@Qg&*A8I*RZvbI)>$#dp~ zWRY=Jc$@6uz-TTLz$5Q#uL)ro`bB6*K0WhHpQdTnE&kxQNNwpX;V<7aY4vt$I@CQ}Elly8g9>?HSrkNvN`s;|9A|{?p2oL2 z#2@5!X?#D7{_a!!04&LAx``^~(B4N|XYOkHiTe^6iU}_!B!pZLos*_@MLducy~E9} z!ccUa)nX{Egyp6Qbs>0ddn28eiS8=!GtuWPPog~V85@&y^X7L41<_Cdm>dZu+e=4O z1-6t4%WBbCE_ag{<$%(4T=v69X_3>Y>XwtHG*@C7NLgR(94 zKyi2S;FIz3YNsl2esg1^NQQ}+h_s-|wXRn4L%dQLiGkNX-`&OG1GE#H@)i9EO~s!> zLTsfuz6E5=M-qk_HbANS+QaD;VgGgYF$ZcLKJxgWE-CIrYf6Yynqf2Ut=R6e}zFGDdJDqc>< z8U)X?X3AMUT%MQ=3inv{{l#Egdt;>7G+#xE{9M+bEM?AeF8Mis*7Gne!&$dw@K_*P z;q$(-d9zZdtoM`{f`gSsZ!}ZG24Z?T^_Ul4wfI#yL~rL6e7U~-5+!u{5$bD|* zvrWxq&>(H%bQ!|m7e9(^ftS!7>n8p9m8Yyle;hY+yqt0=$FK)`_>P&@Y!o^ zmC`bAH3O*esSpSTh40eOg7|<5ME~*hfaQBG4~FppbcHeFG`{mJAjuH>GGwj+=mZ9= zmZ{co?4};q>x%jx?VT>oqEj3UH155sxrYI-kI=lNFXV+z1<4s`u`Qqodv`Jr%ggxR zfw-4U8QTK;`H2~(F^YojZwwxKj(*bE2He^+;6&Md4RgRiG@}Hjb4W??V}_nMAR<}!C#&suO2l(}mnk{oot zSxGfBu9E9R<4fsVXOK5&Sz?#B(Kvc;ud?DY`WZlRAFfZdiwf&mS+bU0F zRYfmG%mHpe{gfL&@FU*E1Zc>$BndNiWs~+Zz0;v^hU=b}AU~xH4^wDM)XIygx{Q~k zR-YOn@%o75E_23I^Z zWMX|ZStdl?Id90+MQ+!O>t(fCvOmpzuF76qXKXD@RdPQpcria!lZj8U9Zz_Pc2V5nh$O1*@|lbL3_mp-8OLy~zaq=Heb|{>3z9 z5rP6}FlGo$GD6;bf4vV0k>nfo;F!|dAD|Bu2& zG|x!|lYMvfqmGqZN*^zZ3V0dEQcJfnSJ2qA+jD(sv|jiQ(;6Z!?@98b|6X$1eS0xH1uVtoQ$K|ei>-1*!@(f%KGhg%B{Fntun!MJdt zdGOvSDJUmiL6XbqlBvLRYw`QoJ?m8Q1Nj4^{-p;J=2MPU_N0=PzC zVCp7~2 z0)9kV*BW*GCf?uK{rJA{=imw!altva_?NCv;2+ox4tb0s8^WPI$4$fa-HE&Rk(aKV zclZ7q;MfD-gC+Yoc>Aqq1y5Ym0vep`M(h4Y=0eCtYpG)byNoJwl;hW-ayli1zyEbs z+X8Egh{P;KmM)E$4c7mC<<`nT51}O^8tU}SiYg_PA^W7l z@$gDKzZ|gBXZ-XzM|Tb~Or=9QEye&JG{NtrSL1m2A?6eBM{&;OXV-K-P^nUK zIOK^F6H`WG>mJI?+eKy5n|mFW$VHmw;ih-v4REM_5|hk!htIsj75(kWVExf}Z`v z80B-b^`w$*#h5wk>pkC%))z%G5XSk&-S3yjDs+%T{RWxOUA(LPLY-z0i50JMRrp8^ zVeXeldWRX5k?uQFBL!s`VWy%F>)0u$Ea8Ow=Nss@sYB;yGtBqYPQ4JW?4)W;g~!OS zRMvHJ*zRqteZh`@|9Qq@u*7Fc?o6at&X2&sVO1w_H*quFJ)B32dZN_HZkDOqbp%ZD z0{QYR^8c_%fo*PN1K6Ov)>q(zSuT;}7@Y~^?%{Nc)7trb9m#)}mOGhJV=(#dxA(iI zt~$PrQO)-lKu-ur1e1(R?HHKeSqiO1Nz$9D(S%u8wcVS4u%8!y^INv5=8}9%b<;2F zVSSde>9C4prhXksK<7#u5aS^LY+Mf4M2Ae-K@@pKSuoHkSfW~BKTh`%5gB42fcr3d zi4}%Bg;ppueZDMsP2pi7hv*jRh%=<{m$9NMO`wjYK|DV00UaWXkRoRYbJVUt)``Qh zE+rWG6TdF_eL>EA$QR7o>J~22`dgm0E_goKY6wajBOunzrV%54)(j! z{+fAF;o}ss!0(xGzxZ$;<+8S==W?}LdYUnHVE=HRX<^|Jc+l>yEcDb$Md;&U=NrJj z?&8JiN`HF}K<@fRwwdYYqa*k+)uDO1c@vBO`=^%Hhdx&f*x-4@-}I&f`MP|-k4<%v z)h3jvhc0hCWvq3$*u>}Ns)#XE6=pszp!+TGDWbI)7=Pf1@WuZxCF)S3VG7@%qb0C7 zb-Mzs=Z(>mN(>|@nLjnf7YO+FpCZy*ri=L1eqqP(ec%D8oO4#*FyHmupgLjl*+ue} zS3Exu)kzu*(U3I=QyM$M9qgM($-e`vhffHRP6F;OOl=0OpP_{DPY+V#{aYKLB(u4M zb5AA1$G`zli!~pB9P*V7wqJt6B{Wdsa~0-tW2?8_UF>|?>UWKvj&Gdu$W4ni^mrX0 z-pIIvyu`pbk!I?#z98JZwdk`iPes!w*SjDf`*4|?32$%v^DH7vrhxT!M(lddoIL#E z2exYa!)&{xZJDBr9N)t2Wg+WmRED=0?);qdB-v@i;w^_RlPGBGWbOh1Vw`h;vAO#ad z$-a}#oI*t&#a2Oa29!g&f$RS#z*A(|BRXWmFK+Wn%AE@t4@l#zgcE?0ZY>e41>wT4 zTl2b1b;QOLv{q<6l29ZyqOXwM7Re1U?+$7qrR*78sWu}ek2e(OBSHI+2+#p=&m%`q zL%NQTe$vqz0A|26kxp`NNWk6lq{IhFN&W<@7pBy&0XSyWI^0+xuWs5 z(?tH7P_4G(eAbb~wo87JSH!v3O>e7b3EW!s`6h0U$nOP9is+R2_7e1XaUMJh3oPG3 z1mffPiVF%-n5YmL8o9^I#*lddvS@@S4Rm9pc6C~fl+|-l+;c$N=tTAyXxriciUVq; zXlw+45EmgK-1%%4nV>)Ikn~z?Tr*hT!e*H17Su^Qu|9RBg->FJjP;T^>`B_kgdmKU z<}pv&zh7~J+BftyF+_vSj#Re(iRS(#DHPHGKlclnMFZgHu%^Q%EiGPON;%@|m;&IK z(9O~uSX)YYB`d&&$3m0A#&jS2L_oaR9Yt0JrEP21sewVbS_V)1JjFVUZ+^N;iVK+x z|KW2YpZnymie8C<*_+`Q%dS)+5gYF0wXMtBM^{L*4iTU-2p2dh^5#ZXYbDSc%Y1dA zX*l~=E9kyer7#}%1+2CIcF#?)N?w8CC|u~HqAULNH?1qS#>N5tw;qDLJUBp$$IwkoNk2}Ads?K$-8CCa${+-<#Nc>F(;Tt z`R_da+G+sDMPpK0+CKaiEMw;g(ZTq?2UrtrG+hq5I3%}**yKG>NRF1QFz)LAy1)=% z#9#LZi{bu_pV5+`7PsudNeW9c*b(8*#uv!|j9y34Ci|Dk)U0pLFy5DkWrKw1MQh|Z zF(Alu<%_qq8=Ban5eLXsSBe~Z*O0kTQ``#sq?5fodaxLaI~&LK-WO+}eb5Bw76#xu zF&8Vnt>#1mG~(c89FN^UgO^Je-Q^prD7UC(@KnvKk$47JNN-^qYY9`hh+FH#i|<~k z*yBk5_d$S<1V-&oMC&^|O_UaJDlArng^Y(djR&uEpo#a85}ea`{c2uA;~nJphH?J0 zITVBwT%#)8?KaxF0KgF3b=(wRYsR%wN-vIdJ@Aqy9`7JE-GAN^TO5ZLhZ0jo7cX0B-^m@0zg?06X47VvkCR5N!R%U z5JsGwcbbh4UYH#Plpm4BUy&q!>iW+Uwmu7_`mSAvE$V(LdZN1!ExkVW$y= zh3lnz0=ygv9;R#R6G3vM*09EQEKX%aNYxKJ$FcqSW163Ytr$u}G5Y?gmsy=-g61=X z`G6Af6f^a3d_)p;h1E_mo2j=2%zN5YX`}p{Omi>gfkS)%0(M1VPrZ3QtnL)9-gF^w z)iyQDtvJbgGr-l;L>$I2KB}lnhx~u*w8w+L!vP5AB*W2}Ehb`J5kJ16xErR?Tucxf zXR8C$@~S5XE=-@oz|)`9^yG>l%}9;)0?yC{4LBQ-?H@*R&B zT?RrD?f8fT&u=^jZI5{;(0mMk>YYRAouD~m;XaTL%Y(8pfhd?^k6I~qPAo;RGbW+a zOV3EkEcW9)Q=Mi(nw&ldXMiz9p+bS2Mgs_B)Yqp(E0z>D#dBeNVq27b>l<38>8aFN z+W+;({&mToAOLRkj!y+g98R7CR9RB2ey=2ZH{@e4@wfE<1gK{!1XjS`{`3c{Rt4<| z{;Fokk#)9P_g4F1|+mK}Mk2e1(M@ zV(yXf6+kcsN%j1@f@tuQ_n6evBdf=#z5e+Y{O|TbbRQ7aAfJh7?}RX5f&OMVcHrw| zkOm@R|LbTu2sauZH)mV>mj$g1*f2j?>YOed_1{Q(z(t1{BQS zvim)1&sO;Uo(LQ6bF!TCUksijL}VAT)~pPBIK(TNJU+A@IUMEc*7EaPfdy{ zD-@yu{C*E_-&G|&Vv0+o-j274{Un!u`(AAGs$2ZuOlit==>L-gJs#7QB#3+9E1IHh&JhKz56E8Pnml3Xbs8<%`2LrOUK zgfVwo*!n;|*)l|lRbYrH-#Fs1ZuJ;QPX!Z;n0S%*RxYGWyvO6;@CnkUz1s-YEQ#SYoCHA)?LoA+aa)qJ*IwpLC312g1Cc%%IWIH~aYea=E zp8(^HH8U#R=x)pd&c@|1gMY-@$FCN+vOxb+w_%glnkgd@uzLzq?qB}f?33RJNQnUM zs30;EHxI*|lf)+|>|*Twv&KY++h?Gl`Hy921gknafsbOsEbPZ60*}knRLW%$gVL60l0ZKT7+$p zu3XOCoA5O5-g^em#L?EpA3-#cbk^<~w3*)rH}3wVavN>^Q&|1Gf8bvVYQ#O4&PU-{ zmskpkw1TJ9l2au-2{fW0-VujXy@iAPI{^&z`vA>B7}SF6BH6u{8$l7Eaz@@wIArS1 z(s#pMWhih7Ng|!RmQ={PIR(;0br zby(*!kCrf=who}|JPGgt8Hs%kw^y4tzl?gz$?KLK!<>$US)q;co0TuSu*oq zGnfCQ`TrP>Vg4kmE`JeGJ*u~_^-!fm(UF^2m11vpo>yfR=fE;5v0eb%DqQ&=4AH|b zroez5@z)XMB@8~DiDSeB2$fvArSx@%Q&Nq8-DduZVKhJZ#7+Z`F<^$X z+C5vs!evj^M(^Ic{|rd)aOTXlp1f%Oe?JEBe;MF@xH8z=zol2Z98a7jGw8T3v#rlh~V#a@|SZ3^|@VsSy` zELR6mN&W>0VWY^OYMi-@aIh7lsneRwgFIkz%~%@iIF#2z?0{*6({qoqW^H8k1A5T1x7L=d1`fqX$+(1FD@8f3;k$viw=I}1b#x`}6x^|6Y z?!PYV|B?&;4y(T(ayA8os}!Ya;I5bA-CG)V0LFm5i3Svxsn22`8iLJwqVPrm>xhPv zuwN(g9V;c-)vdv`pQZjbG1u##kYXac$brKgceo}S1B;J9>4H0OddIlBcZh%-IWZ}q zUUU`RdV;#MuOk*ZDn@|>+;85Hf=smt~|9f-@6?W*r z;C8!;#{V!Z6e-}nJ(`&qr~P(2{wt%!&GDXeBX9urFmr$lRSI|@1V*)zN(#0Awf{QH zT^&@ZHLmuU#8q_!!SK{W#n${g#vxD^QqII9q?J^sKaf7>L|~T_d$hgi#lk42;-<*y zyHHs2pok_%+@3Q(c6PZVl@u6pkPK^GEIy1X`6DAr&93$41!)PV){p=6asMZrbg&@< z%Cgl!!2QP|yKi;C^}pE8UsP1JdGwPH56vGCx5xmK4Fr}%sAU0VIR`aGZrTPS=UTfL z7R&#`)>lA9xqWX-C?zqJbhm)S&?()GbV#>!r_$Zs4Fb|BCEW}qjf8YaNQ2*tUcKJm z|66Mo>s>BzX3jZ#?`J=I@8^J1UU$8sqR!?TujP?tlUgxK9wk1FUV5FgiQ>?-mu!*C zLhuw8jQf_Q%jAyCW8{}&2x1t}KaWV+CYdoOBLXh%kIqo}B9w-x4dJ%xPbI>|Sq*s4{C>+1Mw%P*aIZ*m#g7x4wRt6E`o+KsrJF2!z=TY>Qo6rSTV|Ixb^nc5Lr?KH{yY?9=B4I`{2z zcQ0GYJ%UbU%X+)`%=Smz9yUR@&!V=oI?|Ki$0Q2bu=&Y;K`++R%BYl2Ot|ZwhuA4y z8M~(oEz4mM)L93XHb-Y6;qd%h(E<*}M(U%MtZ$-d020oP9H`Q-Kn=Nn?8jW$d-@0# zF%?kc<2+Z3JB`t#b0awHdVJ^K@g+&tm(Yv=-zBcq38^!{WbU%^T?oQ#08Nde_U#A* zCyzMHlV_0r5;|w~04De?DGJoQWg$VssT8f(OQyW9t;c%EWM9p)IRoub>W0ueYiWoO zufU?Wgl73j$n9GN9xLyVMh3GQ_varXnZ6BljzV&vxR|-VS+a?#=`+Ip#YFbt@#s*8Rk^?fBB)vr zroG{_RA6HC+-Luzu?N+6I2PyKSOc`pOQ4DR8B0A@#GRjTBec2bmr4xy?f8!FZi);} zhs@FTAEbaDAlOe@1Gv2lAUx*fo8Hswx{=`IUySPI#}$oDZYKwk2|YDzm^14GTHaDT zj)3x!2#3hZ@Y4s$E^e=LF9T4-v_(NV&_{NMx?iwa80gyW8PvmKD!THqwU3+tGpw69 zC*u3r954u4p2pozMwIubT#bq1hqo%EObQD=e9sEpFNa^BXc2`JBzP}A?`5aCK7t}R zO!Tw9^Z;D+-5v;}FA+n4)kQ*k>8LE$JGl|QwnSs1_50PRWh1dFsn0G1!v_gN83I}q z_XHCpO-m{RAH$_WryL<`Tgq4ng$~)Pe5*onsVhp-s*o9_ z1p_|7li9&PMTr`Jp~ok7q_>}2p2h)DYddpu-}nNfLMp;~l+G!=#i*StNP?Hb#L&$q z9@!@QpxXFdh~{)po?lF!_nfKxjb$OKz;&`*I)72qL_g#P2Fm^PVA64O5w6y0i0Zoh z10njS6c3=cj{cgnglnna`YN%9_031G(3$C1lfWov*xAMwF(?-oiSTM#>ujKCX}7Qu z_4h$jcmx}3nEuOWt$uV+Nd&U|NCk#PA8pkc0wQFc-};Ph2!Id$=nxiD9u5%XlZV=K zqule-Kx0anZg+WJwZb4BLWiG8!lQ`lmfZ>xOWom!mp1Q!*aWo>^1YE+ORoZS^-QrH zmX%hhfi>#4EfF6^0rsSW7gn97rpf^ZAeGshjSYD;=oLr2q#elbb}xAx>$bR^tjs1w zSmcU?8+)geEv3n=m!~9elNT615pDw04B7I4P-1T+vWkvs2}3(XK%$l7+I(SC3%n`= z5GB@a#(7MMRq(GzMR)gzvwN?(j~jz~1CZog-elDu0p+wj!Z;pU=h>a@H0p-( zWyz4^AG0%GfPRjDkd|LKyyNmKF(8fI28vdV<3=J@U-2Ulpa6bIg|qcUx03pgi_$jx zM)1fl-~o}?X4p*#UeGtSM9>N$JlQl;plGvw{=OChs0ks#g;EBRKZ3*SlAYT{;s*j_ zMnA^j`y&t^;Ni;Hpmt!Zi`;de4a{|$i2!^yJ`&s{TjO{>d7OLGu6w*Y68!_>rSqGZ zKxZg4KV`_UJAN8fP?ZyD5r8p#79ZtF<{pCI_u^o_DZ^%^ij6UI_3N}MmP&g?;H`H% z_GI@^qfYxOwxUej6kRtbedcN}GjOS35)M?YK zpKNT;zVgr2nV#R4K*A(?)|LcfjHVp|rW(dOo6 zzfD8j2sV~WVAtyt_ac9VLVvpFLm0_ZGb+jn>g>#1qRM30q4-GV(48dHh&jk%?nZ_j zX{CdRsb}u%3xiG%`NXfCr+EskN+wtQv9|(wh85FaS}L-z^=1v+^a1ZkL@d%a`{8gu zydF}g0283sq!T|$ZJOBm2~-}&L;kYWe#$!UTG%V>cv#$LW}LVD6qx3UgQBRhB9pg0 zM`BC2%E{cG?mA(9=-2_q6|vj_hrJ#_)`0b%5ggWfRASJzT(Pr=ZTxNd2B6+UO6^%M zD;4+w6hQ_nCeEi>rsU*AnGlv-)H9!tHs~q>8z*f=-SGVeCY7YHah4I5^EA?YF-n-; zFbA1u1{NBU{Af8d4fBf`YPS#lC@nTwrUa)@=WM+_;lum?%IXl`3CapHs{%qqpBd#K z9c-TM2?r?`!IxAYsPmnMsx(G2f=7ng4bOg^0tMFxPg>~`4+u{%^1|aV!{?JQ{nRv= zpoY(%6;%sETgiXFqwd5E>@Z%A9k)UT)*>@V76%${U5142u^%Q7cW{A@k4KnV6o6*Y zs?w3iu1CQjhu2X+lNe%nK4%RRt^O1VaMa%Bpy}Li&{YK&dU-uBf3L$k*049Iy4$)e z56qQKEvkI*ON|II3=MdW+%j7nATZK68(x#znGDFl&c6y1O)(lrW(Vv5Knx{|roaHcyHb9z zNeNC79LjVLkHS^&vo(~GPr3CYy>;r{DgYiglKYZ3l%?>wPtDwL>&g6Vl^=cLnUC0_ zE$Vns(gy`VQP*Z^_N8$FghtUhvMQL^hHQy8N3{E`gh(UB347u;`>jBqAmy7Oo)i1S z_cZm^LZmw%2ilK@oM z`@q3-qKPMX$2T7a`AAc8#kRLYtC2ruPyE<}6+#Fa(NmvyS%%W-RmweZLX1N?<5dq(;s3@SX~&y>cx3H0!p()>h8eSZ~J2Qa7yKj0GDf z)yqC*P|+evEijMx0Fof7>1Tx+JngQRoBg*ii+?)Z$JzY2-s`=OS`T#RZC$DTYBW;{@ zg@@H(t>a8Q3k5qY)S;^_5^+EY9_Nz=s8u^2a#*&Vv88Rh#U7ORs}?il;(XJvP!X9X z=dE+p_n$_k})xXW!_|Q3TK8$x?gs9ee$BZyIHLrE3&>hE?NRqP+PX^ zty?JKz?rdQ{rc*1|83WT-O9fV*EO}ml7xyTh-$^i--L=D^L!!X!y{2GLcf6+ zrmLd7tk0V43ne9!wEW_t0(s>XTL}l&U8Xe&eqFl1Y^|A6A1HV4uH23_m!k&w3AVvM zfLO}FFd<;XZ-0~w-t6SN|G=ajpbm#&)=D78N4t+rmTK}kqK7)hG|HpDN#Jg}+r5O? z35cP?7z*nF=PIJ@B;9+inewF`4`Z69?BzGuVM6&|q65ITIgJT9IC8SWabcHaD4(f79v_xZLiV;=I(Rb7RMi@d3?5QL3QPKDmML z*;@kaPqt+k4Ka#Q>YD{XXE~iqg85Ks>2oj$`9oUjdCYryJO~r_W)4D?fL_3UsP+4U z%5EP5+8%)&Jf5lH;bA2wRmy}!ygjKTN5fC{zs-;bs;?Ca@2FieX-sC~%QTa9YfU)b z8wQS>N(cV7og7-kOOv|w%IEslvRG{FA_8GwZ@+NXl^3!AWP6A^hv7F-7C1cSbh)@e-Ni;8`U5Uc00{bc06Ac zZMMEKX}-u@QqhRH?w2y51m6nrO7!O&)2tdvF5TP|uyzS)CXd?f=C9 zbhFOogy{YXU%!5;Km$Sq9`1c+PFk&tS$L?BraYq7_;=j)f{#$ZT)w4SjMK#tw)tTu zrh1szWj}&mvGB;)b5Z=(0)WWe?y%8$6w;PIf0x-8I1fm*!WX|q+2J>2oec`FOZ^~Y znEpj5&OI>yMrOB89q_OEPoNDm5!`ixO&Pr%15)w!%nj^ABir1B!Z>2r4Oa(&bVbBp ziMjRa(EK6Mp`*1^kmzQ};CAr)M1~k5a*N(zpA^QvG9md<9ss^hWp4_U4Q>EYh=qD9 zvWqWFIv*WV0A~leo}scPwr>9=7#+EUgC@sG&Gs1&doSJN2l_v1(Z^Vje{C{A_MzEo zge_jj3{Xizx5+I~QLJ&c6E;bX_|<_zykr^3{QBuH3;gx-nnM4XIjt-pQoo%^>C$j7 z@a_qW1DIyC#Ni+GdJPMx|HuGoJyss;VI)hU5mTiGys>W4;L6U_qN%!IS44){>;SYP zQ*VZ$ijB`Lw@#0pdyk9g&pe`XLGK0!mHMDD|Bs~dCrDv9y#d!>bgTqW z<>~r_I;Nn20qF=3o6uN3z!8xcf(b1D0|J4!d?ot8<_4M#hMbr#-mbSoHStWXiSq|p2$xA9ESfCQRrd=~m*bMw9|Gt2! zdl^~(?N3$5q79ItL4zRG&vIPut47`2z+l2!S$VaIvx>sPRLoJ#MV)D#D4+~Lumkk3 zkYuAmTX@EmNno`N7&q#q`{KFuFw2Fp?Fe-(RC*-Qk!e^7uvWw!8k-Q{_X5?LznL|C z?VshH7Q1*1aWr7Q1?_9?r=9&aPT9lvkmL(2XTPPt-IO4Z!T^q{h1o#ZD{i$>ITEOG zfJr~muDh{M1OnA#^ZIJ__l`NZPpxJM%mA%X%8Q1hX@4-#$SXlTH=FT#P5uK!i4ob} zxrI0kMnWm|nh5IG3%G<*`cenhnUE}>SCiRQdrGB2}0 zXE^D91=Kh{ZZkEmK$ua#pMReOc%hMz5r$^ISAW>%jUZp0dr8rrcmq#t6UI!;+y3K%<_V$$&7Y74VXWKb27m$jK1=doZnWLhM7tWC9;>#pHB!aKPICrL1|_I<`5uW@D1%f@}D-)`3h z)nX60na-)U0b&@nUv%Akb$RGdc>Fs@6C`;7yZ>-a3N+zow zhQ73TAgA8snVa_Q5pS4T?8uTRf>~;;@*+l(N zdCNq=pYOlIZP?!-yYY@)Mnw>8lRoo712*88+V*OHLtxl8D}~3$E}OY|d{`w963|Oy zlDhNJk=Mp3CUU(i`9HP;^ytU=VnawGCKtCp)bmG`Cczc@WqFhrlR{v-{l2oa)bW1b zABwkTp8QPQnAUduC8?yc*jIPuf|2mY{&2VsX6NvL^47K!_Sh7CN#Ps5vqxT6qYGwc z{i0(Zzi~V19-Mpz$<9gKY<_p&IqgL{8(QI&2X@b~&zfgDP45Sy^|FHeyN`EtVMdI) z7RMJawN1J+Hs_L-NjO@jc^fa}u3c8{u&r0>Q@FWXwtLi;b3w~de|(b!0aQY73Hz<| zXvp52(GbxEXPtu>41)M;cI#Ok7B@6Yb5S62)TWO1!x=g%M}y^F5VU2W#NUgBn1|Pe zgNY~`Zg7Lm!WAk}pbr1^UK?BET*1dq+KjO8l^Q|c70ov;QUzw~!q76i>0MA(ZG zp+&2!ujgxDGgvnsKPfF!muOh5jhR_-fwNbd>VwN_w*ZT(v$eapi|^`7ZWeIiIs)$B-iuF{Gg0fl_1g%jH_V=}NkoW{{vV*jLgq!wMDW8B?Vufp2b)DtNMdxN!y1Txx!a;TcthzGXRXFOcl9or2Z|v#rhU=` z{W0E;3h?N_qDPD;Td<%6{~GV<`z&p;b=L?+lY!3;Xa8Grk3+!GF>~h@Gs|9x8{i}( z^58%+yY8ej&@E9{P{IvC8mb%;1?Wl&A``utVnqGa3{}fa8!K7QBQ^nW9}dh^^1sljgcao+ai&LRagCjpFID^Afid2v0FmulI8|jS;Wdm2KGXO&tws<-*#8c?Q_-#6voE; z%1M(+yD3iNDhxZU9VTPsu84ncAV|gp=bWv)uscuhGUC-@{ec~ezOhHv6BC3)T zMXr$olk;zVsU}T41CK+4sp6x>iky)SZc+f{@Qd-K5GHrZpR z67Hjq_ocx*I4X;TK zV?ioAams>;FXIY0P!Wywvu2J~@qs~~d{8NtASA>b&q1U4Lt#%Bwr(+$nr^y!wQWet1hBYU!?L3Ce~S zirN6?&jQ-Os^AsP6HuyzXyt*xMlvf#b*74Lve{@{Z|M{$dLBq)0}SjBhj;be((fj2@jS3{xP z3WapW46VxZ5}-O9z!K9u2pgpwW?Z`?Kg+ZuD>%V9aFoj$bX~IJAD1EG zK$@LmGAL>W9$#0b^w+^cibUHH7i3{isg|J#Nuw~1Wj2ytG_Bqch&z@T=TOo;ElL~3v*S?`LFTs;b&#karsy!%-s3oDHRCbYn(Rwz&kgjXtf9~yu z>UDqhnA@QuW|A{P$#7D%+3sLB+s^>w&tk>ErhDmH%&w$?QNXDI(S%{Ahj@!-Eo<%zNdUBcDpCxA#J=02tpMC!#3eZ_#lV=@%_MN=`fli{ckAgI(- zt3n^Lo}%)lJqD9wOpnI*N`_K~A&qz<7-N4JRxBwYiBI`)gl+Llf#py51{|whcFYO~ zLl$aGu<&&Y-|>+MV%;pV7%f<<=BQL^shc*jo3xj04W(E@iM2_LqE#82%f74V=%m0s z7A%_wM$e6Wtr`?!@8F=K(?nOGOkwP`lVvi=5!KgakW6*`1rX|Pu|im~KP~jF;^NAf z@*pP4wfyY9oz~uvgdLwS(d%Rhgpyb8JJSt2bq&j;??;5*f6yYb)on!PX!txoPjp!6 z)1F@yiwgZ`+3ca$*OhgZ$IbZ|*LW7Lhj-M~rMwC%IAwHN^a%z@_05Mhh#q{N=#F(g7(Lgw=ICWLVPV5^49+UPhD zet)=Mz?MW59=36uz=cjNVfX8502D1tS+YwF0PQ+xHRkU^7)5$ zStRWE2|kx)u~*Xi&Gns~uerVIV|Fc)XpY0rG?Ww=G_++emK@;t?z`XYe1pV+04~(8 z&jxi&;<9f3r|QcEW$y;ujBG z55f=+*-6R;4Z_1+wcrY+TwRJ~qx_W#16i@33Ka<>_-a3y9^z;a9XezkuV?U*t_Uq| ze%MnJALcO@Y3OUUP>kpxOy{(Wlhc!JM4sZ{abf@G=r#>Oj19Gl?Clboifv5$5??Pr zJvP2w%a4D9Ea64rB+<%6pGo_imJB1zj*NjPtt}!l64EooaJDG@Mj^B7rC!^fGaWs= z=R1vMUEi>~q#~5J zmMiqbyX>C`2ynVGBx9QeJYZ#C;?nW*>AkBbd1w045N|Kkh( zdGG^MS6Y?7(^SVHTZ=Blkh@1tLV}VVPnQmT59OSgi1sMnSl*g3Dz8~mHg-}SjspIQQwHeHs=eIM#69WImYkt$CzvV!evJe4# z0-kaXPAzr#vQ0mp6@#gH%qr8>&}Oqn!Jq-Od}AZDp*}C zQjdS{y;c^v(=etc4UAe!io`1Ce^K`%cv$q}bw`ob3?jVk^JsX{bAjm+#Ii-qZ6%QF zD-&xc)+F!Ecl}SH*BYyxN1Pl_rZn6E$C&U)j6jv2-!oiYQkcV9a|;f#a+Lo}Z>dPz z*k-;l@_eygm@p1g4xgi}U`uaVT%P}w#d_&u=Jk^&+g(wS3U;rd%0K9>e;`k-jyae0 z=UYoWJ*)XJUTK+3m&lk~vz4~JvE#6K*l3|8!WLHg+hoGni%D#NKA0zK4v{}Nyl#4Za*T454lUvdHi3m0ELzu+0nb;Wv+$NHdP=3 zMuu~ziSjX3doh-ASR2m!YUnMwt>jTj(iBVr7SfL8#Y(vnG2hTm6or?Ph6cjY_a3bT z@(8ME<3TdJfEWj(5@7=E?jA8En%3)H@9Xbx^hj#vM5LdoO}4r$%Te}-HW%A_gw$H) z1F48z&CQ7MS7&nM48D~z{(CXE9-A77*ikY1c<{||;rH+H)}w_k{Flkz*J0GE5Gy%m zRUMs|4F}BuyNL{JnUPMvzlR?zNCD7qPN%{Zn&2SxTG;Y8e85f-47kk!{M~+n*jnIg zqd7Y>daSfY+vDm%wdU+HFjh+zrWgM=AHBkNed(k(WQWLFyD#Eej+5=P5mezTz&XYG zdfXUj4YAbTo{Gqdi>8j(RPbhNtb6aG8m@HA2%=Qzjwc)$!nC5Xhh@}8U1gB0qrC?t z9`BJvXTtLHI7Pntpb1r&6CTQ$ zp!iX!LYarVxwzhW;3FGXZ`9)_aBu^BYdNv8WR&>`71~OyTp90n@whINt)%HFB^M}i zQ*UoSDu~|RM zTV}%C>GxzMG#O*|yJ?vD^Y*1YVkY9${`d6ALv0sXL#tq#3v}6hm$%Plhl^m5DY*O; zDk#y$y5CG#wS@NHG`^TtqF@BCH5UBvMmj9O9wfO_V#2lh6MKIrMz`>oNm?b|ra4lo zQ}diM;^$7vc1@2BKwX$q6;2AO*7hF{EVr>=8A^0?kFs95(YvRJU67Rk9@;N?uBV{3 zd+P+OtOoEDk}D<_FQ)8vgqe}DHs1a5?h=18 z5$~%Qp0i{+;aDumMK75|NqiLWx*cOghHzSrMM*BqBzz~sgqyhUZz}#5?PVaH9XW|1 z+5g5SE4WacYrJeRo_HZJuJOEgUC!e5OVA&r_Y+LT2KY*?tE9y#9EUP{#pR95?7hj5 zQB0vvACH;^F1?|0wo-IJgF4905e2}T;f;`@ug5z`g2_(aO7@y`J5}QZY-hL0JbJXF zAUB0qod3O#_)#CrIqYz{p)xEOy&Ci7h$AT@82--*{{7&$K}ABAs$1_*ynS9=D~EiW zt47qmt=h`V(ZoX(v^>p%ZyO9_1_p}SKqmIhMxj#=+)y29X%bv_w3J# zyMO}^h=95%3$#oaSp*jsm$Fx((y}D*^&stXkZ>4|GX{~FG}7K92-mRqu-A))Hj=GZDr zojx_QAr;jr${G4_aQ$v%{A(3}4%C0S?aZHSg1+z*gec4O`8AqcyL0!Q?FGJL0>*hM z7HEmpcq5Eh^QD-0Idrm2W=7+7cykIP+EIeuDR%ceulYg(OXu5zJpL_Q>@ghSFmo#> z{C>?AUBc>_a_TuTU%_h7_=@FDlGK|-E5hN*dw^C!vCH}IM*rko@=^VouX%S5&c+|{ zjGZ|)miQgXezhw--u>FN!`crot~5l?Vz&rdd&&IQ9{F)%D43^PIBd_}Um|Jn9@<%C zxl(P=3>PA|NU!m_gMo4(K)$&@8Rri`hXiMf5m=nTSb-q^=o9e#Ai{prn`IA4By*$o zU{l8jmiMaIRr!dLGT*P#Bo=N4UHs8b8hW31bK=({5{Ar}f_onGW(V897w?}$iVa?3 zH&@y;aCelOGjZTk-Z!=JVI-He&k6{_LfS29h!jL%P=S z4Eyk(X;@K}hAO935uolyW&)RzLs+|TnMnZa-pAwNft+0vze43-E>z+*_lp2qVovne zL#n!H@)eD#wapi0`>1+Y?K{v`{n>hJ6|Ov>l|^vn`sm0Op?Jkx4eeJVXw|b9J46mu)^MwssS{)xk&r3r;EPW?MHWEMd+CB+tk5jpTl$3OBgFEE`XWs0HoS$S8FK1|jvpX<5-`~=}-J=48 zXLxqmen=y{exhvuda_^sESdsVL`1p0CieoMAgLG2LX&kZsO;m=7pSQw(sR zE&VYM-~nE=!+@h|FI=aovzGlv*AYdP@zqTkyThXP8w0i{Q#?Gt2Oo~a9}OjiI^blD z3l?)BWl>9Ip{xgi!ac)5CB;2ue1^4u zeC_Xt5DEpgEb#|4tq+ow4@!H0)6F&Z%HCuxSV{GkZu=?G)pU$Z5ct2`rl1VGtM)p5 zK5k@Fw((D9??}#iPq$1JJ5T1PXO;tRM|&Wc%?mE~1jB3uVp)8qM=B zpUI=jNgh#9@3Qnt358f}Tx$EXp-tl;81i94fkuO+V?EWJtQgPl63W_txC+226zN}mJ#OYfBBW13+e$WQ5TvdAHTI?pqyFqK}I};H3A60u`btRrb zM?$lfujmL_N7eNjOW1tIsXMMQLl7rz@Um3Yo);w_c!)F`X&7f_Z+(N|tGU{jzN}kY zMDaEr-YCYQLvV=A;9#_>>5?`u(w8NRoDnH=5h{f1yAUj&EV~ZtX&1Si93`v!X~{By ztSq5pD5bK!RDhRx5Wp?scgifXUC_-2xDU%aQ znk|_#FxXu&D7^QHcp8|T@^)o-i-#X(NoKb*Zh*^>36XB~VV60*;N2CF{V>*3E=D)h zZfKElFIE|Q0xQ%svi&l|aN=5*L$%6ROi08qc!S&*EH}VGz5V+>-9N!_n8R<){`vF~ zeZIHc*MCq~O>nPJ+C}`Zi!#Fd566vhnyyy=MF$cl(6790Ug7qcnmm-dZKh(I2YP0j$ZuoDheSfm-a-XBybno6O)z zGR*O3iwU)eeqzD6f#GrJ_$lSUV@SoF8KfVa7Awz9KFUfq4tN#=Q=99VRUuYBVuC;I z$NxA9KS$Ea<8uSH_;)Xy6j9qRCpum@e#J_e6tbEaE-C5Of%~tGl!$b!PnM7 z4^V0=xd`H>*1h@k%PvGm>R_Q7>!EXLq{fVsUAd2dJBxDU& zWAw~LZV&~N@Tc76-*NmYwSu-y!F5K!)L2P+ch%SaHXBi+y(LQ8=ehs5aidEP{H}lh z&Toq1%l@fS*Zp!b=lIj_Q4>{nd`49%#TIiLLsKP^h^?8={rnNk0(BU7xA%c7ogN!C z%;n+*xj4r6_Vo#8#${y4YLG_hn{tDqgJuE*O1~F$tOm`ZlNE=Eg#X;Fyd-y@YP-Re z)8ck%cfQ&3UOkcsHKXAiGR04Lpb>3eK8foa!+ovF^>F?|C3aa)J!3tJ6*Vu$#DSNO z%+q5HiN=xs`hq|4WH8(V#F-AiJ%0w0okXB!(8)-vhQ=eW(InFPZl9%GVJ9&2cVrbL z(STP!pei*|4p0vS(u(O!(XVWf9c+U+j;RbBXuD_Qt{-);zfZmxpL2+yKu<0!qu2Df zle*qjJEW=^zyt-f-((3CEVtc98~-@-0Hl@!j7g(jn_h#WYdOTkQ8VVvsl-tMo_GyT zBXs*^(X6Di((0l`Z0pJ?q+S150sINi5RYaj44Xo9@`J4ntCBe9YB*;?IKlRJo+Js4 ztHV#NA`+?<<-PmYytE!=wmkbf{zRJJ+1CVD0N(rBYST%i@3dzPEcHvViO6kQ^5( zw9MRekTdvCxmr&<`@sC{ax0g+t)P*i@yal%(6HkBYgOez9)e2MRA|Z(7qhBx?6K{F zWn!DlPO?;hWr!iVU!8~tkRZNV^ARc~5lg6r(d}WOA*Pf%`AztZlN5bkWv^yKrV$Tk zA;zfHik8^*4W?&iFuh|lGZ&Qsk{z?(Hd(UDt`)wH*~e$v$wN~q+-I2oTGlUoZ6ccO zT>fsOts_PF4xl-UccVR^N_M}Ht(TNW9Hf1$fsTm#7l;GVMjsEF=rbphdEl1nM(!ks zWDT}6aDfV9k+}&8D@u>5phHtZ1i$I=FoPBcpoA z$yj1SeDa0`*{~1q^Y|JLlI!VFOi-X6b{SVA^5oq?ia(;}S$2jQNv`C`kqnJuM0ht% z83J`FIHR1RufiPohspD2_J_1pl>@ZG>SzTCDGHJiMygUUD3f&~XfWn{ltx)1O* z?8NWd=O>Rz3Lq}IR_ zWlIr;BL6=jVwe;F=Kr`W3S=d~n2YR3WpSY*>fwfS+JyyQ1qE1CRqvzuGsU=Ga9mc1Bq{Dfyme!X$IMk^@7>5#YXR$7^^`Y8npd#pIw zwk(Fbyl!urQF%{CN}E~HKn#?`7-YPQ##CsB4#~W2{r_c;Z=jv%d3PSNurQ!$U~#Gg zrQc0-GafAu?66A&i)FXxKHnY+PHE*e>R2 zE~@9x!|WaQ!Awj$CulYnfm8%$n(9`kH9lUU?(R1w#g)FVD%8a|-ppnDbFPl|+z*px z2LJ)nP&*VO*q<@4L{KD8(r8)fBst7>bIly|5;oK{vBG(Lvo1-U(;;F}7DWyTD>W+L z7o8ft?Ong-v-xr=$B5aqVc2-}sK*{aFZ!m2(8_T78pMa&zBD!6X<2a#9;Q-m9!BkDhJ)550pe{lT`Pk$Xi{RHI>Y-h z8J;XHYhv7|l#(^RrYp*|6w3D^XAS-W3ozNi`n^l8G6xO-XMH@xW>mF!^n#V!J(V}p zR3Z`PP3HMQmhJl(fg`j8*RM+)9G~!GneA25zPI4$SQpkobw>K$P-GulD*>=6x9D;<6NqNvHMu?fy-BPAGiGqpOQS5}bR|AfsFBBv0?JRT9U?u^Xk`RzHHJ0}NjjBXhRF8b=^c2|UJV+9B_7_wqYdbWfNEw~Emr=hxtTfOca8Q!)> zJuT8_LxA5c~&m_Kd!Ep`u}FTy&r*WcOs%S zMOijvTs*gt*Db?77KMQOFWgTO?f6ft0gowMYR=(0V-UyU`AlY7kEAfb`thjg1gD|41&#xmxH?I``+n=n0hMR|>mddG(iPH7B9N zDy`ZRFRAr@dK?Dt2C9|e|E92$pvrk!6|Sf;y~PSi*)%ls{%nJu}#m~(2@ z>XoL#D{gBp0vSbU7x}Zaq}V|5iOOL7h{zGoNnxQdGu^u+e)r2DX>zIKyuA(c_iF^CL9_-~89pAj`lE@l&)9gw>e+2a`nJp=FqMbwb=1ALGHSR9_A z_?;|H9cq$ZglAU>9g$RjkaDcQuc!!kXn$&EKX+zxz_h7mClh@fe6?FSKkVRKlOjuO zD`yYtH!wsdv>RcoGWTk=xQOdQZuY9;pXmz*iExrb7YE&243vo~kk#UOdMfe8>BQx=u~v%!nfOA5 zq;a*PZ&C`F$>M+Wg?@VIp0BS;e{s1t&=1t}To;Ta!pks^*lLGuK;7b3x7shDE%A_s zl8)?)f_u+ou|2SXJ`($}c!Ri7U(Rs#<>B_%-<=${x9z^}+Ap1GayxDEW^g(svcD-V z%KZfG^Md<>Zr+ch&tt_0?Uyb-5(Sh!Q_FLr;&^fsK-X^ZeV}TsqhuZWvZwnkW(M~S z7lR30T6x;%tGy0H_~As~VDk-f)UMWjshSi~jPfqSsZWWz=<@f4ap$iz)%{mVShWHr zHAD;${2kIkkm0oiuG;nIlP$8M6CR+k@NeQl@a0SwsbZUqqP&#Epb0^Vgr*gkaDxBB zX%YtnfJi9mZ2zJCtgd=tD8`FVrGpXtoZ~AsffQ@YnnV^w=uliAF7>MZ_#gWI!7Im; zeWCfHBHbcgd{8yxwg+(WBlv^0r8E`Lc%&EK;o4<3w{&yf5fc|&pb`~Yv9@?rx|$sE zc|dn;Zp=Mf7fZ?26*vav;LH+)d8OQos_1^CL$zr}QSxF(#2`dSC z=J?-&)TYosv{j9L&?F{S+)@-}=BYg$Lzo+Rmd+ARrwA*8bBg9e z!51xuoG$|27g6qUyQpPF=msCB3=lXYVB>(| z%ikyW*Rv5j6sV*>jNcUHyD|n(`*ytKnpj-08NlHtB3z`1)JC!YG581Mrr!pyex+eW zY5F+D(sgltYIN+Lf*@e7)=$S84Y(VKNwvv<7q81HtVd{#hE)eAfVJ~0(BZGDO8;~@ z!Wu1@%MY+fN#Ed2g)tgF+Zu8~eJEyGt3uNBh45PTl~1@O%H6DMym>I@?qCG^|Ge=} zU;uoAw+KKX)cmuW7j3?%h=Y+{16}p^L-d3R+D1>_hPq_xOzT{R{}^<#JoH~+(TgnE zZ0`b4Sh)I$6~Bsja1WY3dY~*=d>I0hdtt-LQnByD&aa$N`Ofk*?W_1c02%D+p7nuD z+{ms(W0Dzn48uA@dW`Plv4UaTi8B#)J(|aV<J%v;0sqc}R06P_b=5c0K&sMy z7MF$wCCl3KMS>Wx83u$M;X-dzCY!%LuHP*Bx5i!#cvb>cpuPP!uU~aQVIeOG(Bt_V zwK+EH_tT1HSMW!<^YDQ?$bRw#-;mVYL`_O{`BMt{Gi501R8$WZ z4-VJoOl$x9=bf+wk4-ekXp`oNERp#!zt>NjL`r#LIKgm|8Y2h_VsuUceNv(dh@vbp zf}EfTc%u#STqKa8gc&uS#sz{^;50wTR6;O2hpAWqpx+E)3eBrkS5ot>Vy_@j$Kh0d zzv;Go0l%s$J3L}y`5%4;|6H{K*eEmg17%2=$#o{i(K7zD^nAlO+cm`O0VNv)^T3<$ zL}7s6QilJM@(Gh-_P2?jO8sM`iXr+yk$Y#>d&NNuiDz7eEMW5EsARLs6DZl{VT#@u zCg@cWaI>%`4u+geUH}_+Ph5J@7{tkF;-uB|!^F*))8nUHM4xa$BLF#rj5a1QNCgri z{gvQsMhW_~$36z;eP{pFm zrDbeT^p?C;rrmKi9Qb-RCuY&?8d6n^11$M6)^9aokQENw@0V8JF zTz^&;4i-4T>V!pD>vcrY#>_~5&L4E}f-VnEKa4}<1;|sGE;;S@Vfk*>_G;tbRQPP6 zwu#N`4@gh0w0@&wpnqOKxKKZ=yjN_(4*PLgarf|`00L2@W27g!d1_GfIw|b>`Uwq3 zpWM}z+b)z;qjMhZ-m!a0QA50h*@<{WY%(3+cAFTsAvSyRAIwopDP3A@t$T0Jp_0k~q%8?ot6mHw;lzSw}^*(a9pW zsP|Yc0efjs7e`%uftR=zIiW5jfTB~SZcl+EQ-3y>~;dtgc4g@?HoDrZEYzkFK zD{2G+eOK;WwK<`p5_e;*gYkA|g76^pV5OC!b}qYg!CJL4=J+c4$m2x#t#fH`y4$*; zdW{7V_Uc+;(Q`InGEQT@{4~0lKyM?82F^d_XiS(eK;zq=wGBO2@3^k3Fioc*;h|L$ zut3hDlu_Q5U7z4}G>Uz_JI-adI{PZKXWIJdljpEwXhF(C*~J)d!adrNI{Hdk)p@cb z`_2)qgX-G)-{EIpiX@0v8)o^l{Ge6k(N9SXRMZc?e~{CFXwWVw|>m?$M5w;=IL z9w{6r8`CSk z{8Lg(LTK#Uh3j7x3J*I2U3gd8IP(%8X5SH8Do;r}3wvYy{W5~rrnT9eG(ll;V**3v zd+ku;)t_i6mFN#S%mcAr5JVM3^d;^@@@2E=cyub z4(Ck!eQxZL{ZK=S|03yOxCW-wb{50yVCC}}_&Q6ehZ?MiIp&8sNT;<&VwLihM@w1M8GfSga*MFjba|?Z{@poHXvUU4-lw>dzLA z%P>-r8*19KOj8Y&kmS~C8hvN3T>7CaDWxE%E(pS2pkIlHNoXh+-mld01D+;Lfz{A` z20s64*^q{TCWq0YRlJ(|nYty8+s%TnLo{(WotmOBS1QAw`C^X@DD}f?dN%+!r}mmg zjnT|d0a3r>ZCb1qC60#>E4`eS+?(9%iWt(ENTIHYVvjT^OtrJ7(i~&cF~!UmcJluF z$u`si@NpL!_X~-TDV!Ehtc~wxPRt%34zvtv)$a@q*2=xW^34kkj(s9-NAa} z_M6He7efjSzg-&S$5h}- z6KmeeZPOO)-Lgt6*}*2>+O!2-<}305{u@`8yQ>T0+^j5E$Cle8*D-Q4-J`)2>(-&x z7d!^#suLAutr>&Rh1TH=PbfMK^>MKCEv4>n$r6w>lhFT#6|Y(lRzAzIPEOLyxj2rj z)aMHCiwEPJJ$qUdIqrEj%hu{G(tcofXSJR{zt&=JE{ec=H%~j>&S=W#0!h0cd_DG% zM%<2l#6|-G*a?9A@gn1l0Y=-D+3q27QrTlXh9~?)J*3F42Q$T|_x4(DoMtbqyIz>G zavH`Sq8~l|RV9&}!#zk}c<=ilMJOxK>lLp|`jn|L!p2&KbHB#m{qJ7a7tl{K>0FYn zZpZLA=5cU{dO2ZD&DWES#D@gM%GZmnS73G3b@!i#C^+k>cTK?xPrzR^-#dUSEX;Ru z7PxCi_G+zE8u@u`L()CY4P{UrQmt0*I#Z51Prec*dw0YPSfiv&dCKMUh)8gGdSp^DA$?d;&Y$E)iIq`A8$Wc;NLL1f`C4>p^MwkK}N z|CPxA@Cksq#Y?mYDG+`TTP$wMa3B9D3*Gu$FXx;nQAbnciZ z%G7e7_oNiHy5F;1pB-pt9`IgEYiZJJwUKSV)o#Bc{d5EXbI{BD47sUlBDd=qmCZ(o zCsig7`=40*Xy7lnhK5|hyi%5vZ(;MV)c2mKVp>YE+TxgR#bLwXxLoXD4SE4RPB?8J z8yYjtA3Q=yI;*FJd(|1}tpiBQx|NkXUiZyDeIn7Upz(pJW} zd?&y>-*<6Uj_?$o00=%O!ax;7iWObw;uiG)&e)f#x3iL7Q{Bpy*rg-k^aOnsfn!^) z7`@1*Ajcos%3Pm!iNg-ESqGc}2}#n?iBO?7)JQ2Vx#lre2%*O9)dOKyKe+$aeEJFstK zZ%L;a%zJ3S9`dGs8VX#uMEpC1vslN=D2!y>|CC$9ql$P#U$S?~NSAZf1A(#-@^@Hg zi{M!|xq8o&5jnAHt^m7QxD29R-s?+cX60PPKjOdLa=w#cA?=4|i+W_eux z{*_uS{e?*>yW_-9eVu!yrw)7K$OzqY=9iB+gh1N@?=Dg=W1EUH*L8HlQe+t}A*QdjVuSoYY8hj^N=1J{ zN-@g7TS1>%RUBzS_Uo2g7W_b-zkJ0AJ(At@lu1$Seom^tlI;*uG7r6h+>>eP^<9W% zHRcC0HVi06Wpr7wYTXY3ikS*}9Q>Eb*ZR~ceF$A=#h;3`v@9rt6O+6HAx}B&TcQEN zS)~Db{836LMk$hQSo}<1+cW*30+I6@z!0;bx2Qo)HNImq{rg$(8(MBO*O@yJKdwI$ zTsGL{rwYwHDvpi8WAtDr8&IxO@`3HI?g}$x;>kEAM*^|yCd_p)Ka@zT)eSyLt$TFn zxnHa2wea;7X6rL50;}vK1(3LAtC2tST3cr);j4>=#ZuZJC^|Z*$d`#4+e00A_faNI`ueh@$D2N5V?+I3q!i`#b`0{JQ122l0f-Mn5f1 zN}|W~8y8UmJTnuKPLrqT=zEvFuq&l?UvB1I+#Zi=1@B0GHJ8nrl>D&4}dm*_|y z*V}9%^B#?#uy${OiJ%h)adn+KRQ(}ydrG4BOBtR-6@J0+xY0sy=9(n^Fy@8qJoDnY z9&k*)DKW=t$wI3c`LlIzrYHp5yx>4wnuQXWe!K%beOfR>``XL_Wk^Ml)xCb|4q~ZF zM31K_N9d05znKcC2p#BN%ij&YBTqicwL4zmTy%2|me^uVIAX0N5#0vLyxRWy7O@-o zs02||FUvBC+|&8cvN1rA?{I%&bbYu&_MopEQyv@J!EC%e<{0v)r{tItCSg$s8lGLl z|6CJMtf=^&Nx}BzzvU&+La~J%O*EN_Ka_2-n}j>4XN{0rB34FhA#eAUN) z!*Ewi4E1g3Sy-6csr`UD#fz>RWU>tCPzWo628^E7^Sf+R6F~%#MF;yimVAc>fMZ5U z*otk-py5bzv?$h5R^JuCc;4bJ-EaXp%@WyX6MnN&*bc;y1=%a~(iUNC=vBaL38(PfQn zh3f%hA|b|7(18!?>Y;#oN~Y~A~}ct?rvg;f>On# zEH;Q<#+)dQ-ipy=`uGTtXTAxSjYHApjfvIIe^ul4MXf3b8QBAO>ARyy#T}6ADOoIi z92E;Own(apka2_ld}Uba+Er5f^+qbwH$6!IwbEEnpR}FeJf0odV%yCwY333$;HlsS z0InLY5wyj!`ptHaJ^Xg!306j(a-s(yY>m9PsODS69S#qs*CrC%2}lWxm(_7USbM_f7j*d;LF?Kr=Lp0EW9BW_W@a82(SZShg`NXNh2cWwl#36s zGg!~=Jr>-$1c@9ezJ6;pmB^>1c2>TrWZhOoa>b&2ox9c1I7R7Y&RDUfurL-?9y0Kh zKD*tww|^n?pj*W5X9F30_XM+5<>~t?1Vx>kj@L~XLx*V+>J4@3gf!~}n*di1DWZC+ zEGH6`ZFtD*jP-7d*o*tprh9MkzQy~l*#e!>=@>(2x}5wc9y)+o{X){G#mwMoz+4>;<(5G0@Quf{6n9GsG~o{pM-{>03IUS zwsy&7Jb|)_?j?<)&D0w0d+WB%(IPOdXCxUmub#8DwK34F*DBlFN274Pr2O}p1ImON zORH_mdWnb5LZ2FHtwN)#d4+e<9J5|mGi8^_ zWhwUqWUZoWyC3wzWM$LkQ`jVN6*~L~!Zh{8ua)Zouh5le_sg|jx&(K-IvLAVvKb?3 z?pEaJGecPVbctx+!{mZa##zd2N@bUKhK`eDhNf4RckKWMSGwD|VeeW3X3PDz1v<|+ zW8Ve4HqXEZMds(%JNaJUUVTi8%^w`up-V4Rlb6=0wRk_Zap36^l>zi3&PBsIv^TYvsCd#RNNDzihrSTnVCD!ab-!`3bT44Wh3T( zJhyz37g|-<&v8E%Qt?&zrdv2fq#il8N~0uzpe`e2BfJA zkg0`c&+P@={80_K-`tDqMib9q%}QVv|&zR zdIYxG=Fd0zrSIrt1vtqFqvNDIS(VU+;G{7BstHJR;Yw}O$KJHW(*H;Zkd>9=f`Axl z>E*3?&(AO0>E~*#PA_C5Lf^OT*^bG29lb75t4@9CQF$jKL;M;x6_ax4y{IVe-Rc1} zX>Vz&VmK=*IfZddyhZK0Byc}}7Rj-(^su`e^Hy1}7{mMNQ_d^t9tDZba=k0&mJw8Q z=YgKOID#H)!pkW9E2HB<4fe54$0^!;68#s=Eq>PQ8T6)EeJbiRpN$ILb`%z0Hn-0S zrgqgdRHP!K94j4d_9~D4@Hcb_hF9GqR55kklUM2@Pw$HuG*|R$qoLVY`7_}&e5lZ8 z&y*l+g}}7$GEe`eohyFJFv&_9va~#H*45A?y1N>wBDc%lM=mqX|=!!;X&C4yENu_t((d zj4H!B^`fGp*S3Oj=FYa5NI1)(mrG^PbLf&jt;zR~7;nMr_GXr?MM7w(ye>Mdf;|Nl zqVS0>_xbP}#(q+cA1cu3pvOJ(seB))_eE^Ss&Z z6p2q6`~Be!InjV5iQrQGE?YK2UecW4?)*xn;7d-TGF_R{g&*`M0qQUWx+1&9i=(d7 zH2%(9t$=<@V<^=+hgM~Fi~sKCK-M-{D!}~;aDHn+TT%ue3xO1`WRr0Y%UJP zZ5PHvqg_j-7xj+UVkS3uUF>1#Z{)>6$y8uEZOK2HE&AIhd zm(wwXNxRYa$x6)59Rtpsv*w;WBa2Cb7m&gqGR>}Vr{5lnczf?sgss>7=-qoH(b`FD4XtuDoO{i&t577<$qYZikYT)$E6 z5pNAuBzqH|sj zm=ys~bxCHD05NaZ9U_Qayr_L>Ape~Dmx&U*2SrY|4g{5RA$gNG@Pjm|{A4_azWN9T=u zxv?6q<($#A;BRmb9e5og@m?(N6s33Eu2(d@qOs!ma}>q>&%RLM5(ste2%I3Mz{N)7 zEZ+y1R`Vq7&f2o{h>mWja!rXDwXnzSRJ}J%6p}h=YrQ0@u5vug*9vA0E6ixQ&7BkD zi_zPp(P$1$Y{(>WK$dwUc10#bNY1e^lzx{=LrZ&E+oAYbnn&%myGD$aql-)8SXskn zKv6slb*ODQD40GISJfwa(72c1Dkl?6P? z>BcO_0xr7q3kCPByG}!E=p*puksNs)dLY?vCN*gLFK(9_W|GOvt(2@3h{?fPU-QM{ zqUZJP4`CW=nx{5F2|IVK*N~R{(XtS4u8cAB$-}-xy8#@Um?dpKIM&ZbPi{aYGH@|! zLiStzXw3joMvI3R52Syy$c%B+zX`A6y%LIrzm&r5_5$@yc<9`ir9>lXI>77xwG$va zOtcXxfaG7kVK;WtN#Ie+(s}2m#ZaMAS}>8Kn~3|k!pAK}bTOxtjlDjTef^4>Zw-@S)l%_F z3ik`VoUZXwpi@z5DNjT+MmK8tsSj zye{y%LVwd5ecCa<1_c=HVoP4eEN6)o3BUNaWD+w4G`}x4 zbvY6Q?<9n>JDA|fKbdyrE|}-Mx2-pv+{(zaghNnB_Ri74e~FJwmWe)v191DoM-Sis zY@=Ms6crV%kI;<|;Rw`mVG2Mr@o)?q8IB4i_7qY8oVGAuK?8{iKl23oPEG`Rp$iJ} zQgUfo>gsw5F&f}?1^s)9R>^&`brdkX+9Nb^9{`2F6HDF+Z$uG1N><8#a|IA^Xsd4*UWx*Vm#pq568RqEbzO$`n(PsvOccm}gBC8910~4oq9kBURn^X_%hF zn%Rl=!@|IdmHENz;)!=_C~f(!$eh$BZ3BDNH8lu(X$@RI9b!EGMRLl?eiFVghS@7H z%WRzzJZPSNr?FotXMKa0Z+)DbTeTXdAihANRmX|f7?HVNfRqS0V$slL-g-c+Q-8Jj z#>av&K_pIa%k)`Ej7w6Sq<{%lpIAHVSgsqg%*<;;%f=9rbR-1gn_q>E$zAwVG3xt& z5x$4cdl7n+q6`Lt&NeCf2&+xVZWAes5+f?3Rn+m@wb(ED<{m5G-NzhF-Vi4I>wN|K z9-m_sQzaSmR>_ZU>4ycgJz;%siO8tH3&D0q`7)lTJp)S)`*LwvbFNZuBIYaoT&1T=A<@1dl9|KgGKT}g`Xu%hJZlNGp!gsP^dCv@zjg3-COVl?IOFRRq7C7he)uh2 z{p%6?yLCmP^}zQ7j8B04*S;4|X2b!Y{NZl{&M~k;%**cqVJkWMyy8TFGpe|X44%p= z-0SMmqMhx{c4OlQzJPjt)+a!CSoq6xs;EjNw1`I0pY-b%;G{Wu{#;#7BRkc!{}!#N zuE4v9rnm6w2ezX&OsF!Cc9}%@_}r8%AddO=oRKeDh1D>7D}{4Nvtd+1mj8xEO?9~9 zBAr)JOO1~V5q;rlg`^BjXpjT3F%J^_-@6Vt_Xc=(vB~V=QlyQ|QJ%whYi0CqIWA7qTdC28^- zq56-rvk14neWDm^rz0lB3aBKi92`q^Kw~cR;`B|#FtE{R-Q{y8d&xVStA&-PqvqDM zFkzfU9v+u?GsI z+_nkuGEw>8zU%OZuWIoOZ+*aEXF1T%gER&K`>l6vrMg9`4M6~jI}4Zq&9-r+$P#^m zuBbGJtyuZ;hLl!+Mc*SL6!7zVvfK6K9||gH8^Z=G(UdpT0ALO(`Qq&oXY1d%ck8jp zO;n_g6XLn0Gd&m?JmtlI;**5*kC2dG;aLwuD$;~kcA`kWTa4Wd+xerZ*Y>Hccb|D#kIagptff4|^KK5e+k$;$v}3~IAgxwG{K&v8 z=i$WEMx%2yLNqCC8>2bhThzb~Py)@Mj2EqkK)Q)@W zR*a)upl@_y~i)7&qlsYb`J`EGvo}A=k@T9@I$y z?Vyd4o;RL!Oq`rz`{=0gaah!^q;1w>l6$sZDo%BO?=sMkrw)!1_G7-f;;YShzm`Q0 zSQ7oHj@`VoiVU2c}az@zu+aCiYg0|Vj`Y!VBKpIA$UfU%1rbS0M-sUsX z&yV55aI0<_`^AjKYEm|tNCSxO0wjfqz^&qx377ytrqvLQ!&m|9=->I=pC1ZkGwbFh z8e1Ab&xC|n0giw1*>}D&jGqV_N782Xcb7xefjj2J;Viv;ja!ukrJ!WiPe#q$6^ zkkqzVe6?=)zv5&++`-@a|FPF-uA3cy;xIn7UNaCEe|wr zZzDdctmkM!n7^c_%}pLoi45sPPdDNHSYSB6{$jvJy@GqqZHm(>9{i_3}qd-}KKXF?pOYFn$GwPsSGCJudTeHB{)8uV3PpFlJQ;3WUbsC@u!=lRmr z)tF0^@pI%b2OKyaB2>ViJh>x@^AAGHvS_9Qyxc@D-P@ZHgOrs|0^3A3C&qR<4PUrk z)+?&M2PvChBm0dSmNGpj1}MXC9>5L+soz7gp6oYnW*Mz1k-KMVcAbSeR#6!T2+63I zC?Cj|;2hkB=H~$$OY*wMXv1)rZ!AK$d#q~5rZ=g2UgzltadsOpM-P~tp<2f=9xCwm z^W-^1&^yoe#PAArExtTPt*jW7*g5F_9HKribto7-(yIw2MmoEDdIr@CYlt+{7kXrm zNA^`V>y0PH5{PbV91?9dQNS zxzm2|jvQJWWlgCj;(K_mBAwlz^hrbM!9?Q-(yz9-o-RgOqKS#X9+NaBc4%+mSb26s zCMN~BxVXeGqG%UXha7nli|aAMAXkaSm*wf^l7Ia*bcJ#S?j^pB)H5^R%Z%~Ay1by_ zn>JnuxrdrfVz(a(0S1VOxJtgDFG#D{h6<4-0t90D|8tPv zppZo{e-}9IhR|zR;3M4kCtrO&U~`j~E5uP1$#qm%=+y4Gmtk%grHZE}&G#D|3*LL* z#$_BxQ8@F|*XWDakgIjX(FK!IhX8PrJ3PT#7^a~OZ%O*^@bx4((+3QT#!mz-ZuYNQ zo;%yNZ18MwA(D7Mg8h#-kP5urzRT9OfD7-RKk!g}b%wl3VRrrDi|Vk#yD_L!71IK? z{P_)L;gaDcJ`5Zh=+R$qK8w^g=kxG83Yr#%hPk{?-s?a<0G`M-M=M2cyS%PszZZmo za|`vpp2Jrm=FS`K290T`r=1A>TF1X@`#*dVqXIpWeuuOFKV5#49u{u+^wXzx9`wI= z^Z&5o-@jrYqk&?h{JH<9%e#d>f?;jW&E=B);{g9TC;!#PeEfi2dTp>I^FLjFkrX&) zYg5xf%>Qb2|HXGCpMhOMQmgx)E}vP8i1u(9lK&qrLsZ70_I|&cPiH3uxARg~{P}^g z?~_kzGBPrg8TK{lKMDEE*Vl~{P}Vn2q6gcZtV~VIPjDI31ay7kQD5|LylKNfI^Uaf z+B#NJ;Qo|=TE3i>^_1IpQAMjdUP4=YQBby}<@0w2?FPLznt;(#)Od*@-=3=MdlBvP zA!9*({Yy`JhV_%A^vPwdG3w#@dA*6LvcOh_#|Uxiwzjr!i`(3t1u}E1C-yI8t*opr zw|;zfF-1kGa%@S4FV8@w@$sMdjvF#}*j5mGkYCRQ)S8*?t(V|K z`RHrz?`I5n=+t!613??`r_Jg+UI@i^?)Kh8$;HgG%p105klCKMXQp@}(n_O&;j-Fa7`htN^v+mx0-0r-IwJe^)Z#x}QmoyK3MzonxoplPH zOtd`c1jsNvr!)4ryV-_1v-Kyq(rHxjuY3_^QClw>l$0XE^x_N0$lzM;jeNo7%PCAB z4*Bor%7~6Eh$3RV?`^!!*QRQ8PtKVNa~r5Hm(Ow~E%v`8$raH!Zh=1R1(eiytR*wO z$jUFsKHvSpRdbr#@k#Q79)j6cePa*h7n#(z=8fkszos=_%xw0epZDq9(&-wqX5J5G z@YVPRMkL?M7h&@0&%VAnLT%A^McoRc(DlCb{O2_r11A3wyaJ5;9 zR-MDlqD#k3NM%NUYVXBz^0s~L!8de`Y9qnACsTW{I;TtvH`t*WNygYj9@4?3-^wxb zE#q~piTQ1N5e{dc75YarRyRfqMvd#SN{b`4OKrV-Yq;svloVlW`1>&B>GfnY?BmXx_r9VQ0|E3- z=ezJ@jwyVB`b8o$p+odv%k@S09gcI12Lqf1NZjG9AXYVPqLFh6w3C+?yAwEwxs1~`Iu=5~dET&IDy7=i1huCUjGoaUNv` z->EdoGF$dyHmg#o=a&wRCZB0owB=b&u7;W@UAvPkorJE>d~~hc{cAd9mEarH6dbnV(~~#-8|g_qD_50c7>E*&q$Qx-LN_07Zb?s255Ri9ydT!N z%bM|Ejh*)SJ~UnseTCfKgKx^9SHx{*MJ5^W)uFiWjr_`PCH;LGUE=#MwPKH3U2njx zXuP^C`LZ=H`0DZnX6Waf0(+thV=2|eb(Hf&>e-z47p?pFbaZ1g@T^0d$G!|LxgAKA zX*W_=E!gu>zYC7|RxzY9yKdRIOf!Du*LARXRY}O}^g~;{qMIU&7y$p5cXp}?z!Oly zo0&*R2=|lL^C}SYUV+akq~%T^aW{Fx2lhHlyI!5JMF;yd4^%q^K2G`wVn@+DFZpH%TY4zIvLhtkZ~oeP<3n6vezm0e{UOu7t>CF=i^Ab35&!?5U}OQiNMOT1uAk zO1SrS*a%9>E_T>H^SiuHO5*_!M!4_`3ds510?z$$n@A=j(bs1j)(aI=O%NutRVLI< zK7EbagQK6J(#l^iUl4HVsh-j-qL^15d|P4?FK7kRT&GskerLIs`h-gOk}tM* z@Qb-0W9v1A!C4xs?YuAJa=I0+Sl%;igUXRsg(;Uqg(Tx~_mv6Ucl_(aODnpXhVixL z>0TKTFL;aQcKQfNh6&*CZ*OepA{JUqEK0)hw5?D!S}~XnOz3tCE_C^BS5a=RhCIE`jX@)$NwiS`6I_ zE{(I5PRK!YUQj}yo0UkwJ`j_AC)UmW4x^gIPsioU@)rNG zM;iN&cSFRK{b)sOC?j)8tRtFC#CCdz^k6HE^tbktwWiH_Cp>epp2)~eUQ6J2C7mipjPypYyeaVaI7V(<$!-rcVr9=u z&wIjH?!id~CIrOXxtV@QfB6m^$>6^GA-jmfQ#AAwcJNEcH7pJ>whgOIN2_OMa?Mv>9{*N;??X4{O zYMNbFY<@WQ`)5BpcyFH1eyo=@o(eYpKBIZ!kJ-z|V)7wL_AuXiCzLL8_mjeVo8)!) zs&B$57je{F%B)sOIuOvI)YI1kP#RUEG6d77bhKxn&<*-Y(eWB)==IITyGIBxth^Ah zWE7>3h+t0!&8F2E!xk}BB*Ukp%h>Q=sBelpgO#wvbTo8uD^$#MlVB^U7s#TdG)(0h zY7CU#`MlvXVqUjmYQlLebKda`dR%re>!kBOFHDv@Mh*af+A(Ahhb)g{FnH*V?QlKqlZR#Qg+MY-&(8*J_!WN5Ifaq>>Cx1AV*zd zG?pk8$DJa*o{K<6jDR0%H`Dm3MnJ*)hG93nIE)nwu0jno!%$@=nBjXV{u=%R6@j6p zblSv%ba3*(^BEf}^`&AYWO$vhBYJ0zgDRso)3XqJ&SecE%{rHvJQoVqlFSfBa7bwP zBWzTR?+^k4YYjQw&(Em#h(8)D3ZI?DtG9NSt>7moldA44s*!7{pq`7rdlqnU6t_zl zKW02QLyqcE^pb6!Ccv{1tiIM=GnYSfpDgfF zV9#uwaOtcG=7C{pm`Gy2idA z3{gp#JdT9KDLm^p`|9fk|8GOb-%V%AxUVHfNCsSySy1 zgk{_3P0}GHw^>=IACpjopQ9RPRc1XbJy5ZnQd*g#e9x=`LV2=6dChVmRlo&1f;*g( z2>X$G1bui?no=g?$kH9v&8d|7)uYyUU|LaAlCt2^H7tkEJ3NLGlkXTM9N=eR4QYNT zYfN}r;?mL&&^wLY#0&E1!jLz>Hc+%KH#)_g@8H(RL`*1Z@I50|UV;gr*R`T_;)jZ; zfWXh;56>N5dFSPKkX?GJPZVUa=ErTK_yGc`Thqj!;GOUULH`~H^gE}}vZb>fjy7pS z|Iv_VxlT~M4vrenF?OBiBTHktd$wC5UYOj%y@Q#L022#+WY!)hmW-$qkb_-u-7-Px9wZ*8pKBHYVXbA8YpbewyUGaEi=oU z#@hLSBbaS4&Cf67b=?l*y<1fz;Lba?a^imHkUeJxnfx-SQptA7E{)tf;kPfW^XT)$ zx8fJF6z$5!Z6a!3gn@KQ)Hn8+Ut1_`?p*Xl5T>movB`AjP0B=hV=+M??LCb!3_&~%83h7I*M?YSoTEZX5&H%fyfY8kZM zLJQdjnKE)0zJ_O;Yzpi^j#uUvCb%W`D2CXSkOs)e&(a&fYunG3_j>7}!R zkt&!k1u-+&xF-mLJ?_-+yDEC6tVtFKY1PseNqrPAMB)oqMYU$;SZxWZXEfMLC5Q6zShS0g<`%*D3I*TT0^c#;P^~sHvBtK+DH?E6ywcaqYdLYJtG2TP}v7F zCsSccYiS97RIyXRf@2k}be$Vy%46Q?*)lD}fMGS&jT}s2xbeu9rI?tN^}3{>UdbAx zBb*eXT~r3jmlNao z^iF+xMMjJ(tV*f!Tu9ke;GOLmN8Cq{HP-ZoJNE&<1MBIV&d8GE1D2R*ku#{kbc5;C z;;_hAzKq*u%c2}_;G%X}UgzB8s(^W~N8ahK*G=|;damp~jpPrGotkMMK~am%sPF9G zYQw4ZB&WpgoeR&E=4qA7DhXOjhERt1^`~ynzms+SP;Tnwr;vm6Xjxsy9H19;w{s6f;bu(;|x0jc`~|P2I99*j*Nar3sEX`!ux2xN36t)gg| z{DaQ;XAh2 zy3|-eEQ#IG;%XeP^P#6GeJ9_jB#e+Ye~9j-6qvBN?w+J<+U|$uflBg~?!ploP346! z6XBi-Ri+gvT_Bqnp6AhX3x>?*8%dq*vg}SQG%rVbIXv6nJ^YzO)-o{EZmZ9eYjfA^ z2?hG1(xxZz;m1+3t12$%81Nt7XHmXa)WqYnUg-?0As=EmEb*SDV2-mD@#UW#-CACw zeI@N)k1+Z^i#*dpU{?Dgrgj8ni2iA@_t^~3ny-r`Cc(}RSVY5TN{4I@)x?*)$x&~M zo6%KBNxf@&T4$|dra^!=MRnYgIrMuryYsnJ3XdsIMpwVdTeGCkuhUR+|jHNY_ zX+en?&wR{=3@YYpt!U_Io@yv}tv|(zE8}{6rc{;qPU8u+1}-@m7C%znX~&bCyyh~= zRX4iIEZe_Yfd_Bpbmqiqbs7nJkqSwVY6&?W%&V_E@dPGT44Gip?|tnK-ikR?OXfBY z(4n-bW!qt&%izD7zrUx1=%>EPg6dQu)JuYylt0AYi&v4Nr(d3U;* z5l*c?<7T{B;H_4a*+h!+DxFS!CuQUFIVss8*&aHdd!nCttVMgFqkLxZ-G{nsd&J95 ze(+eD*W9R1#pl>i{*%yI-L>5jqNVjLvxV20PXo*+t!vCVtY&E$>5f4=BMYZ8FWIqS zXZ0>BtSfVsf`NF4#J?BWI8qxs<9ztF`TjU2>a6r`WnQKgL=3sluj{UzJIf5^(a9y$ z32<4Dsi=^b#nmFFU|S|$xiCRY<#ir;Ji!pK_dyTLe|A<(BYGWjQ?H9%1dCZL5=lz( z24DJL7X?33Nk=!i`*2{^_$D8W6nTq>B3S)xu^p1YM!BPb=HEHj=#jI2K$49UW zWSJyS;a#lfD;9huC<82J7fxheR#(E#dcL1>O(@fR#(1}qk-%$%I6&QWbFb61*Eu)j zc{=$x(q423si5pLh(dZ7w|d7O>q^K=X$_IvxNd;p=EgE}3Q-&^-E3FndGe+U0A<#-z9!d*u%= zH3L(eWlFk{l6O0t+V=wjIHt3!>5pdb5Cbmm#d~-YPD0l^{h50_9RLdQ8R;7j9 zPHBzG{iGWAh5J6fsf12RKlzG>#+8u$lc`e3S5)Y6?uFs?^h5Bq2T{j+HTjy}u$*zI ztMfDl1BNtZmuEiro&I!eaQ=&;u@M9%iz3^MI9RLvOgPT)m(e;E)62D|R7hYeNXQRuTr-SEjq9Fv@!3yv(+b-=de(qbnvw7ZAc@lZlu z#YlZVn1c9eFc@?Ifu>|6D$gnammrPO@P9RS?eR>nf81@+x=3@2TuOvR2Z`h|MN!6b zjfD!wbrQL^WnF%{ky9kMSyQeDEpum7KV)G;?ze>8tzn}L{l3ocS9Z?n{9f&^?fZS6 z&-e5Gd_H?V&+~lVd!}x_m@(mDsy?k@s$oM=!@qA0(zm&@m!h35>l(r_%{is0qCMic zcZqX*80Bcjn(_55Tn77GJpKHl^5pV}v*y^+5i9CeyMa-t)X2L}`IWDI_-El3cgRti zn^d4FWY5H9TpKmq=Ny=?8V-}dxrVFKGi3F@&Rp*~%*pY#==7|;#^+IvkQz2YV?a%$ zZQ0@}N{q(%9Rr)1mr&>Hm)-xxx_4yEc!6>l0v*?vAu4?q)O3_nxYJ+r{5d#v(oI62 zevKlsrGz724=pH*IK$`ls zucdnUEb)L<1wF5@>lWt_LiU{{;cd`rf!&%Z`Pw1`Qh$s3$^ViAs`a_C;He0Khp3bJ z-QnX_a=@Y~>`8Skc0=f1J!}3vQGp$1)lv4R(-wU{=O1MOtMi;eS6eWexx@@L;~yt(mCU&o z3QX;J(U)SESjf@~dFb+s@CklZ>E=nTan$<0sZUv5eax=e$d`%1W2i6`Sl|%$^60X8 z<&`f!%hFjE50j(Xw3FuA2^uKp?5&EcoWz@U_o3A?4(Os+1(BV*;CH<$_0=?`k=m3} z8)XaQd|eYy0N-)+;Kf&3K02U;+?qnQDY3H|1o`%yM@lzmJM?S>arb!mgu%*?J{&rF zCc`Q*n&-Z;EU6@9r1P`RFD$>9Bnt+$|Lw5A%Q}l?3GB(u*}>MI!F%oe_Lh&*whO>?ldj~K{`nlZP!@2Or~ zDNPt)1j}TCCOOr@*=s}aA-2;}+R`mysqurKr)NYIRF9>*cJ*iIBZqHa5GxtflJJ3c z-FGG|utIqA6Dp^1Ma_b9{v2|PY9HNlUx|@6eCtkFyUVRUp=U0z)=xF;G3spEk|A-) zkbR&EyS4+EI9%!W*~g^66|qsli{^Y~(XV->M+!#Nruy5&T0_&%y;BV_px+V|+Tx6pA_&2NZlGclj&CN%3yG zSySfz8rjVpg(^!w&JuLi^e~L$a04%FwNyl2Ydir3`XckN2P8 z!CHcq%ivud&CSijo_U_vd|cx}=(it?1!$z`;lq5wBD65Zlhy=Qs1fF!;hJB0HD_)A zaF3$w*@b?spxK^VL9+8cvQsL&%!O#S$(q&Lr=w(D?|d}7ORO_O=e)x%H;Iilc(53US`Cic1-awzusgFAW=#(vbM zbQ#UZ4KCE090>#uToa|;StAV076*cCTU@I|F&}-OQAdD6q=78#(a0Gm)CD%9csO*u zD36te&`fiz;}asqlaJX~F`q={4o;K^D=8PJ-rclabkd@6J1;2BWnOf3j4UHDn=FG$ zjxFk*&SPaR2Ao1TA9}pJ?@cY1zwI)mYX3Tw0(O*_sUrFz$1XtXg#xWY266L}&j-3a zJl`|T?-#h=B2+~K)Q!+Y!e(<})B0a6R8Mb1CHKrG#r8sV9UmR?FenSYQ6EcM?GB@= zS{ko2CEi};RSRpiFVrU2HJzuDGH1(_TOl;j2%s|l)+KxT2*|^WsHhkua7;R4)0-4+ z?L9AWtaqs;)04@$HTjpBL^stKM>4K+e03dd2%l4eUas(@WgpSK2@bN~TBuBY!nST5 z1zj1|17=Y32R|fzV~W7|04NuC{jyWP$yr1k@#2vt^JR?ZP3cLE+{_SoxBZ~iP z8>h*OGU%rAhcl1gDTsRMs_bQN6yGE&gqjEnNRG~skNX|w|I%tS{F~^%&{6*W(LDp8 zHS~1nrb4*+DSzX!Y;=URturm)b&#Lsasa0^^CbKE*|lu`0juIi3>A5AUOumfnIG@` zEQp?U{>tGJ)$yAfYX0AMaU=k=xedeQXW1ftqViEn(#V9MV?R>(2iMG;0MO5J!uI~G zRS&N-WMc9uNA~=cLi7(v_Nf7&+idkke%7keAR&BXz5Q6~|Krhc3wtOIfc93!-Tns+ z{u(54F+gOvyX6I1{;cE7w~UsQ44ShW|BT`x#LF91Odt?OajCC8#YV@G(=zO3m3?Cf zF2Vhfx5VA=nx}h$bIQxhGv&bCmVV}f?`W9c0tUav21!dvS%2NWo6AmE7j+t9=zO?= z{tNZ_*RO%Uq%Wk8u~QAXBn&7ZY>=LHrnd%yK5vh88l^kXyCkH#v$!$Cd_YrGh0cgL zx$VhFD;~H{@DV945$cE`+64c!K{__Gtc)f#CGE}69d2gCsFxOpb#$WfOi?-ZZ_!Y7 zb#RyDgR6V3zO$y*#}UiThrA99ar#utw-$s_V)rX-ghyO_lqT)pdIRRw@}^d8C1+yb z@Q`R!s`Wm~1uhqRL2k>PrF%m_OnT8p7jHg(5H>x|Gp{xO_?3zP{$ZF5Q~!2J2DE<46>De%3AEcKD2 z*HwYPwOEI<6YQ1u{`z&k_L3ac^0DL5-IML(I}MZm#0SGK@J+co#0wKsQ&U@NbU}rZ zhJM*;H320^Dn3XuN(1x$K6Zbpmf^gv3x-!e^4 zy0Wo`E9T^BAS_Tg>&yP_O+~=Xf*Ml)jm5&qOmomYg3IDCyf5E)i!}_2uFX$NLvu}%trCs%yN_Y7PwH1sQ|2mqZ zm1CrPl8csyPZa9+_b+j4u^`4Rax1@9_ma_G|6rnaBTjip^MVuiT-3y-&d7f z!&zK79~=(PM5VBopv0%g1&spumO!+LGqYn6jJ6KimpPkryVbX{7gb_SuB`GGk8l5O zBVK_vd0Jbq&o<^Z`yra-T7F((DcC9tH-}2mBY1gx7i)P^kx#P-O$U`<7#c1YZjO5W z`gN?!>s2n_E$U%6G3l#W00YjcS{QZY*Eb5g@qs|y2+_4tbrm|--r3Og1Y;TNkP7Vh zZ1fA^gal2D=!D7Dyed7GzjPUmYVJJ~wZhMPNb^0oH$}&H1%?vz?hwGb>i#zd+MtM! zN&G;exDB~^P-fl0wRi7=4XWL6ViLvMtP>xz-rY8yN>1*rl-OdZLF<;B>VJPFMci~f ziI`=;Fc`8nhb0dzgn%#qB6yLhhDhj91ayn4n7bF@og$E3(?z8=H)?~HZT<)$;CVB= zG0C3K{}`H{ImjCsQ5zQe>KPpk2WN-qPsL72!WL)_pXIqg3Ax{j;v08NOBRDSnr{qg zSI$I{FH7)-AK_~1C?A&s8n0E^XeA$2>n5~Ae?ii#O5l6^$U{LB(w-hgfz}(Q6S@NY z+#%WWGQ*wAk>A4pdrz+9iS>g38K=)F9-trp=>FfYO~eC%8Sb6-$-){X_1Wg6|Re0#!Fa0fvLdHD6%iPq`q~O^3>;C~&Wn)YL literal 0 HcmV?d00001 diff --git a/docs/design-docs/automodel-upgrade-intro.md b/docs/design-docs/automodel-upgrade-intro.md index 4bb6ae3a448..b25b648115a 100644 --- a/docs/design-docs/automodel-upgrade-intro.md +++ b/docs/design-docs/automodel-upgrade-intro.md @@ -242,7 +242,7 @@ full-sequence loss. ### 2.5 GRPO Test Results -We compared `CP=1/2/4` over 20 GRPO/DAPO steps using `train/reward`, +We compared `CP=1/2/4` in short GRPO/DAPO runs using `train/reward`, `train/mean_gen_tokens_per_sample`, and `train/gen_kl_error`. The three CP configurations show similar short-run trends without a persistent CP-size-dependent shift. These runs check functional and short-run numerical consistency; they are not long-horizon convergence tests. @@ -258,3 +258,7 @@ functional and short-run numerical consistency; they are not long-horizon conver #### Qwen3.5 35B-A3B (GRPO) ![Qwen3.5 35B-A3B GRPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/qwen3.5-35ba3b.png) + +#### Qwen3.5 9B (GRPO) + +![Qwen3.5 9B GRPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/qwen3.5-9b.png) From 3d91631b65cf8b0fa544734a913f9a5fb2e55cb0 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 10 Aug 2026 01:13:40 -0700 Subject: [PATCH 13/34] fix(automodel): address context parallel edge cases Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/x_token/loss_utils.py | 17 +++++- nemo_rl/distributed/model_utils.py | 33 +++++------ nemo_rl/models/automodel/setup.py | 23 ++------ nemo_rl/models/automodel/train.py | 11 +++- .../workers/dtensor_policy_worker_v2.py | 1 - .../value/workers/dtensor_value_worker_v2.py | 1 - .../automodel/test_automodel_cp_migration.py | 25 ++++---- .../models/automodel/test_automodel_setup.py | 58 ++++++++++--------- 8 files changed, 93 insertions(+), 76 deletions(-) diff --git a/nemo_rl/algorithms/x_token/loss_utils.py b/nemo_rl/algorithms/x_token/loss_utils.py index ba7abacc3a2..defe23c4773 100644 --- a/nemo_rl/algorithms/x_token/loss_utils.py +++ b/nemo_rl/algorithms/x_token/loss_utils.py @@ -1059,14 +1059,27 @@ def prepare_xtoken_cross_tokenizer_loss_input( # contiguous IPC-consumer window. Legacy callers retain the existing # load-balanced-to-contiguous conversion. if cp_sharder is not None: + # Keep the student-logit autograd graph intact: to_local_if_dtensor() + # runs DTensor.to_local() under torch.no_grad(), which would detach the + # X-token KD loss from the student model for TP > 1. + local_logits = logits.to_local() if isinstance(logits, DTensor) else logits full_student_logits = cp_sharder.gather_token_tensor( - to_local_if_dtensor(logits), seq_dim=1, trim=True + local_logits, seq_dim=1, trim=True ) cp_size = ( torch.distributed.get_world_size(cp_group) if cp_group is not None else 1 ) + full_student_seq_len = full_student_logits.shape[1] + if full_student_seq_len % cp_size != 0: + raise ValueError( + "X-token student sequence length must be divisible by the student " + "context parallel size, but got " + f"sequence_length={full_student_seq_len}, cp_size={cp_size}. " + "Set policy.make_sequence_length_divisible_by to a multiple of " + "policy.dtensor_cfg.context_parallel_size." + ) cp_rank = torch.distributed.get_rank(cp_group) if cp_group is not None else 0 - student_seq_len = full_student_logits.shape[1] // cp_size + student_seq_len = full_student_seq_len // cp_size student_seq_start = cp_rank * student_seq_len student_logits_contig = full_student_logits.narrow( 1, student_seq_start, student_seq_len diff --git a/nemo_rl/distributed/model_utils.py b/nemo_rl/distributed/model_utils.py index 33bce0eedb0..b4816862410 100644 --- a/nemo_rl/distributed/model_utils.py +++ b/nemo_rl/distributed/model_utils.py @@ -2020,8 +2020,9 @@ def get_distillation_topk_logprobs_from_logits( # Move teacher topk indices to the same device as student logits teacher_topk_indices = teacher_topk_indices.to(student_logits.device) - # CP support: get CP group and size - cp_group = context_parallel_group + # Automodel owns the sequence layout when a sharder is present. Neutralize + # the legacy CP group before deriving its size so no legacy layout work runs. + cp_group = None if cp_sharder is not None else context_parallel_group cp_size = 1 if cp_group is None else torch.distributed.get_world_size(cp_group) # Process based on the student logits type @@ -2050,29 +2051,27 @@ def get_distillation_topk_logprobs_from_logits( # Legacy DTensor callers still derive CP from the tensor mesh. Automodel # supplies its model-owned sequence layout explicitly instead. - if cp_sharder is None and ( - device_mesh.mesh_dim_names is not None - and "cp" in device_mesh.mesh_dim_names - ): - cp_group = device_mesh.get_group("cp") - cp_size = cp_group.size() - else: - cp_group = None - cp_size = 1 + if cp_sharder is None: + if ( + device_mesh.mesh_dim_names is not None + and "cp" in device_mesh.mesh_dim_names + ): + cp_group = device_mesh.get_group("cp") + cp_size = cp_group.size() + else: + cp_group = None + cp_size = 1 else: student_logits = student_logits parallel_group = None # Automodel owns the sequence layout: shard the teacher indices into the - # model's local layout and neutralize ``cp_group``/``cp_size`` so the legacy - # relayout below (which assumes PyTorch's load-balanced order) stays out of - # the way. The gather back to canonical order runs through the sharder once - # the student log-probs exist. + # model's local layout. The legacy CP state was neutralized above so its + # load-balanced relayout stays out of the way. Gather back to canonical order + # through the sharder once the student log-probs exist. indices_for_logits = teacher_topk_indices if cp_sharder is not None: - cp_group = None - cp_size = 1 indices_for_logits = cp_sharder.shard_token_tensor( teacher_topk_indices, seq_dim=1, fill=0 ) diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index 6137fe48ed3..555d02abab3 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -17,6 +17,7 @@ import importlib import inspect import os +from datetime import timedelta from functools import partial from typing import Any, Optional, Union @@ -312,12 +313,6 @@ def validate_and_prepare_config( # so we need to set it to None if sequence packing is disabled # See https://github.com/NVIDIA-NeMo/Automodel/blob/7e748be260651349307862426c0c168cebdeeec3/nemo_automodel/components/_transformers/auto_model.py#L180 cp_size_cfg = config["dtensor_cfg"]["context_parallel_size"] - if is_vlm and cp_size_cfg > 1: - raise ValueError( - "Context parallel is not supported for VLM models on the Automodel " - "policy worker. Set policy.dtensor_cfg.context_parallel_size = 1." - ) - attn_impl = ( "flash_attention_2" if (enable_seq_packing and cp_size_cfg == 1) @@ -450,7 +445,10 @@ def setup_distributed( """ # Initialize process group backend = "nccl" if not runtime_config.cpu_offload else "cuda:nccl,cpu:gloo" - torch.distributed.init_process_group(backend=backend) + # Large multi-node checkpoints can materialize at different speeds on each + # node. Keep the default process group alive long enough for lagging ranks + # to reach the first DTensor initialization collective. + torch.distributed.init_process_group(backend=backend, timeout=timedelta(minutes=30)) world_size = torch.distributed.get_world_size() # Extract configuration values @@ -598,17 +596,6 @@ def setup_model_and_optimizer( "See https://github.com/NVIDIA-NeMo/RL/issues/659 for more details." ) - if is_vlm: - raise AssertionError( - "Context parallel is yet not supported for VLM models. Please set cp_size = 1 to train VLM models." - ) - - if model_config.model_type == "qwen3_5": - raise AssertionError( - "Context parallel is not supported for Qwen3.5 dense models (only torch attention backend is available). " - "Please set cp_size = 1. For Qwen3.5 MoE models, CP is supported with the TE backend." - ) - if model_config.model_type == "qwen3_5_moe": try: import fla # noqa: F401 diff --git a/nemo_rl/models/automodel/train.py b/nemo_rl/models/automodel/train.py index 105e9f1b376..87d15135b33 100644 --- a/nemo_rl/models/automodel/train.py +++ b/nemo_rl/models/automodel/train.py @@ -1049,7 +1049,16 @@ def __call__( full = cp_sharder.gather_token_tensor( logits, seq_dim=sequence_dim, trim=True ) - local_len = full.shape[sequence_dim] // self.cp_size + full_seq_len = full.shape[sequence_dim] + if full_seq_len % self.cp_size != 0: + raise ValueError( + "X-token teacher sequence length must be divisible by the " + "teacher context parallel size, but got " + f"sequence_length={full_seq_len}, cp_size={self.cp_size}. " + "Set the teacher's make_sequence_length_divisible_by to a " + "multiple of its dtensor_cfg.context_parallel_size." + ) + local_len = full_seq_len // self.cp_size cp_rank = torch.distributed.get_rank(self.cp_mesh.get_group()) logits = full.narrow( sequence_dim, cp_rank * local_len, local_len diff --git a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py index 526be19cf1b..096a012e23c 100644 --- a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py +++ b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py @@ -279,7 +279,6 @@ def __init__( self.rank = torch.distributed.get_rank() self.timer = Timer(context={"worker": "dtensor_policy_v2", "rank": self.rank}) self.device_mesh = distributed_context.device_mesh - self.dp_cp_mesh = self.device_mesh["dp_cp"] self.dp_mesh = self.device_mesh["dp"] self.tp_mesh = self.device_mesh["tp"] self.cp_mesh = self.device_mesh["cp"] diff --git a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py index af69efb62d7..5f8fb7367a3 100644 --- a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py +++ b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py @@ -160,7 +160,6 @@ def __init__( # Set instance attributes from distributed manager self.rank = torch.distributed.get_rank() self.device_mesh = distributed_manager.device_mesh - self.dp_cp_mesh = self.device_mesh["dp_cp"] self.dp_mesh = self.device_mesh["dp"] self.tp_mesh = self.device_mesh["tp"] self.cp_mesh = self.device_mesh["cp"] diff --git a/tests/unit/models/automodel/test_automodel_cp_migration.py b/tests/unit/models/automodel/test_automodel_cp_migration.py index 824ee3df8fd..9cf15b07d47 100644 --- a/tests/unit/models/automodel/test_automodel_cp_migration.py +++ b/tests/unit/models/automodel/test_automodel_cp_migration.py @@ -212,17 +212,22 @@ def test_standard_distillation_statistics_follow_automodel_sequence_layout() -> teacher_topk_logits = torch.randn(1, 4, 2) canonical_student_logits = torch.randn(1, 4, 5) local_student_logits = canonical_student_logits.index_select(1, order) - - student_logprobs, teacher_logprobs, entropy = ( - get_distillation_topk_logprobs_from_logits( - student_logits=local_student_logits, - teacher_topk_logits=teacher_topk_logits, - teacher_topk_indices=teacher_topk_indices, - zero_outside_topk=True, - calculate_entropy=True, - cp_sharder=layout, + legacy_cp_group = object() + + with patch("torch.distributed.get_world_size") as get_world_size: + student_logprobs, teacher_logprobs, entropy = ( + get_distillation_topk_logprobs_from_logits( + student_logits=local_student_logits, + teacher_topk_logits=teacher_topk_logits, + teacher_topk_indices=teacher_topk_indices, + zero_outside_topk=True, + calculate_entropy=True, + context_parallel_group=legacy_cp_group, + cp_sharder=layout, + ) ) - ) + + get_world_size.assert_not_called() canonical_student_logprobs = torch.log_softmax( canonical_student_logits.float(), dim=-1 diff --git a/tests/unit/models/automodel/test_automodel_setup.py b/tests/unit/models/automodel/test_automodel_setup.py index d8b7e7fef49..dfa0347edfc 100644 --- a/tests/unit/models/automodel/test_automodel_setup.py +++ b/tests/unit/models/automodel/test_automodel_setup.py @@ -15,6 +15,7 @@ """Unit tests for automodel setup utilities.""" import os +from datetime import timedelta from types import SimpleNamespace from unittest.mock import MagicMock, Mock, patch @@ -165,26 +166,28 @@ def test_sequence_packing_with_vlm_raises_error( @patch("nemo_rl.models.automodel.setup.AutoConfig") @patch("nemo_rl.models.automodel.setup.resolve_model_class") @patch("nemo_rl.models.automodel.setup.configure_dynamo_cache") - def test_context_parallel_with_vlm_raises_error( + def test_context_parallel_with_vlm_is_allowed( self, mock_dynamo, mock_resolve_class, mock_autoconfig_class, mock_config, + mock_autoconfig, ): - """VLM CP fails during setup before model construction.""" + """VLM CP is delegated to Automodel after configuration validation.""" mock_config["dtensor_cfg"]["context_parallel_size"] = 2 + mock_autoconfig_class.from_pretrained.return_value = mock_autoconfig + mock_resolve_class.return_value = Mock - with pytest.raises( - ValueError, match="Context parallel is not supported for VLM" - ): - validate_and_prepare_config( - config=mock_config, - processor=MagicMock(), - rank=0, - ) + result = validate_and_prepare_config( + config=mock_config, + processor=MagicMock(), + rank=0, + ) - mock_autoconfig_class.from_pretrained.assert_not_called() + assert isinstance(result, RuntimeConfig) + assert result.attn_impl == "sdpa" + mock_autoconfig_class.from_pretrained.assert_called_once() @patch("nemo_rl.models.automodel.setup.AutoConfig") @patch("nemo_rl.models.automodel.setup.resolve_model_class") @@ -729,7 +732,9 @@ def test_setup_distributed_basic( result = setup_distributed(mock_config, mock_runtime_config) - mock_torch_dist.init_process_group.assert_called_once_with(backend="nccl") + mock_torch_dist.init_process_group.assert_called_once_with( + backend="nccl", timeout=timedelta(minutes=30) + ) assert isinstance(result, DistributedContext) assert result.device_mesh == mock_device_mesh assert result.moe_mesh == mock_moe_mesh @@ -776,7 +781,7 @@ def test_setup_distributed_with_cpu_offload( result = setup_distributed(mock_config, runtime_config) mock_torch_dist.init_process_group.assert_called_once_with( - backend="cuda:nccl,cpu:gloo" + backend="cuda:nccl,cpu:gloo", timeout=timedelta(minutes=30) ) assert isinstance(result, DistributedContext) @@ -1528,7 +1533,7 @@ def test_setup_model_with_moe_model( @patch("nemo_rl.models.automodel.setup.torch.distributed.get_rank") @patch("nemo_rl.models.automodel.setup.get_class") - def test_setup_model_with_cp_raises_for_vlm( + def test_setup_model_with_cp_allows_vlm( self, mock_get_class, mock_get_rank, @@ -1537,7 +1542,7 @@ def test_setup_model_with_cp_raises_for_vlm( mock_checkpoint_manager, mock_tokenizer, ): - """Test that context parallel with VLM raises AssertionError.""" + """Test that VLM context parallel setup is delegated to Automodel.""" mock_get_rank.return_value = 0 mock_fsdp2_config = MagicMock() mock_fsdp2_config.sequence_parallel = False @@ -1558,17 +1563,18 @@ def test_setup_model_with_cp_raises_for_vlm( mock_runtime_config.model_class.from_pretrained.return_value = mock_model mock_runtime_config.model_config.architectures = ["GPT2LMHeadModel"] - with pytest.raises( - AssertionError, match="Context parallel is yet not supported for VLM models" - ): - setup_model_and_optimizer( - config=mock_config, - tokenizer=mock_tokenizer, - runtime_config=mock_runtime_config, - distributed_context=distributed_context, - checkpoint_manager=mock_checkpoint_manager, - is_vlm=True, - ) + result = setup_model_and_optimizer( + config=mock_config, + tokenizer=mock_tokenizer, + runtime_config=mock_runtime_config, + distributed_context=distributed_context, + checkpoint_manager=mock_checkpoint_manager, + is_vlm=True, + init_optimizer=False, + ) + + assert isinstance(result, ModelAndOptimizerState) + mock_runtime_config.model_class.from_pretrained.assert_called_once() @patch("nemo_rl.models.automodel.setup.torch.distributed.get_rank") @patch("nemo_rl.models.automodel.setup.get_class") From da3a7b96497b23ad929134214bfd2a29f4703775 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 10 Aug 2026 01:44:00 -0700 Subject: [PATCH 14/34] fix(automodel): preserve full-sequence x-token CE Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/loss/loss_functions.py | 12 +-- nemo_rl/algorithms/loss/utils.py | 30 +------- tests/unit/algorithms/test_loss_functions.py | 80 ++++++++++++++------ 3 files changed, 64 insertions(+), 58 deletions(-) diff --git a/nemo_rl/algorithms/loss/loss_functions.py b/nemo_rl/algorithms/loss/loss_functions.py index 931c500b459..b71c0bdfb74 100755 --- a/nemo_rl/algorithms/loss/loss_functions.py +++ b/nemo_rl/algorithms/loss/loss_functions.py @@ -42,7 +42,6 @@ DistributedCrossEntropy, cp_shift_next, group_all_reduce_sum, - group_all_reduce_sum_with_grad, vocab_parallel_full_log_softmax, vocab_parallel_gather_columns, vocab_parallel_log_softmax, @@ -1636,7 +1635,7 @@ def __call__( ``student_logits_contig`` (CP-relaid) and the per-teacher ``aligns_by_idx`` / ``teacher_full_logits_by_idx`` are precomputed in ``prepare_loss_input``; - the Automodel CP path also supplies its sequence-local CE inputs. + the Automodel CP path also supplies its canonical full-sequence CE inputs. """ ce_loss = self._compute_ce( logits, @@ -1644,7 +1643,6 @@ def __call__( global_valid_toks, student_next_token_logprobs=student_next_token_logprobs, student_next_token_mask=student_next_token_mask, - cp_group=cp_group, ) if self.kd_loss_mode == "sum": @@ -2662,7 +2660,6 @@ def _compute_ce( *, student_next_token_logprobs: Optional[torch.Tensor] = None, student_next_token_mask: Optional[torch.Tensor] = None, - cp_group: Optional[torch.distributed.ProcessGroup] = None, ) -> torch.Tensor: """Next-token CE on the student side (TP/CP handled by the helpers).""" if student_next_token_logprobs is not None: @@ -2672,16 +2669,11 @@ def _compute_ce( ) * to_local_if_dtensor(data["sample_mask"]).to( student_next_token_logprobs.device ).unsqueeze(-1) - local_ce = masked_mean( + return masked_mean( -student_next_token_logprobs, label_mask, global_normalization_factor=global_valid_toks, ) - # Each CP rank owns one contiguous CE window. Sum the normalized - # windows so every rank uses the same CE value (and therefore the - # same dynamic KD scale), while identity backward preserves the - # partitioned-loss gradient fanout of one. - return group_all_reduce_sum_with_grad(local_ce, cp_group) per_token_ce = student_next_token_ce( logits, input_ids=data["input_ids"], seq_index=data.get("seq_index") diff --git a/nemo_rl/algorithms/loss/utils.py b/nemo_rl/algorithms/loss/utils.py index e64871a76be..140c63fb5f8 100644 --- a/nemo_rl/algorithms/loss/utils.py +++ b/nemo_rl/algorithms/loss/utils.py @@ -183,33 +183,11 @@ def prepare_loss_input( cp_sharder, chunk_size=chunk_size, ) - full_logprobs = torch.cat( - [next_token_logprobs, torch.zeros_like(next_token_logprobs[:, :1])], - dim=1, - ) - cp_size = ( - torch.distributed.get_world_size(context_parallel_group) - if context_parallel_group is not None - else 1 - ) - cp_rank = ( - torch.distributed.get_rank(context_parallel_group) - if context_parallel_group is not None - else 0 - ) - local_seq_len = full_logprobs.shape[1] // cp_size - seq_start = cp_rank * local_seq_len - next_token_mask = ( - data["token_mask"].to(full_logprobs.device).roll(shifts=-1, dims=1) - ) - next_token_mask[:, -1] = 0 loss_input.update( - student_next_token_logprobs=full_logprobs.narrow( - 1, seq_start, local_seq_len - ).contiguous(), - student_next_token_mask=next_token_mask.narrow( - 1, seq_start, local_seq_len - ).contiguous(), + student_next_token_logprobs=next_token_logprobs, + student_next_token_mask=data["token_mask"][:, 1:] + .to(next_token_logprobs.device) + .contiguous(), ) elif loss_fn.input_type == LossInputType.DRAFT: from megatron.core.transformer.multi_token_prediction import roll_tensor diff --git a/tests/unit/algorithms/test_loss_functions.py b/tests/unit/algorithms/test_loss_functions.py index ff7fe32294e..0a81c776bc6 100644 --- a/tests/unit/algorithms/test_loss_functions.py +++ b/tests/unit/algorithms/test_loss_functions.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. import itertools -from unittest.mock import patch import pytest import torch @@ -2710,33 +2709,70 @@ def test_cross_tokenizer_ce_respects_sample_mask(tmp_path): assert torch.allclose(ce_masked, ce_single, atol=1e-6) -def test_cross_tokenizer_precomputed_ce_reduces_partitioned_cp_windows(tmp_path): - """Precomputed CE sums contiguous CP-window contributions exactly once.""" +def test_cross_tokenizer_prepare_loss_input_keeps_full_canonical_ce( + tmp_path, monkeypatch +): + """Automodel CP passes full canonical CE inputs through unchanged.""" + loss_fn = CrossTokenizerDistillationLossFn( + _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) + ) + full_logprobs = torch.tensor([[-1.0, -2.0, -3.0]], requires_grad=True) + token_mask = torch.tensor([[1.0, 1.0, 0.0, 1.0]]) + data = BatchedDataDict( + { + "input_ids": torch.tensor([[0, 1, 2, 3]]), + "token_mask": token_mask, + "sample_mask": torch.ones(1), + } + ) + + monkeypatch.setattr( + "nemo_rl.algorithms.loss.utils.prepare_xtoken_cross_tokenizer_loss_input", + lambda *args, **kwargs: (torch.empty(0), {}, {}, None, None), + ) + monkeypatch.setattr( + "nemo_rl.algorithms.loss.utils.get_cp_sharded_next_token_logprobs", + lambda *args, **kwargs: full_logprobs, + ) + + loss_input, prepared_data = prepare_loss_input( + torch.empty(0), + data, + loss_fn, + cp_sharder=object(), + ) + + assert loss_input["student_next_token_logprobs"] is full_logprobs + torch.testing.assert_close( + loss_input["student_next_token_mask"], + token_mask[:, 1:], + ) + assert prepared_data is data + + +def test_cross_tokenizer_precomputed_ce_uses_full_canonical_sequence(tmp_path): + """Precomputed CE uses the full canonical sequence and preserves gradients.""" loss_fn = CrossTokenizerDistillationLossFn( _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) ) data = BatchedDataDict({"sample_mask": torch.ones(1)}) - next_token_logprobs = torch.tensor([[-1.0, -2.0]]) - next_token_mask = torch.ones_like(next_token_logprobs) - cp_group = object() - - with patch( - "nemo_rl.algorithms.loss.loss_functions.group_all_reduce_sum_with_grad", - side_effect=lambda value, group: value, - ) as reduce_sum: - ce = loss_fn._compute_ce( - torch.empty(0), - data, - torch.tensor(2.0), - student_next_token_logprobs=next_token_logprobs, - student_next_token_mask=next_token_mask, - cp_group=cp_group, - ) + next_token_logprobs = torch.tensor([[-1.0, -2.0, -3.0]], requires_grad=True) + next_token_mask = torch.tensor([[1.0, 1.0, 0.0]]) + + ce = loss_fn._compute_ce( + torch.empty(0), + data, + torch.tensor(2.0), + student_next_token_logprobs=next_token_logprobs, + student_next_token_mask=next_token_mask, + ) torch.testing.assert_close(ce, torch.tensor(1.5)) - reduced_value, reduced_group = reduce_sum.call_args.args - torch.testing.assert_close(reduced_value, torch.tensor(1.5)) - assert reduced_group is cp_group + ce.backward() + torch.testing.assert_close( + next_token_logprobs.grad, + torch.tensor([[-0.5, -0.5, 0.0]]), + ) # ── Metric-normalization advertisement (PR #2683) ───────────────────────── From c226184db39e4e49a8b16638b35831fbeb74b7ad Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 10 Aug 2026 08:01:38 -0700 Subject: [PATCH 15/34] fix(automodel): restore VLM CP guard and simplify x-token CE Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/loss/loss_functions.py | 15 +++--- nemo_rl/algorithms/loss/utils.py | 18 +++---- nemo_rl/models/automodel/setup.py | 5 ++ tests/unit/algorithms/test_loss_functions.py | 22 ++++---- .../models/automodel/test_automodel_setup.py | 53 +++++-------------- 5 files changed, 44 insertions(+), 69 deletions(-) diff --git a/nemo_rl/algorithms/loss/loss_functions.py b/nemo_rl/algorithms/loss/loss_functions.py index b71c0bdfb74..1aec4b4d7f4 100755 --- a/nemo_rl/algorithms/loss/loss_functions.py +++ b/nemo_rl/algorithms/loss/loss_functions.py @@ -1621,7 +1621,6 @@ def __call__( aligns_by_idx: dict[int, LocalizedAlignment], *, student_next_token_logprobs: Optional[torch.Tensor] = None, - student_next_token_mask: Optional[torch.Tensor] = None, tp_group: Optional[torch.distributed.ProcessGroup] = None, cp_group: Optional[torch.distributed.ProcessGroup] = None, ) -> tuple[torch.Tensor, dict[str, Any]]: @@ -1642,7 +1641,6 @@ def __call__( data, global_valid_toks, student_next_token_logprobs=student_next_token_logprobs, - student_next_token_mask=student_next_token_mask, ) if self.kd_loss_mode == "sum": @@ -2659,16 +2657,15 @@ def _compute_ce( global_valid_toks: torch.Tensor, *, student_next_token_logprobs: Optional[torch.Tensor] = None, - student_next_token_mask: Optional[torch.Tensor] = None, ) -> torch.Tensor: """Next-token CE on the student side (TP/CP handled by the helpers).""" if student_next_token_logprobs is not None: - assert student_next_token_mask is not None - label_mask = student_next_token_mask.to( - student_next_token_logprobs.dtype - ) * to_local_if_dtensor(data["sample_mask"]).to( - student_next_token_logprobs.device - ).unsqueeze(-1) + label_mask = ce_label_mask( + token_mask=data["token_mask"], + sample_mask=data["sample_mask"], + ce_seq_len=student_next_token_logprobs.shape[1], + dtype=student_next_token_logprobs.dtype, + ).to(student_next_token_logprobs.device) return masked_mean( -student_next_token_logprobs, label_mask, diff --git a/nemo_rl/algorithms/loss/utils.py b/nemo_rl/algorithms/loss/utils.py index 140c63fb5f8..2b68d099f2f 100644 --- a/nemo_rl/algorithms/loss/utils.py +++ b/nemo_rl/algorithms/loss/utils.py @@ -177,17 +177,13 @@ def prepare_loss_input( "cp_group": cp_group, } if cp_sharder is not None: - next_token_logprobs = get_cp_sharded_next_token_logprobs( - logits, - data["input_ids"], - cp_sharder, - chunk_size=chunk_size, - ) - loss_input.update( - student_next_token_logprobs=next_token_logprobs, - student_next_token_mask=data["token_mask"][:, 1:] - .to(next_token_logprobs.device) - .contiguous(), + loss_input["student_next_token_logprobs"] = ( + get_cp_sharded_next_token_logprobs( + logits, + data["input_ids"], + cp_sharder, + chunk_size=chunk_size, + ) ) elif loss_fn.input_type == LossInputType.DRAFT: from megatron.core.transformer.multi_token_prediction import roll_tensor diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index 555d02abab3..a97a8670677 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -596,6 +596,11 @@ def setup_model_and_optimizer( "See https://github.com/NVIDIA-NeMo/RL/issues/659 for more details." ) + if is_vlm: + raise AssertionError( + "Context parallel is yet not supported for VLM models. Please set cp_size = 1 to train VLM models." + ) + if model_config.model_type == "qwen3_5_moe": try: import fla # noqa: F401 diff --git a/tests/unit/algorithms/test_loss_functions.py b/tests/unit/algorithms/test_loss_functions.py index 0a81c776bc6..d8598f862a4 100644 --- a/tests/unit/algorithms/test_loss_functions.py +++ b/tests/unit/algorithms/test_loss_functions.py @@ -2743,10 +2743,7 @@ def test_cross_tokenizer_prepare_loss_input_keeps_full_canonical_ce( ) assert loss_input["student_next_token_logprobs"] is full_logprobs - torch.testing.assert_close( - loss_input["student_next_token_mask"], - token_mask[:, 1:], - ) + assert "student_next_token_mask" not in loss_input assert prepared_data is data @@ -2755,23 +2752,30 @@ def test_cross_tokenizer_precomputed_ce_uses_full_canonical_sequence(tmp_path): loss_fn = CrossTokenizerDistillationLossFn( _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) ) - data = BatchedDataDict({"sample_mask": torch.ones(1)}) - next_token_logprobs = torch.tensor([[-1.0, -2.0, -3.0]], requires_grad=True) - next_token_mask = torch.tensor([[1.0, 1.0, 0.0]]) + data = BatchedDataDict( + { + "token_mask": torch.tensor( + [[1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 1.0, 1.0]] + ), + "sample_mask": torch.tensor([1.0, 0.0]), + } + ) + next_token_logprobs = torch.tensor( + [[-1.0, -2.0, -3.0], [-10.0, -20.0, -30.0]], requires_grad=True + ) ce = loss_fn._compute_ce( torch.empty(0), data, torch.tensor(2.0), student_next_token_logprobs=next_token_logprobs, - student_next_token_mask=next_token_mask, ) torch.testing.assert_close(ce, torch.tensor(1.5)) ce.backward() torch.testing.assert_close( next_token_logprobs.grad, - torch.tensor([[-0.5, -0.5, 0.0]]), + torch.tensor([[-0.5, -0.5, 0.0], [0.0, 0.0, 0.0]]), ) diff --git a/tests/unit/models/automodel/test_automodel_setup.py b/tests/unit/models/automodel/test_automodel_setup.py index dfa0347edfc..9c6ed0b9b95 100644 --- a/tests/unit/models/automodel/test_automodel_setup.py +++ b/tests/unit/models/automodel/test_automodel_setup.py @@ -163,32 +163,6 @@ def test_sequence_packing_with_vlm_raises_error( rank=0, ) - @patch("nemo_rl.models.automodel.setup.AutoConfig") - @patch("nemo_rl.models.automodel.setup.resolve_model_class") - @patch("nemo_rl.models.automodel.setup.configure_dynamo_cache") - def test_context_parallel_with_vlm_is_allowed( - self, - mock_dynamo, - mock_resolve_class, - mock_autoconfig_class, - mock_config, - mock_autoconfig, - ): - """VLM CP is delegated to Automodel after configuration validation.""" - mock_config["dtensor_cfg"]["context_parallel_size"] = 2 - mock_autoconfig_class.from_pretrained.return_value = mock_autoconfig - mock_resolve_class.return_value = Mock - - result = validate_and_prepare_config( - config=mock_config, - processor=MagicMock(), - rank=0, - ) - - assert isinstance(result, RuntimeConfig) - assert result.attn_impl == "sdpa" - mock_autoconfig_class.from_pretrained.assert_called_once() - @patch("nemo_rl.models.automodel.setup.AutoConfig") @patch("nemo_rl.models.automodel.setup.resolve_model_class") @patch("nemo_rl.models.automodel.setup.configure_dynamo_cache") @@ -1533,7 +1507,7 @@ def test_setup_model_with_moe_model( @patch("nemo_rl.models.automodel.setup.torch.distributed.get_rank") @patch("nemo_rl.models.automodel.setup.get_class") - def test_setup_model_with_cp_allows_vlm( + def test_setup_model_with_cp_raises_for_vlm( self, mock_get_class, mock_get_rank, @@ -1542,7 +1516,7 @@ def test_setup_model_with_cp_allows_vlm( mock_checkpoint_manager, mock_tokenizer, ): - """Test that VLM context parallel setup is delegated to Automodel.""" + """Test that context parallel with VLM raises AssertionError.""" mock_get_rank.return_value = 0 mock_fsdp2_config = MagicMock() mock_fsdp2_config.sequence_parallel = False @@ -1563,18 +1537,17 @@ def test_setup_model_with_cp_allows_vlm( mock_runtime_config.model_class.from_pretrained.return_value = mock_model mock_runtime_config.model_config.architectures = ["GPT2LMHeadModel"] - result = setup_model_and_optimizer( - config=mock_config, - tokenizer=mock_tokenizer, - runtime_config=mock_runtime_config, - distributed_context=distributed_context, - checkpoint_manager=mock_checkpoint_manager, - is_vlm=True, - init_optimizer=False, - ) - - assert isinstance(result, ModelAndOptimizerState) - mock_runtime_config.model_class.from_pretrained.assert_called_once() + with pytest.raises( + AssertionError, match="Context parallel is yet not supported for VLM models" + ): + setup_model_and_optimizer( + config=mock_config, + tokenizer=mock_tokenizer, + runtime_config=mock_runtime_config, + distributed_context=distributed_context, + checkpoint_manager=mock_checkpoint_manager, + is_vlm=True, + ) @patch("nemo_rl.models.automodel.setup.torch.distributed.get_rank") @patch("nemo_rl.models.automodel.setup.get_class") From 0330cfd4d072ac951f9954a16f0f6d724488c2a1 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 10 Aug 2026 08:14:18 -0700 Subject: [PATCH 16/34] build(automodel): pin TileLang 0.1.11 Signed-off-by: larkzhang-nv --- pyproject.toml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ef8f0668cc1..d802029cadc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,6 +126,9 @@ fsdp = [ ] automodel = [ "nemo-automodel[moe]", + # Automodel's FLA kernels require this TileLang version on Hopper. + # Keep this scoped to the automodel fork; sglang intentionally pins TileLang 0.1.8. + "tilelang==0.1.11; sys_platform == 'linux' and platform_machine == 'x86_64'", # Flash-attn version should be selected to satisfy both TE + vLLM requirements (xformers in particular) # https://github.com/NVIDIA/TransformerEngine/blob/v2.3/transformer_engine/pytorch/attention/dot_product_attention/utils.py#L108 # https://github.com/facebookresearch/xformers/blob/8354497deb2c04c67fbb2e2ad911e86530da0e90/xformers/ops/fmha/flash.py#L76 @@ -413,11 +416,10 @@ override-dependencies = [ # xgrammar.normalize_tool_choice (vLLM requires xgrammar>=0.2.1,<1.0.0; the # override would otherwise force an incompatible downgrade). "xgrammar>=0.2.1,<1.0.0", - # tensorrt-llm 1.3.0rc21 pins apache-tvm-ffi==0.1.6, but the xgrammar the - # line above selects needs >=0.1.9, and the xgrammar releases that would - # accept 0.1.6 ship no cp313 wheels. Take the newer one, as with llguidance - # above; without this the trtllm extra is unsatisfiable on vLLM 0.25.1. - "apache-tvm-ffi>=0.1.9", + # tensorrt-llm 1.3.0rc21 pins apache-tvm-ffi==0.1.6, while xgrammar needs + # >=0.1.9. TileLang 0.1.11's bundled compiler additionally requires the + # 0.1.11 ABI, so keep the shared override on that compatible release. + "apache-tvm-ffi==0.1.11", # Override dependencies to address CVEs "mlflow>=3.13.0", # Override langchain-core to address CVE GHSA-qh6h-p6c9-ff54 (path traversal in load_prompt) From 4ee2cbb893970a27c0023795192fd8c90ae4b63e Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 10 Aug 2026 09:03:45 -0700 Subject: [PATCH 17/34] test(automodel): simplify context parallel coverage Signed-off-by: larkzhang-nv --- ....py => test_automodel_context_parallel.py} | 50 +------------------ 1 file changed, 2 insertions(+), 48 deletions(-) rename tests/unit/models/automodel/{test_automodel_cp_migration.py => test_automodel_context_parallel.py} (86%) diff --git a/tests/unit/models/automodel/test_automodel_cp_migration.py b/tests/unit/models/automodel/test_automodel_context_parallel.py similarity index 86% rename from tests/unit/models/automodel/test_automodel_cp_migration.py rename to tests/unit/models/automodel/test_automodel_context_parallel.py index 9cf15b07d47..c242965c179 100644 --- a/tests/unit/models/automodel/test_automodel_cp_migration.py +++ b/tests/unit/models/automodel/test_automodel_context_parallel.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Contract tests for the Automodel context-parallel API migration.""" +"""Contract tests for NeMo-RL's Automodel context-parallel integration.""" from contextlib import nullcontext from unittest.mock import MagicMock, patch @@ -31,13 +31,10 @@ get_cp_sharded_next_token_logprobs, get_distillation_topk_logprobs_from_logits, ) -from nemo_rl.models.automodel.data import ProcessedInputs, ProcessedMicrobatch +from nemo_rl.models.automodel.data import ProcessedInputs from nemo_rl.models.automodel.train import ( FullLogitsPostProcessor, LossPostProcessor, - PreparedModelForward, - ScorePostProcessor, - forward_with_post_processing_fn, prepare_model_forward, ) @@ -146,35 +143,6 @@ def shard(model_batch: dict[str, object]): assert processed_inputs.input_ids is input_ids -@pytest.mark.automodel -def test_cp_forward_requires_the_prepared_sharder() -> None: - input_ids = torch.tensor([[1, 2, 3, 4]]) - processed_inputs = ProcessedInputs(input_ids=input_ids, seq_len=4) - processed_mb = ProcessedMicrobatch( - data_dict=BatchedDataDict({"input_ids": input_ids}), - processed_inputs=processed_inputs, - original_batch_size=1, - original_seq_len=4, - ) - prepared = PreparedModelForward( - model_batch={"input_ids": input_ids}, - cp_size=2, - cp_sharder=None, - model_context_factory=nullcontext, - ) - model = MagicMock() - - with pytest.raises(RuntimeError, match="ContextParallelSharder is required"): - forward_with_post_processing_fn( - model=model, - prepared=prepared, - post_processing_fn=ScorePostProcessor(cfg={}), - processed_mb=processed_mb, - ) - - model.assert_not_called() - - @pytest.mark.automodel def test_grpo_logprobs_follow_automodel_sequence_layout() -> None: torch.manual_seed(11) @@ -304,17 +272,3 @@ def test_loss_cp_gradient_fanout_contract( ) assert processor.cp_gradient_fanout == expected_fanout - - -@pytest.mark.automodel -def test_cp1_loss_gradient_fanout_is_identity() -> None: - loss_fn = MagicMock(input_type=LossInputType.LOGPROB) - processor = LossPostProcessor( - loss_fn=loss_fn, - cfg={}, - cp_mesh=None, - cp_size=1, - dp_size=1, - ) - - assert processor.cp_gradient_fanout == 1 From 0edc43548d90117adebf18fb9cbe6963f5ef4beb Mon Sep 17 00:00:00 2001 From: Shuang Yu Date: Sun, 9 Aug 2026 08:20:07 -0700 Subject: [PATCH 18/34] fix(checkpoint): wait for async writes before promoting tmp_step_N DTensorPolicyWorkerV2 initializes the Automodel checkpoint manager with is_async=True, so dcp.async_save stages the model and optimizer state and uploads them from a separate process. Those writes address files by path, so renaming tmp_step_N to step_N while they are still in flight makes the writer re-create tmp_step_N and leaves the promoted checkpoint without its optimizer shards or .metadata. Add AutomodelCheckpointManager.finalize_async_save(), which blocks on both maybe_wait_for_staging() and async_wait(), and override the base no-op in DTensorPolicyWorkerV2 so grpo.py's wait_fn=policy.finalize_async_save resolves to a real wait. Signed-off-by: Shuang Yu (cherry picked from commit c95bec5a6452423fc96fd93494284440a479ca71) --- nemo_rl/models/automodel/checkpoint.py | 18 +++++ .../workers/dtensor_policy_worker_v2.py | 11 ++++ .../automodel/test_automodel_checkpoint.py | 66 +++++++++++++++++++ 3 files changed, 95 insertions(+) diff --git a/nemo_rl/models/automodel/checkpoint.py b/nemo_rl/models/automodel/checkpoint.py index f5b59de3812..67a91685547 100644 --- a/nemo_rl/models/automodel/checkpoint.py +++ b/nemo_rl/models/automodel/checkpoint.py @@ -256,6 +256,24 @@ def _rebuild_checkpointer_addons(self) -> None: if self.checkpointer.config.is_peft: self.checkpointer._addons.append(PeftAddon()) + def finalize_async_save(self) -> None: + """Block until in-flight async checkpoint writes have landed on disk. + + With ``is_async=True`` the Automodel Checkpointer hands both the model + and optimizer state to ``dcp.async_save``, which stages them and uploads + from a separate process. Those writes address files by path, so the + caller must not rename ``tmp_step_N`` to ``step_N`` until they finish -- + otherwise the writer re-creates ``tmp_step_N`` and the promoted + checkpoint is missing its optimizer shards and ``.metadata``. + + Safe to call when async saving is off or no save is in flight; both + underlying calls are no-ops in that case. + """ + if self.checkpointer is None: + return + self.checkpointer.maybe_wait_for_staging() + self.checkpointer.async_wait() + def save_checkpoint( self, model: nn.Module, diff --git a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py index 096a012e23c..f648dc7cb03 100644 --- a/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py +++ b/nemo_rl/models/policy/workers/dtensor_policy_worker_v2.py @@ -1326,6 +1326,17 @@ def save_checkpoint( peft_config=self.peft_config, ) + def finalize_async_save(self) -> None: + """Block until this worker's in-flight async checkpoint writes complete. + + Overrides the base no-op: this worker initializes the checkpoint manager + with ``is_async=True``, so the caller-side rename of ``tmp_step_N`` to + ``step_N`` must wait for the staged writes to land. + """ + if self.checkpoint_manager is None: + return + self.checkpoint_manager.finalize_async_save() + def load_checkpoint( self, weights_path: str, diff --git a/tests/unit/models/automodel/test_automodel_checkpoint.py b/tests/unit/models/automodel/test_automodel_checkpoint.py index 4230c73cf08..6e4fa028cef 100644 --- a/tests/unit/models/automodel/test_automodel_checkpoint.py +++ b/tests/unit/models/automodel/test_automodel_checkpoint.py @@ -387,6 +387,72 @@ def test_manager_initialization(self, mock_get_rank, mock_meshes): assert manager.dp_mesh is mock_dp_mesh assert manager.tp_mesh is mock_tp_mesh + @patch("torch.distributed.get_rank") + def test_finalize_async_save_waits_on_checkpointer( + self, mock_get_rank, mock_meshes + ): + """finalize_async_save must block on staging *and* upload completion. + + The manager is initialized with is_async=True by DTensorPolicyWorkerV2, + so dcp.async_save writes from a separate process. Skipping either wait + lets the caller rename tmp_step_N to step_N mid-write, producing a + checkpoint with no optimizer shards and no .metadata. + """ + from nemo_rl.models.automodel.checkpoint import AutomodelCheckpointManager + + mock_get_rank.return_value = 0 + mock_dp_mesh, mock_tp_mesh = mock_meshes + + manager = AutomodelCheckpointManager( + dp_mesh=mock_dp_mesh, + tp_mesh=mock_tp_mesh, + ) + manager.checkpointer = MagicMock() + + manager.finalize_async_save() + + manager.checkpointer.maybe_wait_for_staging.assert_called_once_with() + manager.checkpointer.async_wait.assert_called_once_with() + + @patch("torch.distributed.get_rank") + def test_finalize_async_save_without_checkpointer_is_noop( + self, mock_get_rank, mock_meshes + ): + """Finalizing before any save was issued must not raise.""" + from nemo_rl.models.automodel.checkpoint import AutomodelCheckpointManager + + mock_get_rank.return_value = 0 + mock_dp_mesh, mock_tp_mesh = mock_meshes + + manager = AutomodelCheckpointManager( + dp_mesh=mock_dp_mesh, + tp_mesh=mock_tp_mesh, + ) + assert manager.checkpointer is None + + manager.finalize_async_save() + + def test_dtensor_worker_overrides_finalize_async_save(self): + """The worker must not inherit the base class no-op. + + DTensorPolicyWorkerV2 passes is_async=True, so grpo.py's + wait_fn=policy.finalize_async_save has to resolve to a real wait. + """ + from nemo_rl.models.policy.workers.base_policy_worker import BasePolicyWorker + from nemo_rl.models.policy.workers.dtensor_policy_worker_v2 import ( + DTensorPolicyWorkerV2, + ) + + assert ( + DTensorPolicyWorkerV2.finalize_async_save + is not BasePolicyWorker.finalize_async_save + ) + + worker = object.__new__(DTensorPolicyWorkerV2) + worker.checkpoint_manager = MagicMock() + worker.finalize_async_save() + worker.checkpoint_manager.finalize_async_save.assert_called_once_with() + @patch("torch.distributed.get_rank") def test_save_checkpoint_without_checkpointer_raises( self, mock_get_rank, mock_meshes From 8aba14b1b644085a16f296b89396c05c1efd23b7 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Tue, 11 Aug 2026 00:36:22 -0700 Subject: [PATCH 19/34] test(checkpoint): fix DTensor async finalization test Use the actual AbstractPolicyWorker base and the unwrapped DTensorPolicyWorkerV2Impl class so the test exercises the worker method instead of failing during import or Ray actor construction. Co-authored-by: Shuang Yu Signed-off-by: larkzhang-nv --- .../models/automodel/test_automodel_checkpoint.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/unit/models/automodel/test_automodel_checkpoint.py b/tests/unit/models/automodel/test_automodel_checkpoint.py index 6e4fa028cef..45ab9cf0a2e 100644 --- a/tests/unit/models/automodel/test_automodel_checkpoint.py +++ b/tests/unit/models/automodel/test_automodel_checkpoint.py @@ -438,17 +438,19 @@ def test_dtensor_worker_overrides_finalize_async_save(self): DTensorPolicyWorkerV2 passes is_async=True, so grpo.py's wait_fn=policy.finalize_async_save has to resolve to a real wait. """ - from nemo_rl.models.policy.workers.base_policy_worker import BasePolicyWorker + from nemo_rl.models.policy.workers.base_policy_worker import ( + AbstractPolicyWorker, + ) from nemo_rl.models.policy.workers.dtensor_policy_worker_v2 import ( - DTensorPolicyWorkerV2, + DTensorPolicyWorkerV2Impl, ) assert ( - DTensorPolicyWorkerV2.finalize_async_save - is not BasePolicyWorker.finalize_async_save + DTensorPolicyWorkerV2Impl.finalize_async_save + is not AbstractPolicyWorker.finalize_async_save ) - worker = object.__new__(DTensorPolicyWorkerV2) + worker = object.__new__(DTensorPolicyWorkerV2Impl) worker.checkpoint_manager = MagicMock() worker.finalize_async_save() worker.checkpoint_manager.finalize_async_save.assert_called_once_with() From 7813c4154664d821772a0e8d17e0c72cfb1a3d11 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Tue, 11 Aug 2026 02:06:17 -0700 Subject: [PATCH 20/34] fix(distillation): restore partitioned CP CE gradients Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/loss/loss_functions.py | 26 +++-- nemo_rl/algorithms/loss/utils.py | 45 ++++++-- tests/unit/algorithms/test_loss_functions.py | 113 ++++++++++++++++--- 3 files changed, 151 insertions(+), 33 deletions(-) diff --git a/nemo_rl/algorithms/loss/loss_functions.py b/nemo_rl/algorithms/loss/loss_functions.py index 1aec4b4d7f4..c615de7199b 100755 --- a/nemo_rl/algorithms/loss/loss_functions.py +++ b/nemo_rl/algorithms/loss/loss_functions.py @@ -42,6 +42,7 @@ DistributedCrossEntropy, cp_shift_next, group_all_reduce_sum, + group_all_reduce_sum_with_grad, vocab_parallel_full_log_softmax, vocab_parallel_gather_columns, vocab_parallel_log_softmax, @@ -1621,6 +1622,7 @@ def __call__( aligns_by_idx: dict[int, LocalizedAlignment], *, student_next_token_logprobs: Optional[torch.Tensor] = None, + student_next_token_mask: Optional[torch.Tensor] = None, tp_group: Optional[torch.distributed.ProcessGroup] = None, cp_group: Optional[torch.distributed.ProcessGroup] = None, ) -> tuple[torch.Tensor, dict[str, Any]]: @@ -1634,13 +1636,15 @@ def __call__( ``student_logits_contig`` (CP-relaid) and the per-teacher ``aligns_by_idx`` / ``teacher_full_logits_by_idx`` are precomputed in ``prepare_loss_input``; - the Automodel CP path also supplies its canonical full-sequence CE inputs. + the Automodel CP path also supplies its sequence-local CE inputs. """ ce_loss = self._compute_ce( logits, data, global_valid_toks, student_next_token_logprobs=student_next_token_logprobs, + student_next_token_mask=student_next_token_mask, + cp_group=cp_group, ) if self.kd_loss_mode == "sum": @@ -2657,20 +2661,26 @@ def _compute_ce( global_valid_toks: torch.Tensor, *, student_next_token_logprobs: Optional[torch.Tensor] = None, + student_next_token_mask: Optional[torch.Tensor] = None, + cp_group: Optional[torch.distributed.ProcessGroup] = None, ) -> torch.Tensor: """Next-token CE on the student side (TP/CP handled by the helpers).""" if student_next_token_logprobs is not None: - label_mask = ce_label_mask( - token_mask=data["token_mask"], - sample_mask=data["sample_mask"], - ce_seq_len=student_next_token_logprobs.shape[1], - dtype=student_next_token_logprobs.dtype, - ).to(student_next_token_logprobs.device) - return masked_mean( + assert student_next_token_mask is not None + label_mask = student_next_token_mask.to( + student_next_token_logprobs.dtype + ) * to_local_if_dtensor(data["sample_mask"]).to( + student_next_token_logprobs.device + ).unsqueeze(-1) + local_ce = masked_mean( -student_next_token_logprobs, label_mask, global_normalization_factor=global_valid_toks, ) + # Forward SUM gives every CP rank the same full-sequence CE (and + # therefore the same dynamic KD scale). Identity backward keeps the + # disjoint rank-local windows at a single gradient fanout. + return group_all_reduce_sum_with_grad(local_ce, cp_group) per_token_ce = student_next_token_ce( logits, input_ids=data["input_ids"], seq_index=data.get("seq_index") diff --git a/nemo_rl/algorithms/loss/utils.py b/nemo_rl/algorithms/loss/utils.py index 2b68d099f2f..33544e293d4 100644 --- a/nemo_rl/algorithms/loss/utils.py +++ b/nemo_rl/algorithms/loss/utils.py @@ -177,13 +177,44 @@ def prepare_loss_input( "cp_group": cp_group, } if cp_sharder is not None: - loss_input["student_next_token_logprobs"] = ( - get_cp_sharded_next_token_logprobs( - logits, - data["input_ids"], - cp_sharder, - chunk_size=chunk_size, - ) + next_token_logprobs = get_cp_sharded_next_token_logprobs( + logits, + data["input_ids"], + cp_sharder, + chunk_size=chunk_size, + ) + # The sharder gathers canonical log-probabilities on every CP rank. + # Give each rank one disjoint canonical window for CE backward so + # every token contributes exactly once across the CP group. Append + # the unused final-token slot first so partitioning uses the original + # sequence length rather than the next-token length. + full_logprobs = torch.cat( + [next_token_logprobs, torch.zeros_like(next_token_logprobs[:, :1])], + dim=1, + ) + cp_size = ( + torch.distributed.get_world_size(context_parallel_group) + if context_parallel_group is not None + else 1 + ) + cp_rank = ( + torch.distributed.get_rank(context_parallel_group) + if context_parallel_group is not None + else 0 + ) + local_seq_len = full_logprobs.shape[1] // cp_size + seq_start = cp_rank * local_seq_len + next_token_mask = ( + data["token_mask"].to(full_logprobs.device).roll(shifts=-1, dims=1) + ) + next_token_mask[:, -1] = 0 + loss_input.update( + student_next_token_logprobs=full_logprobs.narrow( + 1, seq_start, local_seq_len + ).contiguous(), + student_next_token_mask=next_token_mask.narrow( + 1, seq_start, local_seq_len + ).contiguous(), ) elif loss_fn.input_type == LossInputType.DRAFT: from megatron.core.transformer.multi_token_prediction import roll_tensor diff --git a/tests/unit/algorithms/test_loss_functions.py b/tests/unit/algorithms/test_loss_functions.py index d8598f862a4..b6a132d03b4 100644 --- a/tests/unit/algorithms/test_loss_functions.py +++ b/tests/unit/algorithms/test_loss_functions.py @@ -2709,15 +2709,16 @@ def test_cross_tokenizer_ce_respects_sample_mask(tmp_path): assert torch.allclose(ce_masked, ce_single, atol=1e-6) -def test_cross_tokenizer_prepare_loss_input_keeps_full_canonical_ce( +def test_cross_tokenizer_prepare_loss_input_partitions_canonical_ce( tmp_path, monkeypatch ): - """Automodel CP passes full canonical CE inputs through unchanged.""" + """Automodel CP assigns one disjoint canonical CE window to each rank.""" loss_fn = CrossTokenizerDistillationLossFn( _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) ) full_logprobs = torch.tensor([[-1.0, -2.0, -3.0]], requires_grad=True) token_mask = torch.tensor([[1.0, 1.0, 0.0, 1.0]]) + cp_group = object() data = BatchedDataDict( { "input_ids": torch.tensor([[0, 1, 2, 3]]), @@ -2728,40 +2729,52 @@ def test_cross_tokenizer_prepare_loss_input_keeps_full_canonical_ce( monkeypatch.setattr( "nemo_rl.algorithms.loss.utils.prepare_xtoken_cross_tokenizer_loss_input", - lambda *args, **kwargs: (torch.empty(0), {}, {}, None, None), + lambda *args, **kwargs: (torch.empty(0), {}, {}, None, cp_group), ) monkeypatch.setattr( "nemo_rl.algorithms.loss.utils.get_cp_sharded_next_token_logprobs", lambda *args, **kwargs: full_logprobs, ) + monkeypatch.setattr("torch.distributed.get_world_size", lambda group: 2) + monkeypatch.setattr("torch.distributed.get_rank", lambda group: 1) loss_input, prepared_data = prepare_loss_input( torch.empty(0), data, loss_fn, + context_parallel_group=cp_group, cp_sharder=object(), ) - assert loss_input["student_next_token_logprobs"] is full_logprobs - assert "student_next_token_mask" not in loss_input + torch.testing.assert_close( + loss_input["student_next_token_logprobs"], torch.tensor([[-3.0, 0.0]]) + ) + torch.testing.assert_close( + loss_input["student_next_token_mask"], torch.tensor([[1.0, 0.0]]) + ) assert prepared_data is data -def test_cross_tokenizer_precomputed_ce_uses_full_canonical_sequence(tmp_path): - """Precomputed CE uses the full canonical sequence and preserves gradients.""" +def test_cross_tokenizer_precomputed_ce_reduces_partitioned_cp_window( + tmp_path, monkeypatch +): + """Precomputed CE sums CP-window values while preserving local gradients.""" loss_fn = CrossTokenizerDistillationLossFn( _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) ) - data = BatchedDataDict( - { - "token_mask": torch.tensor( - [[1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 1.0, 1.0]] - ), - "sample_mask": torch.tensor([1.0, 0.0]), - } - ) - next_token_logprobs = torch.tensor( - [[-1.0, -2.0, -3.0], [-10.0, -20.0, -30.0]], requires_grad=True + data = BatchedDataDict({"sample_mask": torch.ones(1)}) + next_token_logprobs = torch.tensor([[-1.0, -2.0]], requires_grad=True) + next_token_mask = torch.ones_like(next_token_logprobs) + cp_group = object() + reduce_calls = [] + + def reduce_sum(value, group): + reduce_calls.append((value.detach().clone(), group)) + return value + + monkeypatch.setattr( + "nemo_rl.algorithms.loss.loss_functions.group_all_reduce_sum_with_grad", + reduce_sum, ) ce = loss_fn._compute_ce( @@ -2769,14 +2782,78 @@ def test_cross_tokenizer_precomputed_ce_uses_full_canonical_sequence(tmp_path): data, torch.tensor(2.0), student_next_token_logprobs=next_token_logprobs, + student_next_token_mask=next_token_mask, + cp_group=cp_group, ) torch.testing.assert_close(ce, torch.tensor(1.5)) ce.backward() torch.testing.assert_close( next_token_logprobs.grad, - torch.tensor([[-0.5, -0.5, 0.0], [0.0, 0.0, 0.0]]), + torch.tensor([[-0.5, -0.5]]), ) + assert len(reduce_calls) == 1 + torch.testing.assert_close(reduce_calls[0][0], torch.tensor(1.5)) + assert reduce_calls[0][1] is cp_group + + +def test_cross_tokenizer_partitioned_cp_ce_matches_cp1_value_and_gradient(tmp_path): + """Summed CP2 CE windows are numerically identical to the CP1 full CE.""" + loss_fn = CrossTokenizerDistillationLossFn( + _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) + ) + data = BatchedDataDict( + { + "token_mask": torch.tensor( + [[1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 1.0, 1.0]] + ), + "sample_mask": torch.tensor([1.0, 0.0]), + } + ) + global_valid_toks = torch.tensor(2.0) + full_mask = data["token_mask"].roll(shifts=-1, dims=1) + full_mask[:, -1] = 0 + + cp1_logprobs = torch.tensor( + [[-1.0, -2.0, -3.0], [-10.0, -20.0, -30.0]], requires_grad=True + ) + cp1_loss = loss_fn._compute_ce( + torch.empty(0), + data, + global_valid_toks, + student_next_token_logprobs=cp1_logprobs, + student_next_token_mask=full_mask[:, :-1], + cp_group=None, + ) + cp1_loss.backward() + + cp2_logprobs = cp1_logprobs.detach().clone().requires_grad_(True) + cp2_padded = torch.cat( + [cp2_logprobs, torch.zeros_like(cp2_logprobs[:, :1])], dim=1 + ) + cp2_local_seq_len = cp2_padded.shape[1] // 2 + cp2_losses = [] + for cp_rank in range(2): + seq_start = cp_rank * cp2_local_seq_len + cp2_losses.append( + loss_fn._compute_ce( + torch.empty(0), + data, + global_valid_toks, + student_next_token_logprobs=cp2_padded.narrow( + 1, seq_start, cp2_local_seq_len + ), + student_next_token_mask=full_mask.narrow( + 1, seq_start, cp2_local_seq_len + ), + cp_group=None, + ) + ) + cp2_loss = sum(cp2_losses) + cp2_loss.backward() + + torch.testing.assert_close(cp2_loss, cp1_loss) + torch.testing.assert_close(cp2_logprobs.grad, cp1_logprobs.grad) # ── Metric-normalization advertisement (PR #2683) ───────────────────────── From c33f4364e530d363df2bc2c2de8964dcc05606d4 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 14 Aug 2026 01:23:56 -0700 Subject: [PATCH 21/34] build: use Transformers 5.12.1 for compatible backends Signed-off-by: larkzhang-nv --- pyproject.toml | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d802029cadc..757d15365ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,10 +52,9 @@ dependencies = [ "torchvision==0.26.0", # torchaudio and torchcodec are NOT installed in the container image. # Run tools/install_audio_deps.sh before using audio features or audio tests. - # Keep the base range broad enough while allowing backend extras to tighten as needed. - # Floor raised to 5.5.0 for Gemma 4 support. - # Ceiling raised to <5.13.0 for Automodel r0.6.0, which pins transformers==5.12.1. - "transformers>=5.5.0,<5.13.0", + # Keep the base range compatible with backend-specific pins while selecting 5.12.1 + # for the base and compatible backend environments in uv.lock. + "transformers>=5.5.0,<=5.12.1", "num2words>=0.5.14", # for SmolVLM "timm", "open-clip-torch>=3.2.0", @@ -554,6 +553,34 @@ conflicts = [ { extra = "trtllm" }, { extra = "mcore" }, ], + [ + { extra = "trtllm" }, + { extra = "fsdp" }, + ], + [ + { extra = "trtllm" }, + { extra = "modelopt" }, + ], + [ + { extra = "trtllm" }, + { extra = "nvrx" }, + ], + [ + { extra = "trtllm" }, + { extra = "nemo_gym" }, + ], + [ + { extra = "sglang" }, + { extra = "modelopt" }, + ], + [ + { extra = "sglang" }, + { extra = "nvrx" }, + ], + [ + { extra = "sglang" }, + { extra = "nemo_gym" }, + ], ] From d592efc585b8e3f7d34bb24d521e1d5150074177 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 14 Aug 2026 03:36:33 -0700 Subject: [PATCH 22/34] fix(sglang): preserve non-CUDA tensor reductions Signed-off-by: larkzhang-nv --- .../generation/sglang/utils/train_utils.py | 12 +++-- .../generation/sglang/test_utils_smoke.py | 46 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/nemo_rl/models/generation/sglang/utils/train_utils.py b/nemo_rl/models/generation/sglang/utils/train_utils.py index 99a67574244..a7630970473 100644 --- a/nemo_rl/models/generation/sglang/utils/train_utils.py +++ b/nemo_rl/models/generation/sglang/utils/train_utils.py @@ -89,9 +89,15 @@ def monkey_patch_torch_reductions(): def _reduce_tensor_modified(*args, **kwargs): output_fn, output_args = reductions._reduce_tensor_original(*args, **kwargs) - output_args = _modify_tuple( - output_args, _REDUCE_TENSOR_ARG_DEVICE_INDEX, _device_to_uuid - ) + # ``reduce_tensor`` has different rebuild functions and argument layouts + # for CUDA, CPU, meta, sparse, and nested tensors. Only the dense CUDA path + # returns our patched CUDA rebuild function with the device at index 6. + # Applying the CUDA layout unconditionally breaks CPU tensors staged by + # async checkpointing, whose rebuild arguments contain only three items. + if output_fn is _rebuild_cuda_tensor_modified: + output_args = _modify_tuple( + output_args, _REDUCE_TENSOR_ARG_DEVICE_INDEX, _device_to_uuid + ) return output_fn, output_args diff --git a/tests/unit/models/generation/sglang/test_utils_smoke.py b/tests/unit/models/generation/sglang/test_utils_smoke.py index b186ec40feb..ff35d182137 100644 --- a/tests/unit/models/generation/sglang/test_utils_smoke.py +++ b/tests/unit/models/generation/sglang/test_utils_smoke.py @@ -19,6 +19,8 @@ """ import pytest +import torch +from torch.multiprocessing import reductions from . import ( helpers, # noqa: F401 — installs env vars + module stubs before nemo_rl imports @@ -28,6 +30,7 @@ from nemo_rl.models.generation.sglang.utils.ip_port_utils import _wrap_ipv6 from nemo_rl.models.generation.sglang.utils.ray_utils import get_host_info +from nemo_rl.models.generation.sglang.utils import train_utils from nemo_rl.models.generation.sglang.utils.train_utils import ( MultiprocessingSerializer, ) @@ -70,3 +73,46 @@ def test_serializer_roundtrip(): assert isinstance(serialized, str) and len(serialized) > 0 deserialized = MultiprocessingSerializer.deserialize(serialized) assert deserialized == obj + + +def test_reduce_tensor_modified_preserves_cpu_reduction(monkeypatch): + """The CUDA UUID patch must leave the shorter CPU reducer protocol intact.""" + tensor = torch.tensor([1, 2, 3]) + monkeypatch.setattr( + reductions, + "_reduce_tensor_original", + reductions.reduce_tensor, + raising=False, + ) + + output_fn, output_args = train_utils._reduce_tensor_modified(tensor) + + assert output_fn is reductions.rebuild_tensor + assert len(output_args) == 3 + torch.testing.assert_close(output_fn(*output_args), tensor) + + +def test_reduce_tensor_modified_converts_cuda_device_to_uuid(monkeypatch): + """The dense CUDA reducer still converts its device argument to a UUID.""" + cuda_output_args = tuple(range(15)) + monkeypatch.setattr( + reductions, + "_reduce_tensor_original", + lambda *_args, **_kwargs: ( + train_utils._rebuild_cuda_tensor_modified, + cuda_output_args, + ), + raising=False, + ) + monkeypatch.setattr( + train_utils, + "_device_to_uuid", + lambda device: f"cuda-uuid-{device}", + ) + + output_fn, output_args = train_utils._reduce_tensor_modified(object()) + + assert output_fn is train_utils._rebuild_cuda_tensor_modified + assert output_args[:6] == cuda_output_args[:6] + assert output_args[6] == "cuda-uuid-6" + assert output_args[7:] == cuda_output_args[7:] From f777c07f4c5ba8928f4ce7ea3dcd9596fb740163 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Wed, 19 Aug 2026 02:28:38 -0700 Subject: [PATCH 23/34] build: pin transformers for compatible backends Signed-off-by: larkzhang-nv --- pyproject.toml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 757d15365ef..1d66d42a616 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -110,9 +110,8 @@ dependencies = [ ] [project.optional-dependencies] -# Keep non-SGLang backends on their pre-SGLang-upgrade Transformers versions. -# FSDP retains the shared range because it can be combined with other backend extras. fsdp = [ + "transformers==5.12.1", # +cu13 wheels from GitHub match torch cu130; PyPI often resolves to +cu12 (libcudart.so.12). # https://github.com/Dao-AILab/flash-attention/releases/tag/v2.8.1 "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl ; sys_platform == 'linux' and platform_machine == 'aarch64'", @@ -120,7 +119,6 @@ fsdp = [ "flash-attn==2.8.1 ; sys_platform != 'linux' or (platform_machine != 'aarch64' and platform_machine != 'x86_64')", "mamba-ssm", "causal-conv1d", - "transformers>=5.5.0,<5.9.0", "tilelang==0.1.9; sys_platform == 'linux' and platform_machine == 'x86_64'", ] automodel = [ @@ -135,8 +133,7 @@ automodel = [ "flash-attn @ https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl ; sys_platform == 'linux' and platform_machine == 'x86_64'", "flash-attn==2.8.1 ; sys_platform != 'linux' or (platform_machine != 'aarch64' and platform_machine != 'x86_64')", # Mirrors nemo-automodel's own `transformers==5.12.1` pin (Automodel r0.6.0). - "transformers>=5.12.1,<5.13.0", - "tilelang==0.1.9; sys_platform == 'linux' and platform_machine == 'x86_64'", + "transformers==5.12.1", "mistral-common>=1.11.0", "mamba-ssm", "causal-conv1d", @@ -146,7 +143,7 @@ automodel = [ "deep_ep @ git+https://github.com/deepseek-ai/DeepEP.git@a48493600c4886c1b297aaa78db0e1ebc2d8dd6c ; platform_machine == 'aarch64'", ] vllm = [ - "transformers==5.8.1", + "transformers==5.12.1", "tilelang==0.1.9; sys_platform == 'linux' and platform_machine == 'x86_64'", "cuda-python", "deep_gemm @ git+https://github.com/deepseek-ai/DeepGEMM.git@67fc64863d43521080bf2005e6528d0fceee9510", @@ -199,7 +196,7 @@ mcore = [ # dependency megatron-core[dev,mlm] and its [tool.uv.sources] path mapping, so Megatron-LM # pyproject changes propagate on bump without any mirror here. "megatron-bridge[te,ssm]", - "transformers==5.8.1", + "transformers==5.12.1", "tilelang==0.1.9; sys_platform == 'linux' and (platform_machine == 'x86_64' or platform_machine == 'aarch64')", # Flash-attn version should be selected to satisfy both TE + vLLM requirements (xformers in particular) # https://github.com/NVIDIA/TransformerEngine/blob/v2.3/transformer_engine/pytorch/attention/dot_product_attention/utils.py#L108 From 8c3267bcf585207ce5a330a02b88feb09638840a Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Wed, 19 Aug 2026 09:08:56 -0700 Subject: [PATCH 24/34] test(automodel): repair multimodal model_forward coverage model_forward now takes the Automodel-prepared model_batch dict, but five TestModelForward multimodal tests still passed a ProcessedInputs dataclass, so model(**model_batch) raised TypeError and aborted the file under -x. Route them through the existing _prepare_cp1 helper and assert on prepared.model_batch. filter_multimodal_kwargs_for_model now runs inside _build_model_batch, so the mixed-resolution guard is asserted around prepare_model_forward rather than model_forward; verified by mutation that disabling the guard fails the test. Also apply ruff import-sort and format fixes to the touched test files. Co-Authored-By: Claude Opus 5 (1M context) Signed-off-by: larkzhang-nv --- tests/unit/algorithms/test_loss_functions.py | 8 ++------ .../models/automodel/test_automodel_train.py | 18 ++++++++++++------ .../generation/sglang/test_utils_smoke.py | 2 +- .../unit/models/policy/test_automodel_types.py | 4 +++- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/tests/unit/algorithms/test_loss_functions.py b/tests/unit/algorithms/test_loss_functions.py index b6a132d03b4..b02d3810c9f 100644 --- a/tests/unit/algorithms/test_loss_functions.py +++ b/tests/unit/algorithms/test_loss_functions.py @@ -2804,9 +2804,7 @@ def test_cross_tokenizer_partitioned_cp_ce_matches_cp1_value_and_gradient(tmp_pa ) data = BatchedDataDict( { - "token_mask": torch.tensor( - [[1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 1.0, 1.0]] - ), + "token_mask": torch.tensor([[1.0, 1.0, 1.0, 0.0], [1.0, 1.0, 1.0, 1.0]]), "sample_mask": torch.tensor([1.0, 0.0]), } ) @@ -2828,9 +2826,7 @@ def test_cross_tokenizer_partitioned_cp_ce_matches_cp1_value_and_gradient(tmp_pa cp1_loss.backward() cp2_logprobs = cp1_logprobs.detach().clone().requires_grad_(True) - cp2_padded = torch.cat( - [cp2_logprobs, torch.zeros_like(cp2_logprobs[:, :1])], dim=1 - ) + cp2_padded = torch.cat([cp2_logprobs, torch.zeros_like(cp2_logprobs[:, :1])], dim=1) cp2_local_seq_len = cp2_padded.shape[1] // 2 cp2_losses = [] for cp_rank in range(2): diff --git a/tests/unit/models/automodel/test_automodel_train.py b/tests/unit/models/automodel/test_automodel_train.py index 819a969fed9..99bc3bac026 100644 --- a/tests/unit/models/automodel/test_automodel_train.py +++ b/tests/unit/models/automodel/test_automodel_train.py @@ -35,9 +35,9 @@ make_processed_microbatch_iterator, ) from nemo_rl.models.automodel.train import ( - PreparedModelForward, LogprobsPostProcessor, LossPostProcessor, + PreparedModelForward, ScorePostProcessor, TopkLogitsPostProcessor, apply_temperature_scaling, @@ -225,7 +225,8 @@ def forward( } ) - model_forward(model, processed_inputs_multimodal) + prepared = _prepare_cp1(model, processed_inputs_multimodal) + model_forward(model, prepared.model_batch) assert ( model.pixel_values is processed_inputs_multimodal.vlm_kwargs["pixel_values"] @@ -253,8 +254,10 @@ def forward( } ) + # The mixed-resolution guard lives in ``filter_multimodal_kwargs_for_model``, + # which ``prepare_model_forward`` invokes while building the model batch. with pytest.raises(ValueError, match="mixed-resolution"): - model_forward(model, processed_inputs_multimodal) + _prepare_cp1(model, processed_inputs_multimodal) def test_forward_allows_uniform_resolution_without_imgs_sizes_support( self, processed_inputs_multimodal @@ -285,7 +288,8 @@ def forward( # Uniform sizes (the shipped fixed-tile case): no raise, and imgs_sizes # is filtered out for a model that cannot consume it. - model_forward(model, processed_inputs_multimodal) + prepared = _prepare_cp1(model, processed_inputs_multimodal) + model_forward(model, prepared.model_batch) assert ( model.pixel_values is processed_inputs_multimodal.vlm_kwargs["pixel_values"] @@ -325,7 +329,8 @@ def forward( } ) - model_forward(model, processed_inputs_multimodal) + prepared = _prepare_cp1(model, processed_inputs_multimodal) + model_forward(model, prepared.model_batch) assert model.forward_kwargs["pixel_values"] is padded_images assert model.forward_kwargs["imgs_sizes"] is image_sizes @@ -345,7 +350,8 @@ def forward(self, **kwargs): model = KwargsModel() processed_inputs_multimodal.vlm_kwargs["num_frames"] = torch.tensor([1]) - model_forward(model, processed_inputs_multimodal) + prepared = _prepare_cp1(model, processed_inputs_multimodal) + model_forward(model, prepared.model_batch) assert "num_frames" in model.forward_kwargs diff --git a/tests/unit/models/generation/sglang/test_utils_smoke.py b/tests/unit/models/generation/sglang/test_utils_smoke.py index ff35d182137..f7a1afddfbc 100644 --- a/tests/unit/models/generation/sglang/test_utils_smoke.py +++ b/tests/unit/models/generation/sglang/test_utils_smoke.py @@ -28,9 +28,9 @@ pytestmark = pytest.mark.sglang +from nemo_rl.models.generation.sglang.utils import train_utils from nemo_rl.models.generation.sglang.utils.ip_port_utils import _wrap_ipv6 from nemo_rl.models.generation.sglang.utils.ray_utils import get_host_info -from nemo_rl.models.generation.sglang.utils import train_utils from nemo_rl.models.generation.sglang.utils.train_utils import ( MultiprocessingSerializer, ) diff --git a/tests/unit/models/policy/test_automodel_types.py b/tests/unit/models/policy/test_automodel_types.py index eb1ca603e14..5a3a3c4a84a 100644 --- a/tests/unit/models/policy/test_automodel_types.py +++ b/tests/unit/models/policy/test_automodel_types.py @@ -18,7 +18,9 @@ # Check if nemo_automodel is available for tests that need it try: - from nemo_automodel.components.models.common.utils import BackendConfig # noqa: F401 + from nemo_automodel.components.models.common.utils import ( + BackendConfig, # noqa: F401 + ) NEMO_AUTOMODEL_AVAILABLE = True except ImportError: From 5796a09152eaade44c914adf814237212e1a05c6 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 24 Aug 2026 00:21:06 -0700 Subject: [PATCH 25/34] fix: expose Z3 to symlinked worker venvs Signed-off-by: larkzhang-nv --- docker/Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 3f4649752c8..988cb746b4c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -186,7 +186,12 @@ ENV CPLUS_INCLUDE_PATH=/usr/local/cuda/include/cccl # Verify with: python -c "import transformer_engine.pytorch as te; print(te.get_cudnn_version())" ENV CUDNN_HOME=/opt/nemo_rl_venv/lib/python3.13/site-packages/nvidia/cudnn ENV CUDNN_PATH=/opt/nemo_rl_venv/lib/python3.13/site-packages/nvidia/cudnn -ENV LD_LIBRARY_PATH="/opt/nemo_rl_venv/lib/python3.13/site-packages/nvidia/cudnn/lib:${LD_LIBRARY_PATH}" +# TileLang's $ORIGIN-relative RUNPATH breaks when uv installs worker venvs in +# symlink mode: libtvm_compiler.so resolves into TileLang's cache directory and +# cannot find libz3.so in Z3's separate cache directory. +# TODO: Remove this workaround once the upstream issue is resolved. +# See https://github.com/tile-ai/tilelang/issues/3075 +ENV LD_LIBRARY_PATH="/opt/nemo_rl_venv/lib/python3.13/site-packages/z3/lib:/opt/nemo_rl_venv/lib/python3.13/site-packages/nvidia/cudnn/lib:${LD_LIBRARY_PATH}" # First copy only the dependency files COPY --from=nemo-rl pyproject.toml uv.lock ./ From eb5fb10a899462dc97d404b88eea4294785d2bd9 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 24 Aug 2026 00:50:36 -0700 Subject: [PATCH 26/34] fix: address review-pr-team feedback Signed-off-by: larkzhang-nv --- nemo_rl/algorithms/loss/utils.py | 20 ++- nemo_rl/algorithms/x_token/loss_utils.py | 9 +- nemo_rl/distributed/model_utils.py | 7 +- nemo_rl/models/automodel/checkpoint.py | 27 ++- nemo_rl/models/automodel/data.py | 2 + nemo_rl/models/automodel/setup.py | 11 +- nemo_rl/models/automodel/train.py | 12 +- nemo_rl/models/policy/__init__.py | 6 +- .../value/workers/dtensor_value_worker_v2.py | 8 + tests/unit/algorithms/test_loss_functions.py | 39 ++++ .../algorithms/x_token/test_loss_utils.py | 30 ++++ .../automodel/test_automodel_checkpoint.py | 37 ++++ .../test_automodel_context_parallel.py | 159 +++++++++++++++- .../models/automodel/test_automodel_setup.py | 7 +- .../models/automodel/test_automodel_train.py | 170 ++++++++++++++++++ .../generation/sglang/test_utils_smoke.py | 2 +- .../models/value/test_dtensor_value_worker.py | 24 +++ 17 files changed, 539 insertions(+), 31 deletions(-) diff --git a/nemo_rl/algorithms/loss/utils.py b/nemo_rl/algorithms/loss/utils.py index 33544e293d4..e5d5da117be 100644 --- a/nemo_rl/algorithms/loss/utils.py +++ b/nemo_rl/algorithms/loss/utils.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Any, Optional +from typing import TYPE_CHECKING, Any, Optional import torch @@ -34,6 +34,11 @@ get_next_token_logprobs_from_logits, ) +if TYPE_CHECKING: + from nemo_automodel.components.distributed.context_parallel import ( + ContextParallelSharder, + ) + def prepare_loss_input( logits: torch.Tensor, @@ -45,7 +50,7 @@ def prepare_loss_input( sampling_params: Optional[TrainingSamplingParams] = None, d2t: Optional[torch.Tensor] = None, chunk_size: Optional[int] = None, - cp_sharder: Optional[Any] = None, + cp_sharder: Optional["ContextParallelSharder"] = None, ) -> tuple[dict[str, Any], BatchedDataDict[Any]]: """Prepare loss input for a loss function. @@ -197,12 +202,21 @@ def prepare_loss_input( if context_parallel_group is not None else 1 ) + full_seq_len = full_logprobs.shape[1] + if full_seq_len % cp_size != 0: + raise ValueError( + "Student sequence length must be divisible by the student " + "context parallel size, but got " + f"sequence_length={full_seq_len}, cp_size={cp_size}. " + "Set policy.make_sequence_length_divisible_by to a multiple of " + "policy.dtensor_cfg.context_parallel_size." + ) cp_rank = ( torch.distributed.get_rank(context_parallel_group) if context_parallel_group is not None else 0 ) - local_seq_len = full_logprobs.shape[1] // cp_size + local_seq_len = full_seq_len // cp_size seq_start = cp_rank * local_seq_len next_token_mask = ( data["token_mask"].to(full_logprobs.device).roll(shifts=-1, dims=1) diff --git a/nemo_rl/algorithms/x_token/loss_utils.py b/nemo_rl/algorithms/x_token/loss_utils.py index defe23c4773..7b74754fdfe 100644 --- a/nemo_rl/algorithms/x_token/loss_utils.py +++ b/nemo_rl/algorithms/x_token/loss_utils.py @@ -39,7 +39,7 @@ import os from dataclasses import dataclass, fields -from typing import Any, Dict, Mapping, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Dict, Mapping, Optional, Tuple, Union import torch from torch.distributed.tensor import DTensor @@ -54,6 +54,11 @@ ) from nemo_rl.models.dtensor.parallelize import to_local_if_dtensor +if TYPE_CHECKING: + from nemo_automodel.components.distributed.context_parallel import ( + ContextParallelSharder, + ) + def alignment_from_flat_batch(data: Mapping[str, Any]) -> AlignmentBatch: """Rebuild :class:`AlignmentBatch` from the flat ``alignment_*`` keys. @@ -1008,7 +1013,7 @@ def prepare_xtoken_cross_tokenizer_loss_input( projection_matrix_paths: list[Optional[str]], vocab_parallel_group: Optional[torch.distributed.ProcessGroup] = None, context_parallel_group: Optional[torch.distributed.ProcessGroup] = None, - cp_sharder: Optional[Any] = None, + cp_sharder: Optional["ContextParallelSharder"] = None, ) -> tuple[ torch.Tensor, Dict[int, torch.Tensor], diff --git a/nemo_rl/distributed/model_utils.py b/nemo_rl/distributed/model_utils.py index b4816862410..2a6b212b675 100644 --- a/nemo_rl/distributed/model_utils.py +++ b/nemo_rl/distributed/model_utils.py @@ -28,6 +28,9 @@ # megatron-core (optional "mcore" extra) is imported lazily below so this # module imports without mcore installed. from megatron.core.models.gpt import GPTModel + from nemo_automodel.components.distributed.context_parallel import ( + ContextParallelSharder, + ) def _compute_distributed_log_softmax_with_grad( @@ -1746,7 +1749,7 @@ def get_next_token_logprobs_from_logits( context_parallel_group: Optional[torch.distributed.ProcessGroup] = None, sampling_params: Optional[TrainingSamplingParams] = None, chunk_size: Optional[int] = None, - cp_sharder: Optional[Any] = None, + cp_sharder: Optional["ContextParallelSharder"] = None, ) -> torch.Tensor: """Compute token log-probabilities from logits, handling parallel and non-parallel cases. @@ -2006,7 +2009,7 @@ def get_distillation_topk_logprobs_from_logits( vocab_parallel_rank: Optional[int] = None, vocab_parallel_group: Optional[torch.distributed.ProcessGroup] = None, context_parallel_group: Optional[torch.distributed.ProcessGroup] = None, - cp_sharder: Optional[Any] = None, + cp_sharder: Optional["ContextParallelSharder"] = None, ): """Compute top-k log probabilities from logits.""" if teacher_topk_indices.shape[-1] <= 0: diff --git a/nemo_rl/models/automodel/checkpoint.py b/nemo_rl/models/automodel/checkpoint.py index 67a91685547..6a5540034fd 100644 --- a/nemo_rl/models/automodel/checkpoint.py +++ b/nemo_rl/models/automodel/checkpoint.py @@ -32,6 +32,7 @@ CheckpointingConfig as AutomodelCheckpointingConfig, ) from nemo_automodel.components.checkpoint.config import ( + SaveConsolidatedMode, _normalize_save_consolidated, ) from torch import nn @@ -42,6 +43,20 @@ from nemo_rl.utils.native_checkpoint import save_tokenizer_on_rank0 +def _normalize_supported_save_consolidated( + value: bool | str | SaveConsolidatedMode, +) -> SaveConsolidatedMode: + """Normalize the consolidated-save mode supported by NeMo-RL.""" + mode = _normalize_save_consolidated(value) + if mode == SaveConsolidatedMode.FINAL: + raise ValueError( + "save_consolidated: final is not supported because NeMo-RL does not " + "mark final checkpoint saves. Use save_consolidated: true to export " + "consolidated weights." + ) + return mode + + def _patch_qwen_vl_vision_key_mapping() -> None: """Re-add the Qwen2.5-VL ``^visual`` -> ``model.visual`` checkpoint key rename. @@ -171,7 +186,9 @@ def init_checkpointer( model_save_format=config_updates.get("model_save_format", "safetensors"), model_cache_dir=config_updates.get("model_cache_dir", ""), model_repo_id=config_updates.get("model_repo_id", ""), - save_consolidated=config_updates.get("save_consolidated", False), + save_consolidated=_normalize_supported_save_consolidated( + config_updates.get("save_consolidated", False) + ), is_peft=config_updates.get("is_peft", False), is_async=config_updates.get("is_async", False), dequantize_base_checkpoint=config_updates.get( @@ -225,7 +242,7 @@ def update_checkpointer_config( # CheckpointingConfig.__post_init__, which setattr bypasses. Without this # a bool True would silently compare unequal to SaveConsolidatedMode.EVERY # and disable consolidated HF export. - v = _normalize_save_consolidated(v) + v = _normalize_supported_save_consolidated(v) setattr(cfg, k, v) # Rebuild _addons list based on updated config @@ -322,16 +339,16 @@ def save_checkpoint( "model_save_format", "save_consolidated", "is_peft", - "peft_config", "model_cache_dir", "model_repo_id", "is_async", "dequantize_base_checkpoint", } } + save_peft_config = checkpointing_cfg.get("peft_config") if lora_enabled: checkpoint_kwargs["is_peft"] = True - checkpoint_kwargs["peft_config"] = peft_config + save_peft_config = peft_config checkpoint_root = _infer_checkpoint_root(weights_path) @@ -343,7 +360,7 @@ def save_checkpoint( self.checkpointer.save_model( model=model, weights_path=weights_path, - peft_config=checkpoint_kwargs.get("peft_config"), + peft_config=save_peft_config, tokenizer=tokenizer if tokenizer_path is None else None, ) diff --git a/nemo_rl/models/automodel/data.py b/nemo_rl/models/automodel/data.py index da879617aa1..9f2170d61a0 100644 --- a/nemo_rl/models/automodel/data.py +++ b/nemo_rl/models/automodel/data.py @@ -202,6 +202,7 @@ def get_microbatch_iterator( mbs: Microbatch size dp_mesh: Data parallel mesh tokenizer: Tokenizer for processing + Returns: Tuple of (processed_microbatch_iterator, iterator_length) """ @@ -252,6 +253,7 @@ def process_microbatch( tokenizer: Tokenizer for padding value enable_seq_packing: Whether sequence packing is enabled cfg: Configuration dictionary + Returns: ProcessedInputs containing all tensors and metadata for forward pass """ diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index a97a8670677..15f79e5567a 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -17,7 +17,6 @@ import importlib import inspect import os -from datetime import timedelta from functools import partial from typing import Any, Optional, Union @@ -445,10 +444,7 @@ def setup_distributed( """ # Initialize process group backend = "nccl" if not runtime_config.cpu_offload else "cuda:nccl,cpu:gloo" - # Large multi-node checkpoints can materialize at different speeds on each - # node. Keep the default process group alive long enough for lagging ranks - # to reach the first DTensor initialization collective. - torch.distributed.init_process_group(backend=backend, timeout=timedelta(minutes=30)) + torch.distributed.init_process_group(backend=backend) world_size = torch.distributed.get_world_size() # Extract configuration values @@ -658,8 +654,9 @@ def setup_model_and_optimizer( from torch.nn.attention import SDPBackend if cp_size > 1: - # Match Automodel's `get_train_context` in `cp_utils.py` where only - # flash and efficient backends are supported + # Match Automodel's `get_train_context` in + # `components/distributed/context_parallel/utils.py`, where only flash + # and efficient backends are supported. sdpa_method = [ SDPBackend.FLASH_ATTENTION, SDPBackend.EFFICIENT_ATTENTION, diff --git a/nemo_rl/models/automodel/train.py b/nemo_rl/models/automodel/train.py index 87d15135b33..f5932477e21 100644 --- a/nemo_rl/models/automodel/train.py +++ b/nemo_rl/models/automodel/train.py @@ -332,6 +332,11 @@ def forward_with_post_processing_fn( raise RuntimeError( "ContextParallelSharder is required when context_parallel_size > 1" ) + if prepared.cp_size > 1 and isinstance(post_processing_fn, ScorePostProcessor): + raise NotImplementedError( + "ScorePostProcessor does not support context_parallel_size > 1 " + "on the automodel backend. Set context_parallel_size=1." + ) # Model forward pass outputs = model_forward(model, prepared.model_batch) @@ -518,6 +523,11 @@ def automodel_forward_backward( ## by zero in the loss function to prevent them ## from affecting the gradient calculation + # FSDP averages gradients over its DP mesh (dp_size * cp_size), + # while loss normalization expects their sum, so cancel that + # average here. Replicated CP losses send each local model + # contribution to cp_size loss consumers; divide by that fanout + # to avoid overcounting. Partitioned losses have a fanout of 1. loss = ( result * dp_size @@ -613,7 +623,7 @@ def __call__( if token_layout is not None: input_type = self.loss_fn.input_type if input_type == LossInputType.LOGIT: - # Logit losses (value-head MSE, DPO) consume full-sequence logits + # Logit losses such as value-head MSE consume full-sequence logits # against the canonical data_dict, so restore canonical order here # while keeping any vocabulary (TP) sharding intact. logits = _cp_gather_logits(logits, token_layout, sequence_dim) diff --git a/nemo_rl/models/policy/__init__.py b/nemo_rl/models/policy/__init__.py index 7d14674a392..e714cbea4c1 100644 --- a/nemo_rl/models/policy/__init__.py +++ b/nemo_rl/models/policy/__init__.py @@ -42,10 +42,8 @@ def _patch_transformers_tokenizer_class_set(): import transformers from packaging.version import Version as PkgVersion - # The upstream fix was expected around 5.12, but 5.12.1 still ships both - # registry entries, so the patch is still load-bearing there. The sglang - # worker venv pins transformers==5.12.1 (sglang requirement), while other - # backend venvs retain their prior 5.5.x or 5.8.1 pins, so this runs on all. + # Transformers 5.12.1 still ships both registry entries, so the patch remains + # load-bearing across the currently supported backend environments. # TODO: remove this patch (and the assert below) once the deepseek_v3 # entries actually disappear upstream. # https://github.com/NVIDIA-NeMo/RL/issues/2764 diff --git a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py index 5f8fb7367a3..cfe51e76588 100644 --- a/nemo_rl/models/value/workers/dtensor_value_worker_v2.py +++ b/nemo_rl/models/value/workers/dtensor_value_worker_v2.py @@ -110,6 +110,14 @@ def __init__( Note: Value models don't need a reference model since they don't compute KL divergence. """ + if config["dtensor_cfg"]["context_parallel_size"] > 1: + raise NotImplementedError( + "DTensorValueWorkerV2 cannot be initialized with " + "context_parallel_size > 1 because its get_values() scoring path " + "does not support context parallelism. Set " + "value.dtensor_cfg.context_parallel_size=1." + ) + # Apply patches apply_transformer_engine_patch() diff --git a/tests/unit/algorithms/test_loss_functions.py b/tests/unit/algorithms/test_loss_functions.py index b02d3810c9f..12aa3f4d4d5 100644 --- a/tests/unit/algorithms/test_loss_functions.py +++ b/tests/unit/algorithms/test_loss_functions.py @@ -2755,6 +2755,45 @@ def test_cross_tokenizer_prepare_loss_input_partitions_canonical_ce( assert prepared_data is data +def test_cross_tokenizer_prepare_loss_input_rejects_nondivisible_cp_window( + tmp_path, monkeypatch +): + """Automodel CP rejects canonical CE windows that cannot partition evenly.""" + loss_fn = CrossTokenizerDistillationLossFn( + _ct_loss_cfg(_write_ct_projection(tmp_path), gold_loss=False) + ) + next_token_logprobs = torch.tensor( + [[-1.0, -2.0, -3.0, -4.0, -5.0]], requires_grad=True + ) + cp_group = object() + data = BatchedDataDict( + { + "input_ids": torch.zeros((1, 6), dtype=torch.long), + "token_mask": torch.ones((1, 6)), + "sample_mask": torch.ones(1), + } + ) + + monkeypatch.setattr( + "nemo_rl.algorithms.loss.utils.prepare_xtoken_cross_tokenizer_loss_input", + lambda *args, **kwargs: (torch.empty(0), {}, {}, None, cp_group), + ) + monkeypatch.setattr( + "nemo_rl.algorithms.loss.utils.get_cp_sharded_next_token_logprobs", + lambda *args, **kwargs: next_token_logprobs, + ) + monkeypatch.setattr("torch.distributed.get_world_size", lambda group: 4) + + with pytest.raises(ValueError, match=r"sequence_length=6, cp_size=4"): + prepare_loss_input( + torch.empty(0), + data, + loss_fn, + context_parallel_group=cp_group, + cp_sharder=object(), + ) + + def test_cross_tokenizer_precomputed_ce_reduces_partitioned_cp_window( tmp_path, monkeypatch ): diff --git a/tests/unit/algorithms/x_token/test_loss_utils.py b/tests/unit/algorithms/x_token/test_loss_utils.py index 7bd1fde6c94..d280c6e2bc1 100644 --- a/tests/unit/algorithms/x_token/test_loss_utils.py +++ b/tests/unit/algorithms/x_token/test_loss_utils.py @@ -156,6 +156,36 @@ def test_automodel_cp_layout_localizes_xtoken_windows_after_global_shift(): rebuild_teacher.assert_called_once_with(teacher_ipc, cp_group=cp_group, device=0) +def test_automodel_cp_layout_rejects_non_divisible_student_sequence(): + cp_group = object() + local_logits = torch.randn(1, 3, 2) + cp_sharder = MagicMock() + cp_sharder.gather_token_tensor.return_value = torch.randn(1, 5, 2) + + with ( + patch("torch.cuda.current_device", return_value=0), + patch("torch.distributed.get_world_size", return_value=2), + pytest.raises( + ValueError, + match=( + "X-token student sequence length must be divisible by the student " + "context parallel size" + ), + ), + ): + prepare_xtoken_cross_tokenizer_loss_input( + local_logits, + {}, + projection_matrix_paths=[], + context_parallel_group=cp_group, + cp_sharder=cp_sharder, + ) + + cp_sharder.gather_token_tensor.assert_called_once_with( + local_logits, seq_dim=1, trim=True + ) + + # --------------------------------------------------------------------------- # chunk_average_log_probs # --------------------------------------------------------------------------- diff --git a/tests/unit/models/automodel/test_automodel_checkpoint.py b/tests/unit/models/automodel/test_automodel_checkpoint.py index 45ab9cf0a2e..07c93aefdd5 100644 --- a/tests/unit/models/automodel/test_automodel_checkpoint.py +++ b/tests/unit/models/automodel/test_automodel_checkpoint.py @@ -656,6 +656,43 @@ def mock_meshes(self): return mock_dp_mesh, mock_tp_mesh + @patch("torch.distributed.get_rank") + @patch("nemo_rl.models.automodel.checkpoint.Checkpointer") + def test_save_passes_peft_config_only_to_save_model( + self, mock_checkpointer_cls, mock_get_rank, mock_meshes, mock_model + ): + """PEFT config is a save argument, not an Automodel config field.""" + mock_get_rank.return_value = 0 + mock_dp_mesh, mock_tp_mesh = mock_meshes + + mock_checkpointer = MagicMock() + mock_checkpointer_cls.return_value = mock_checkpointer + peft_config = MagicMock() + + manager = AutomodelCheckpointManager( + dp_mesh=mock_dp_mesh, + tp_mesh=mock_tp_mesh, + ) + manager.init_checkpointer() + + with TemporaryDirectory() as tmp_dir: + weights_path = os.path.join(tmp_dir, "weights") + manager.save_checkpoint( + model=mock_model, + weights_path=weights_path, + checkpointing_cfg={ + "enabled": True, + "peft_config": peft_config, + }, + ) + + mock_checkpointer.save_model.assert_called_once_with( + model=mock_model, + weights_path=weights_path, + peft_config=peft_config, + tokenizer=None, + ) + @patch("torch.distributed.get_rank") @patch("nemo_rl.models.automodel.checkpoint.Checkpointer") def test_save_model_only( diff --git a/tests/unit/models/automodel/test_automodel_context_parallel.py b/tests/unit/models/automodel/test_automodel_context_parallel.py index c242965c179..12f70e78c2f 100644 --- a/tests/unit/models/automodel/test_automodel_context_parallel.py +++ b/tests/unit/models/automodel/test_automodel_context_parallel.py @@ -14,17 +14,28 @@ """Contract tests for NeMo-RL's Automodel context-parallel integration.""" +import os from contextlib import nullcontext +from datetime import timedelta from unittest.mock import MagicMock, patch import pytest import torch +import torch.distributed as dist +import torch.multiprocessing as mp +from torch.distributed.device_mesh import init_device_mesh try: import nemo_automodel # noqa: F401 except ImportError: pytest.skip("nemo_automodel not available", allow_module_level=True) +from nemo_automodel.components.distributed.context_parallel.sharder import ( + ContextParallelSharder, + ShardLayout, + round_robin_local_indices, + shard_batch_identity, +) from nemo_rl.algorithms.loss.interfaces import LossInputType from nemo_rl.distributed.batched_data_dict import BatchedDataDict from nemo_rl.distributed.model_utils import ( @@ -35,10 +46,98 @@ from nemo_rl.models.automodel.train import ( FullLogitsPostProcessor, LossPostProcessor, + _cp_gather_logits, prepare_model_forward, ) +def _has_gloo() -> bool: + return dist.is_available() and dist.is_gloo_available() + + +def _real_cp_sharder_worker(rank: int, world_size: int, init_file: str) -> None: + """Exercise the real token gather and its autograd fanout on two ranks.""" + os.environ["RANK"] = str(rank) + os.environ["WORLD_SIZE"] = str(world_size) + dist.init_process_group( + backend="gloo", + init_method=f"file://{init_file}", + rank=rank, + world_size=world_size, + timeout=timedelta(seconds=30), + ) + try: + device_mesh = init_device_mesh("cpu", (world_size,), mesh_dim_names=("cp",)) + sharder = ContextParallelSharder( + device_mesh=device_mesh, + shard_batch=shard_batch_identity, + local_token_global_indices=round_robin_local_indices, + shard_layout=ShardLayout(original_seq_len=6, padded_seq_len=8), + ) + + full_logits = torch.arange(18, dtype=torch.float32).reshape(1, 6, 3) + cp1_grad = torch.ones_like(full_logits) + expected_local_grad = sharder.shard_token_tensor(cp1_grad, seq_dim=1, fill=0.0) + + local_logits = sharder.shard_token_tensor( + full_logits, seq_dim=1, fill=0.0 + ).detach() + local_logits.requires_grad_(True) + gathered_logits = _cp_gather_logits(local_logits, sharder) + + # The sharder pads 6 -> 8 for the round-robin CP layout, then the real + # collective restores canonical order and trims back to the CP1 shape. + torch.testing.assert_close(gathered_logits, full_logits) + gathered_logits.sum().backward() + + # Every CP rank consumes the gathered loss, so differentiable + # all_gather sums one identical contribution per rank. Pad slots are + # trimmed from the loss and therefore retain zero gradient. + torch.testing.assert_close(local_logits.grad, expected_local_grad * world_size) + + normalized_local_logits = sharder.shard_token_tensor( + full_logits, seq_dim=1, fill=0.0 + ).detach() + normalized_local_logits.requires_grad_(True) + normalized_gathered_logits = _cp_gather_logits(normalized_local_logits, sharder) + processor = LossPostProcessor( + loss_fn=MagicMock(input_type=LossInputType.LOGIT), + cfg={}, + cp_mesh=device_mesh["cp"], + cp_size=world_size, + dp_size=1, + ) + (normalized_gathered_logits.sum() / processor.cp_gradient_fanout).backward() + torch.testing.assert_close(normalized_local_logits.grad, expected_local_grad) + finally: + if dist.is_initialized(): + dist.destroy_process_group() + + +@pytest.mark.automodel +@pytest.mark.skipif(not _has_gloo(), reason="gloo backend unavailable") +def test_real_cp_sharder_forward_and_gradient_fanout_parity(tmp_path) -> None: + ctx = mp.get_context("spawn") + processes = [ + ctx.Process( + target=_real_cp_sharder_worker, + args=(rank, 2, str(tmp_path / "cp-sharder-init")), + ) + for rank in range(2) + ] + for process in processes: + process.start() + for process in processes: + process.join(timeout=60) + if process.is_alive(): + for child in processes: + if child.is_alive(): + child.terminate() + child.join() + pytest.fail("two-rank Gloo CP sharder test timed out") + assert process.exitcode == 0 + + class _PermutationTokenLayout: """Small non-identity layout implementing Automodel's token verbs.""" @@ -248,6 +347,40 @@ def test_full_logits_postprocessor_emits_contiguous_cp_window() -> None: get_rank.assert_called_once_with(cp_group) +@pytest.mark.automodel +def test_full_logits_postprocessor_rejects_non_divisible_cp_sequence() -> None: + local_logits = torch.randn(1, 3, 4) + cp_mesh = MagicMock() + cp_sharder = MagicMock() + cp_sharder.gather_token_tensor.return_value = torch.randn(1, 5, 4) + processor = FullLogitsPostProcessor( + cfg={}, + cp_mesh=cp_mesh, + cp_size=2, + ) + + with pytest.raises( + ValueError, + match=( + "X-token teacher sequence length must be divisible by the teacher " + "context parallel size" + ), + ): + processor( + logits=local_logits, + data_dict=BatchedDataDict({}), + processed_inputs=MagicMock(), + original_batch_size=1, + original_seq_len=5, + cp_sharder=cp_sharder, + ) + + cp_sharder.gather_token_tensor.assert_called_once_with( + local_logits.float(), seq_dim=1, trim=True + ) + cp_mesh.get_group.assert_not_called() + + @pytest.mark.automodel @pytest.mark.parametrize( ("input_type", "expected_fanout"), @@ -256,7 +389,6 @@ def test_full_logits_postprocessor_emits_contiguous_cp_window() -> None: (LossInputType.LOGPROB, 2), (LossInputType.DISTILLATION, 2), (LossInputType.DISTILLATION_CROSS_TOKENIZER, 1), - (LossInputType.DRAFT, 1), ], ) def test_loss_cp_gradient_fanout_contract( @@ -272,3 +404,28 @@ def test_loss_cp_gradient_fanout_contract( ) assert processor.cp_gradient_fanout == expected_fanout + + +@pytest.mark.automodel +def test_loss_cp_rejects_unsupported_draft_input() -> None: + loss_fn = MagicMock(input_type=LossInputType.DRAFT) + processor = LossPostProcessor( + loss_fn=loss_fn, + cfg={}, + cp_mesh=None, + cp_size=2, + dp_size=1, + ) + + with pytest.raises( + NotImplementedError, + match=r"Loss input type LossInputType\.DRAFT is not supported", + ): + processor( + logits=torch.empty(0), + data_dict=BatchedDataDict({}), + processed_inputs=MagicMock(), + global_valid_seqs=torch.tensor(1), + global_valid_toks=torch.tensor(1), + cp_sharder=MagicMock(), + ) diff --git a/tests/unit/models/automodel/test_automodel_setup.py b/tests/unit/models/automodel/test_automodel_setup.py index 9c6ed0b9b95..9aba2d99fc7 100644 --- a/tests/unit/models/automodel/test_automodel_setup.py +++ b/tests/unit/models/automodel/test_automodel_setup.py @@ -15,7 +15,6 @@ """Unit tests for automodel setup utilities.""" import os -from datetime import timedelta from types import SimpleNamespace from unittest.mock import MagicMock, Mock, patch @@ -706,9 +705,7 @@ def test_setup_distributed_basic( result = setup_distributed(mock_config, mock_runtime_config) - mock_torch_dist.init_process_group.assert_called_once_with( - backend="nccl", timeout=timedelta(minutes=30) - ) + mock_torch_dist.init_process_group.assert_called_once_with(backend="nccl") assert isinstance(result, DistributedContext) assert result.device_mesh == mock_device_mesh assert result.moe_mesh == mock_moe_mesh @@ -755,7 +752,7 @@ def test_setup_distributed_with_cpu_offload( result = setup_distributed(mock_config, runtime_config) mock_torch_dist.init_process_group.assert_called_once_with( - backend="cuda:nccl,cpu:gloo", timeout=timedelta(minutes=30) + backend="cuda:nccl,cpu:gloo" ) assert isinstance(result, DistributedContext) diff --git a/tests/unit/models/automodel/test_automodel_train.py b/tests/unit/models/automodel/test_automodel_train.py index 99bc3bac026..9e6f423dfa7 100644 --- a/tests/unit/models/automodel/test_automodel_train.py +++ b/tests/unit/models/automodel/test_automodel_train.py @@ -1023,6 +1023,54 @@ def test_forward_with_score_post_processor( # Verify result shape assert result.shape == (batch_size,) + def test_forward_with_score_post_processor_rejects_cp( + self, + mock_model, + base_cfg, + ): + batch_size = 4 + seq_len = 64 + input_ids = torch.randint(0, 32000, (batch_size, seq_len)) + processed_inputs = ProcessedInputs( + input_ids=input_ids, + seq_len=seq_len, + attention_mask=torch.ones(batch_size, seq_len, dtype=torch.bool), + position_ids=torch.arange(seq_len).repeat(batch_size, 1), + flash_attn_kwargs={}, + vlm_kwargs={}, + ) + processed_mb = ProcessedMicrobatch( + data_dict=BatchedDataDict( + { + "input_ids": input_ids, + "input_lengths": torch.full((batch_size,), seq_len), + "sample_mask": torch.ones(batch_size, dtype=torch.bool), + } + ), + processed_inputs=processed_inputs, + original_batch_size=batch_size, + original_seq_len=seq_len, + ) + prepared = PreparedModelForward( + model_batch={"input_ids": input_ids}, + cp_size=2, + cp_sharder=MagicMock(), + model_context_factory=nullcontext, + ) + + with pytest.raises( + NotImplementedError, + match="ScorePostProcessor does not support context_parallel_size > 1", + ): + forward_with_post_processing_fn( + model=mock_model, + prepared=prepared, + post_processing_fn=ScorePostProcessor(cfg=base_cfg), + processed_mb=processed_mb, + ) + + mock_model.assert_not_called() + # ===================== # Test automodel_forward_backward @@ -1939,6 +1987,128 @@ def loss_fn(logits, data, global_valid_seqs, global_valid_toks): assert model.proj.weight.grad is not None assert len(results) == 1 + @pytest.mark.parametrize( + ("input_type", "expected_scale"), + [ + (LossInputType.LOGIT, 3.0), + (LossInputType.LOGPROB, 3.0), + (LossInputType.DISTILLATION, 3.0), + (LossInputType.DISTILLATION_CROSS_TOKENIZER, 6.0), + ], + ) + @patch("nemo_rl.models.automodel.train.prepare_loss_input") + @patch("nemo_rl.models.automodel.train.prepare_model_forward") + def test_gradient_scale_follows_cp_fanout_contract( + self, + mock_prepare_model_forward: MagicMock, + mock_prepare_loss_input: MagicMock, + input_type: LossInputType, + expected_scale: float, + base_cfg: dict[str, Any], + mock_device_mesh: MagicMock, + mock_cp_mesh: MagicMock, + ) -> None: + """Backward applies DP and CP scaling exactly once for each CP contract.""" + + def fake_prepare_loss_input( + logits: torch.Tensor, + data_dict: BatchedDataDict[Any], + _loss_fn: Any, + **_kwargs: Any, + ) -> tuple[dict[str, torch.Tensor], BatchedDataDict[Any]]: + return {"logits": logits}, data_dict + + mock_prepare_loss_input.side_effect = fake_prepare_loss_input + + class ScaleModel(torch.nn.Module): + def __init__(self) -> None: + super().__init__() + self.weight = torch.nn.Parameter(torch.tensor(1.0)) + + def forward(self, input_ids: torch.Tensor, **_kwargs: Any) -> MagicMock: + logits = self.weight * torch.ones_like( + input_ids, dtype=self.weight.dtype + ) + return MagicMock(logits=logits) + + def run(*, cp_size: int, dp_size: int) -> torch.Tensor: + model = ScaleModel() + loss_fn = MagicMock(input_type=input_type) + + def compute_loss( + *, + logits: torch.Tensor, + data: BatchedDataDict[Any], + global_valid_seqs: torch.Tensor, + global_valid_toks: torch.Tensor, + ) -> tuple[torch.Tensor, dict[str, float]]: + del data, global_valid_seqs, global_valid_toks + loss = logits.mean() + return loss, {"loss": loss.item()} + + loss_fn.side_effect = compute_loss + loss_post_processor = LossPostProcessor( + loss_fn=loss_fn, + cfg=base_cfg, + cp_mesh=mock_cp_mesh, + cp_size=cp_size, + dp_size=dp_size, + ) + + input_ids = torch.zeros((1, 4), dtype=torch.long) + processed_inputs = ProcessedInputs( + input_ids=input_ids, + seq_len=4, + attention_mask=torch.ones((1, 4), dtype=torch.bool), + position_ids=torch.arange(4).unsqueeze(0), + flash_attn_kwargs={}, + vlm_kwargs={}, + ) + processed_mb = ProcessedMicrobatch( + data_dict=BatchedDataDict( + { + "input_ids": input_ids, + "input_lengths": torch.tensor([4]), + "sample_mask": torch.ones(1, dtype=torch.bool), + } + ), + processed_inputs=processed_inputs, + original_batch_size=1, + original_seq_len=4, + ) + + # Keep model preparation at CP1 so this test isolates the backward + # scale from sharder collectives. The LossPostProcessor and training + # loop still use the requested CP/DP sizes and execute real autograd. + mock_prepare_model_forward.return_value = PreparedModelForward( + model_batch={"input_ids": input_ids}, + cp_size=1, + cp_sharder=None, + model_context_factory=nullcontext, + ) + + automodel_forward_backward( + model=model, + data_iterator=iter([processed_mb]), + post_processing_fn=loss_post_processor, + device_mesh=mock_device_mesh, + padding_token_id=0, + autocast_context_factory=nullcontext, + forward_only=False, + global_valid_seqs=torch.tensor(1), + global_valid_toks=torch.tensor(4), + dp_size=dp_size, + cp_size=cp_size, + ) + + assert model.weight.grad is not None + return model.weight.grad.clone() + + baseline_grad = run(cp_size=1, dp_size=1) + scaled_grad = run(cp_size=2, dp_size=3) + + torch.testing.assert_close(scaled_grad, baseline_grad * expected_scale) + # ===================== # Test aggregate_training_statistics diff --git a/tests/unit/models/generation/sglang/test_utils_smoke.py b/tests/unit/models/generation/sglang/test_utils_smoke.py index f7a1afddfbc..bc9c6957d22 100644 --- a/tests/unit/models/generation/sglang/test_utils_smoke.py +++ b/tests/unit/models/generation/sglang/test_utils_smoke.py @@ -81,7 +81,7 @@ def test_reduce_tensor_modified_preserves_cpu_reduction(monkeypatch): monkeypatch.setattr( reductions, "_reduce_tensor_original", - reductions.reduce_tensor, + getattr(reductions, "_reduce_tensor_original", reductions.reduce_tensor), raising=False, ) diff --git a/tests/unit/models/value/test_dtensor_value_worker.py b/tests/unit/models/value/test_dtensor_value_worker.py index 86de9f1c718..5ca4129652f 100644 --- a/tests/unit/models/value/test_dtensor_value_worker.py +++ b/tests/unit/models/value/test_dtensor_value_worker.py @@ -32,6 +32,7 @@ import os from pathlib import Path from typing import Any +from unittest.mock import MagicMock import pytest import ray @@ -167,6 +168,29 @@ def _create_value_test_config( } +def test_value_worker_init_rejects_cp_scoring_before_setup(monkeypatch): + from nemo_rl.models.value.workers import dtensor_value_worker_v2 + + config = _create_value_test_config(model_name="unused", cp=2) + apply_transformer_engine_patch = MagicMock() + monkeypatch.setattr( + dtensor_value_worker_v2, + "apply_transformer_engine_patch", + apply_transformer_engine_patch, + ) + + with pytest.raises( + NotImplementedError, + match=r"get_values\(\) scoring path does not support context parallelism", + ): + dtensor_value_worker_v2.DTensorValueWorkerV2Impl( + config=config, + tokenizer=MagicMock(), + ) + + apply_transformer_engine_patch.assert_not_called() + + def _make_checkpointing_cfg(checkpoint_dir) -> dict: """Build a minimal `CheckpointingConfig` for DTensor V2 ``save_checkpoint``.""" return { From d57c7106befb465e540bfaca13129adf870e5bb6 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Mon, 24 Aug 2026 02:53:51 -0700 Subject: [PATCH 27/34] build: bump Automodel r0.6.0 Signed-off-by: larkzhang-nv --- 3rdparty/Automodel-workspace/Automodel | 2 +- uv.lock | 635 +++++++++++++------------ 2 files changed, 330 insertions(+), 307 deletions(-) diff --git a/3rdparty/Automodel-workspace/Automodel b/3rdparty/Automodel-workspace/Automodel index 7e9493d7dde..94387e4318b 160000 --- a/3rdparty/Automodel-workspace/Automodel +++ b/3rdparty/Automodel-workspace/Automodel @@ -1 +1 @@ -Subproject commit 7e9493d7dde987cc753caf10737ef785e71f3d8c +Subproject commit 94387e4318bfd04cb21ff57782061864e0c7bcec diff --git a/uv.lock b/uv.lock index 6a5914ccb32..e68f5373d48 100644 --- a/uv.lock +++ b/uv.lock @@ -60,6 +60,27 @@ conflicts = [[ ], [ { package = "nemo-rl", extra = "mcore" }, { package = "nemo-rl", extra = "trtllm" }, +], [ + { package = "nemo-rl", extra = "fsdp" }, + { package = "nemo-rl", extra = "trtllm" }, +], [ + { package = "nemo-rl", extra = "modelopt" }, + { package = "nemo-rl", extra = "trtllm" }, +], [ + { package = "nemo-rl", extra = "nvrx" }, + { package = "nemo-rl", extra = "trtllm" }, +], [ + { package = "nemo-rl", extra = "nemo-gym" }, + { package = "nemo-rl", extra = "trtllm" }, +], [ + { package = "nemo-rl", extra = "modelopt" }, + { package = "nemo-rl", extra = "sglang" }, +], [ + { package = "nemo-rl", extra = "nvrx" }, + { package = "nemo-rl", extra = "sglang" }, +], [ + { package = "nemo-rl", extra = "nemo-gym" }, + { package = "nemo-rl", extra = "sglang" }, ]] [manifest] @@ -78,6 +99,7 @@ constraints = [ { name = "dulwich", specifier = ">=1.2.5" }, { name = "emerging-optimizers", git = "https://github.com/NVIDIA-NeMo/Emerging-Optimizers.git?rev=v0.2.0" }, { name = "fast-hadamard-transform", git = "https://github.com/Dao-AILab/fast-hadamard-transform.git?rev=f134af63deb2df17e1171a9ec1ea4a7d8604d5ca" }, + { name = "megatron-fsdp", git = "https://github.com/yuhezhang-ai/Megatron-LM.git?subdirectory=megatron%2Fcore%2Fdistributed%2Ffsdp%2Fsrc&rev=455389c480af6b3acdca74c7830c68b3274eb083" }, { name = "onnx", specifier = ">=1.21.0rc4" }, { name = "opencv-python-headless", specifier = ">=5.0.0" }, { name = "orjson", specifier = ">=3.11.6" }, @@ -93,7 +115,7 @@ constraints = [ { name = "wheel", specifier = ">=0.46.2" }, ] overrides = [ - { name = "apache-tvm-ffi", specifier = ">=0.1.9" }, + { name = "apache-tvm-ffi", specifier = "==0.1.11" }, { name = "av", marker = "sys_platform == 'never'" }, { name = "decord2", marker = "sys_platform == 'never'" }, { name = "deep-ep", marker = "platform_machine == 'aarch64'", git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, @@ -442,17 +464,17 @@ wheels = [ [[package]] name = "apache-tvm-ffi" -version = "0.1.9" +version = "0.1.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/60/1e787a0b5ebf318483235be2a689ee367173983067e441b8379564f667c0/apache_tvm_ffi-0.1.9.tar.gz", hash = "sha256:d2d402587e8906de0a07f4746aa78f3d452c7efe3625d4bb39ac2ad693bce530", size = 2513731, upload-time = "2026-02-27T19:28:06.602Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/3d/4b9226cd45aa800a6904603dda9b323d728f3c3869952a673f3483b78b19/apache_tvm_ffi-0.1.11.tar.gz", hash = "sha256:153cd2c5a9717804cb0bcd9b2709f22a1e5f80ed05b5a490faf5949b136eedba", size = 2798354, upload-time = "2026-05-04T17:48:43.852Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c0/6d3d54f50012255b41bc3e24944c086f63c4707c8686c7c6780e9283eb96/apache_tvm_ffi-0.1.9-cp312-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d503029e66c43b1a1cb1a42a1e9bb428c8a28dcbdec31c28e705472ca648a3a", size = 2203712, upload-time = "2026-02-27T19:27:25.867Z" }, - { url = "https://files.pythonhosted.org/packages/c6/dd/2bab4c6cd86257dbf99e93452a1af833113f8dc3e25a25579f6e4e4c8a94/apache_tvm_ffi-0.1.9-cp312-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28241371934ea8af10d5067087ba1229ebddded7b2c02d33a258ec2a96df8c46", size = 2299704, upload-time = "2026-02-27T19:27:27.477Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4a/b469bcb2e1014cb84d336d2a59f42958a058251c577a4c2680cacad346e2/apache_tvm_ffi-0.1.9-cp312-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:87cacce81df55685fc6a76e1e3c5db1200e85e87bf5974b692c59d131b7bc622", size = 2130865, upload-time = "2026-02-27T19:27:29.092Z" }, - { url = "https://files.pythonhosted.org/packages/70/ef/5402da5d37f5270fd88ea0348acca78dba9be8bdbf6c2bcae0935eb03ef1/apache_tvm_ffi-0.1.9-cp312-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f45eb43499acac45ff6c93564f0ff2d3ca27b69656d540fd56ce59d51c0b4c65", size = 2278991, upload-time = "2026-02-27T19:27:30.729Z" }, + { url = "https://files.pythonhosted.org/packages/2a/a9/f48e5dd4ae1f6f0c5ffac259c0a9531b7d6a7c0a4c45bc2229d55de6adf8/apache_tvm_ffi-0.1.11-cp312-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:da2c8d07fdc737d1ba75f4de25c29f156905b9dc980f1da90c395b4db525f522", size = 2605176, upload-time = "2026-05-04T17:47:59.676Z" }, + { url = "https://files.pythonhosted.org/packages/36/99/2848df4e8ed5bf51df1d286d1718510584fa61e88adbc9c5b23d71b38f7c/apache_tvm_ffi-0.1.11-cp312-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:78aa1857b04a2ea718317041ab3f01288b3d496e6036eb1b99ebdc9da0fdaef5", size = 2725887, upload-time = "2026-05-04T17:48:01.381Z" }, + { url = "https://files.pythonhosted.org/packages/7d/80/963c991934a4eb0fa0c0178f51963333fe14a96b732009da642b6bf6b42e/apache_tvm_ffi-0.1.11-cp312-abi3-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a8b845c8dff498fb981c1dda36c954549204191b485a385845e604966594d0b2", size = 2513121, upload-time = "2026-05-04T17:48:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/4d/18/95569107ee83619d61a3bb0d28743a0599f85c5161981e3e098c82c2b185/apache_tvm_ffi-0.1.11-cp312-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2843f084cdc94dedacd8b257a395a2b71b8a3dc7fc99711b148bf1d161983128", size = 2697683, upload-time = "2026-05-04T17:48:05.222Z" }, ] [[package]] @@ -718,9 +740,9 @@ name = "causal-conv1d" version = "1.5.4" source = { git = "https://github.com/Dao-AILab/causal-conv1d?rev=4f6ae4e26ae5fe8af9372f8d312ab25cc4595223#4f6ae4e26ae5fe8af9372f8d312ab25cc4595223" } dependencies = [ - { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, ] [[package]] @@ -749,7 +771,7 @@ name = "cffi" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } wheels = [ @@ -846,7 +868,7 @@ version = "3.58.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dulwich" }, - { name = "everett", extra = ["ini"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "everett", extra = ["ini"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "jsonschema" }, { name = "psutil" }, { name = "python-box" }, @@ -878,7 +900,7 @@ dependencies = [ { name = "loguru" }, { name = "pydantic" }, { name = "torch" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/2c/9e/d7f18bd9a0354088abc11a0c1f2c7698f7c49e5a709faedf6a46e388f693/compressed_tensors-0.17.0.tar.gz", hash = "sha256:15c20d06bdbcf35b51fc99fd125e7b9be1e1855567c33b7a46dfac26ad6fb126", size = 257091, upload-time = "2026-06-03T16:49:17.208Z" } wheels = [ @@ -950,7 +972,7 @@ name = "cryptography" version = "48.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/12/45/870e7f4bef50e5f53b9f51d4428aee5290eedf58ba443f16b1ebb7ab8e66/cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a", size = 832989, upload-time = "2026-06-09T22:32:31.8Z" } wheels = [ @@ -1784,11 +1806,11 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "einops", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "ninja", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "einops", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ninja", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] wheels = [ { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl", hash = "sha256:9fdfbdf2d4ca984ffa34518a4054c62c295fa06e184d7a233848dc06be8f1ec2" }, @@ -1811,11 +1833,11 @@ resolution-markers = [ "platform_machine == 'x86_64' and sys_platform == 'linux'", ] dependencies = [ - { name = "einops", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "ninja", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "einops", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ninja", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] wheels = [ { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl", hash = "sha256:a14fea157eb61dfee56f605a24a7a6150704517759125b3942dd04bffa05d6cf" }, @@ -1880,8 +1902,7 @@ version = "0.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fla-core" }, - { name = "transformers", version = "5.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/4c/e8/8f115be585a046795e4a1f7ade727889219bb66b8d96cc668b8c9e437c0e/flash_linear_attention-0.5.1.tar.gz", hash = "sha256:8840fd4c37de8b0612dc8fd493867f3d330672ba2f17c024a2ce37239634e247", size = 221733, upload-time = "2026-06-18T18:17:16.661Z" } wheels = [ @@ -2020,13 +2041,13 @@ resolution-markers = [ dependencies = [ { name = "apache-tvm-ffi" }, { name = "click" }, - { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "einops" }, { name = "ninja" }, { name = "numpy" }, { name = "nvidia-cudnn-frontend" }, - { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "nvidia-ml-py" }, { name = "packaging" }, { name = "requests" }, @@ -2050,7 +2071,7 @@ resolution-markers = [ dependencies = [ { name = "apache-tvm-ffi" }, { name = "click" }, - { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "einops" }, { name = "ninja" }, { name = "numpy" }, @@ -2099,7 +2120,7 @@ wheels = [ [package.optional-dependencies] cu13 = [ - { name = "nvidia-cutlass-dsl", version = "4.6.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.6.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] [[package]] @@ -2272,8 +2293,8 @@ dependencies = [ { name = "google-auth" }, { name = "googleapis-common-protos" }, { name = "proto-plus" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/03/33/00277be1305fd68355d08197f05e22db259c0cff49a10c8590a1869ade9b/google_api_core-2.32.0.tar.gz", hash = "sha256:2b33aad226b19272458c46abfe5c5a38d9531ece0c44502129a1463ce83674ac", size = 177659, upload-time = "2026-07-16T20:36:07.717Z" } @@ -2299,8 +2320,8 @@ name = "googleapis-common-protos" version = "1.75.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } wheels = [ @@ -2414,9 +2435,9 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "grpcio", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/b3/1c5951352d6777fd7f99a0ccee04617fdfd8a5dbf2918a1f58c8b2b280b8/grpcio_tools-1.81.1.tar.gz", hash = "sha256:a22a3870180927fdd84e2b27d079ef5b7f5f8c6110181b6736afc17a463481f1", size = 6236155, upload-time = "2026-06-11T12:51:21.235Z" } wheels = [ @@ -2435,9 +2456,9 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4c/ca/af008a0df6f9ec85ae136f763aed207e68097c952a17443d2c2af9d60a91/grpcio_tools-1.82.1.tar.gz", hash = "sha256:2bd3176ccdbf7cd1f463eb75b7b83544c7d6429f5ca8a0f7f784b76097dac891", size = 6399590, upload-time = "2026-07-08T12:38:15.186Z" } wheels = [ @@ -2726,9 +2747,9 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "antlr4-python3-runtime", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "omegaconf", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "antlr4-python3-runtime", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "omegaconf", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/8e/07e42bc434a847154083b315779b0a81d567154504624e181caf2c71cd98/hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824", size = 3263494, upload-time = "2023-02-23T18:33:43.03Z" } wheels = [ @@ -3185,10 +3206,10 @@ name = "mamba-ssm" version = "2.2.6.post3" source = { git = "https://github.com/state-spaces/mamba.git?rev=a14b1dff0454a3bc27d9eb31355dc01e4b2490ec#a14b1dff0454a3bc27d9eb31355dc01e4b2490ec" } dependencies = [ - { name = "causal-conv1d", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "causal-conv1d", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, ] [[package]] @@ -3336,7 +3357,7 @@ dependencies = [ { name = "flashinfer-cubin", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-python", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" } }, - { name = "megatron-core", extra = ["dev", "mlm"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-core", extra = ["dev", "mlm"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mistral-common" }, { name = "mlflow" }, { name = "nvidia-resiliency-ext" }, @@ -3352,7 +3373,7 @@ dependencies = [ { name = "timm" }, { name = "torch" }, { name = "tqdm" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, { name = "typing-extensions" }, { name = "wandb" }, ] @@ -3364,7 +3385,7 @@ ssm = [ { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" } }, ] te = [ - { name = "megatron-core", extra = ["te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-core", extra = ["te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.metadata] @@ -3469,18 +3490,18 @@ dev = [ { name = "einops" }, { name = "emerging-optimizers" }, { name = "fast-hadamard-transform" }, - { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-linear-attention" }, { name = "flashinfer-python", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "hypercorn" }, - { name = "megatron-energon", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-energon", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "multi-storage-client" }, { name = "nemo-lens" }, { name = "nvidia-cudnn-frontend" }, - { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-resiliency-ext" }, { name = "onnxscript" }, - { name = "openai", extra = ["aiohttp"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "openai", extra = ["aiohttp"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "opentelemetry-api" }, { name = "orjson" }, { name = "quart" }, @@ -3495,11 +3516,11 @@ mlm = [ { name = "omegaconf" }, { name = "sentencepiece" }, { name = "tiktoken" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, { name = "wandb" }, ] te = [ - { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.metadata] @@ -3633,16 +3654,12 @@ wheels = [ [[package]] name = "megatron-fsdp" version = "0.5.0" -source = { registry = "https://pypi.org/simple" } +source = { git = "https://github.com/yuhezhang-ai/Megatron-LM.git?subdirectory=megatron%2Fcore%2Fdistributed%2Ffsdp%2Fsrc&rev=455389c480af6b3acdca74c7830c68b3274eb083#455389c480af6b3acdca74c7830c68b3274eb083" } dependencies = [ { name = "einops" }, { name = "packaging" }, { name = "torch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0f/b5/7d347b3dc00f06f98a4d2767e05fbd1cd4fbb181c6e25a5a0de118c3717a/megatron_fsdp-0.5.0.tar.gz", hash = "sha256:345a470620430a479e172a8dabda34bfa9f737f7aeec63e41f50f5b248cf9adc", size = 106239, upload-time = "2026-06-23T00:15:41.461Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/9b/9da4ede7fc8268386657356764b5af0b0389df239ba0d326a0f6711f395b/megatron_fsdp-0.5.0-py3-none-any.whl", hash = "sha256:e45474f048eb634a8a0b52989e2edfc104893ad21671c66d8e7fbd720964b962", size = 106576, upload-time = "2026-06-23T00:15:40.019Z" }, -] [[package]] name = "mfusepy" @@ -3662,7 +3679,7 @@ dependencies = [ { name = "numpy" }, { name = "pillow" }, { name = "pydantic" }, - { name = "pydantic-extra-types", extra = ["pycountry"] }, + { name = "pydantic-extra-types", extra = ["pycountry"], marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-sglang' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm'" }, { name = "requests" }, { name = "tiktoken" }, { name = "typing-extensions" }, @@ -3745,8 +3762,8 @@ dependencies = [ { name = "opentelemetry-proto" }, { name = "opentelemetry-sdk" }, { name = "packaging" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "pydantic" }, { name = "python-dotenv" }, { name = "pyyaml" }, @@ -3772,8 +3789,8 @@ dependencies = [ { name = "opentelemetry-proto" }, { name = "opentelemetry-sdk" }, { name = "packaging" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "pydantic" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/a6/76964d8f265be984838a13b77656b047686c492b61b3f46ca2ef29ef7325/mlflow_tracing-3.15.1.tar.gz", hash = "sha256:ba1c4d873151c0ceeab37f53daf0997feea18a1c092358995072dc53e1944a29", size = 1501188, upload-time = "2026-08-03T09:26:15.541Z" } @@ -3786,7 +3803,7 @@ name = "model-hosting-container-standards" version = "0.1.16" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fastapi", extra = ["standard"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "httpx" }, { name = "jmespath" }, { name = "pydantic" }, @@ -3955,7 +3972,7 @@ version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, - { name = "librt", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, @@ -4025,93 +4042,112 @@ dependencies = [ { name = "datasets" }, { name = "flashoptim" }, { name = "megatron-fsdp" }, - { name = "mistral-common", extra = ["audio", "hf-hub", "sentencepiece"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", extra = ["audio", "hf-hub", "sentencepiece"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mlflow" }, { name = "pybind11" }, { name = "pyyaml" }, + { name = "quack-kernels", version = "0.6.1", source = { registry = "https://pypi.org/simple" } }, { name = "tiktoken" }, { name = "torch" }, { name = "torchao", version = "0.17.0", source = { registry = "https://pypi.org/simple" } }, { name = "torchdata" }, - { name = "transformers", version = "5.5.0", source = { registry = "https://pypi.org/simple" } }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, { name = "wandb" }, ] [package.optional-dependencies] moe = [ + { name = "apache-tvm-ffi" }, { name = "causal-conv1d" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-linear-attention" }, { name = "mamba-ssm" }, { name = "nv-grouped-gemm" }, { name = "onnxscript" }, - { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tile-kernels" }, + { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" } }, + { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.metadata] requires-dist = [ - { name = "albumentations", marker = "extra == 'vlm'" }, + { name = "albumentations", marker = "extra == 'vlm-media'" }, + { name = "apache-tvm-ffi", marker = "extra == 'cuda'", specifier = "<=0.1.11" }, + { name = "av", marker = "extra == 'diffusion-media'" }, { name = "backoff", marker = "extra == 'vlm'" }, { name = "bitsandbytes", marker = "extra == 'cuda-source'" }, + { name = "boto3", marker = "extra == 's3'", specifier = ">=1.34" }, { name = "causal-conv1d", marker = "extra == 'cuda'" }, - { name = "databricks-sql-connector", marker = "extra == 'delta-databricks'", specifier = ">=3.0.0" }, + { name = "databricks-sql-connector", marker = "extra == 'delta-databricks'", specifier = ">=4.4.0" }, { name = "datasets", specifier = ">=4.0.0" }, + { name = "decord", marker = "platform_machine == 'x86_64' and sys_platform != 'darwin' and extra == 'vlm-media'" }, { name = "deep-ep", marker = "extra == 'moe'", git = "https://github.com/deepseek-ai/DeepEP.git?rev=7febc6e25660af0f54d95dd781ecdcd62265ecca" }, { name = "deltalake", marker = "extra == 'delta-databricks'", specifier = ">=1.0.0" }, - { name = "diffusers", marker = "extra == 'diffusion'", specifier = ">=0.37.0" }, + { name = "diffusers", marker = "extra == 'diffusion'", specifier = ">=0.39.0" }, + { name = "ffpa-attn", marker = "extra == 'ffpa'", specifier = ">=0.2.2" }, { name = "flash-attn", marker = "extra == 'fa'", specifier = "<=2.8.3" }, { name = "flash-linear-attention", marker = "extra == 'fla'", specifier = ">=0.4.2" }, { name = "flashoptim", specifier = ">=0.1.3" }, { name = "ftfy", marker = "extra == 'diffusion'" }, { name = "imageio", marker = "extra == 'diffusion'" }, - { name = "imageio-ffmpeg", marker = "extra == 'diffusion'" }, + { name = "imageio-ffmpeg", marker = "extra == 'diffusion-media'" }, { name = "kernels", marker = "extra == 'diffusion-kernels'" }, { name = "mamba-ssm", marker = "extra == 'cuda'" }, - { name = "megatron-fsdp", specifier = ">=0.2.3" }, - { name = "mistral-common", extras = ["audio", "hf-hub", "image", "sentencepiece"] }, - { name = "mistral-common", extras = ["opencv"], marker = "extra == 'vlm'", specifier = ">=1.11.0" }, + { name = "megatron-fsdp", git = "https://github.com/yuhezhang-ai/Megatron-LM.git?subdirectory=megatron%2Fcore%2Fdistributed%2Ffsdp%2Fsrc&rev=455389c480af6b3acdca74c7830c68b3274eb083" }, + { name = "mistral-common", marker = "extra == 'vlm'", specifier = ">=1.11.0" }, + { name = "mistral-common", extras = ["audio", "hf-hub", "sentencepiece"] }, { name = "mlflow" }, + { name = "multi-storage-client", marker = "extra == 'msc'", specifier = ">=0.13" }, + { name = "nemo-automodel", extras = ["cli"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["cuda"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["cuda"], marker = "extra == 'moe'" }, { name = "nemo-automodel", extras = ["delta-databricks"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["diffusion"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["diffusion"], marker = "extra == 'diffusion-kernels'" }, + { name = "nemo-automodel", extras = ["diffusion-media"], marker = "extra == 'media'" }, { name = "nemo-automodel", extras = ["extra"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["fla"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["fla"], marker = "extra == 'moe'" }, + { name = "nemo-automodel", extras = ["s3"], marker = "extra == 'all'" }, { name = "nemo-automodel", extras = ["vlm"], marker = "extra == 'all'" }, + { name = "nemo-automodel", extras = ["vlm-media"], marker = "extra == 'media'" }, + { name = "nemo-run", marker = "extra == 'cli'" }, { name = "numba", marker = "extra == 'vlm'" }, { name = "numpy", marker = "extra == 'vlm'" }, { name = "nv-grouped-gemm", marker = "extra == 'cuda'" }, + { name = "nvidia-cutlass-dsl", marker = "extra == 'ffpa'", specifier = "==4.6.0" }, { name = "onnxscript", marker = "extra == 'cuda'", specifier = ">=0.5.6" }, { name = "open-clip-torch", marker = "extra == 'vlm'" }, - { name = "opencv-python-headless", specifier = "==4.10.0.84" }, - { name = "opencv-python-headless", marker = "extra == 'diffusion'" }, + { name = "opencv-python-headless", marker = "extra == 'diffusion-media'", specifier = "==4.10.0.84" }, + { name = "opencv-python-headless", marker = "extra == 'vlm-media'", specifier = "==4.10.0.84" }, { name = "perceptron", marker = "extra == 'extra'" }, { name = "pillow", marker = "extra == 'vlm'" }, { name = "pybind11" }, { name = "pyyaml" }, { name = "pyyaml", marker = "extra == 'cli'" }, - { name = "qwen-omni-utils", marker = "extra == 'vlm'" }, - { name = "qwen-vl-utils", extras = ["decord"], marker = "platform_machine == 'x86_64' and sys_platform != 'darwin' and extra == 'vlm'" }, + { name = "quack-kernels", marker = "sys_platform == 'linux'", specifier = "==0.6.1" }, + { name = "qwen-omni-utils", marker = "extra == 'vlm-media'" }, + { name = "qwen-vl-utils", marker = "extra == 'vlm-media'" }, { name = "sentencepiece", marker = "extra == 'extra'" }, + { name = "soundfile", marker = "extra == 'vlm'" }, { name = "tiktoken" }, + { name = "tile-kernels", marker = "extra == 'cuda'", specifier = "==1.0.0" }, + { name = "tilelang", marker = "extra == 'cuda'", specifier = ">=0.1.11" }, { name = "timm", marker = "extra == 'vlm'", specifier = "<=1.0.22" }, { name = "torch", marker = "sys_platform != 'darwin' and sys_platform != 'linux'", specifier = ">=2.6.0", index = "https://download.pytorch.org/whl/cpu" }, { name = "torch", marker = "sys_platform == 'darwin'", specifier = ">=2.6.0", index = "https://pypi.org/simple" }, - { name = "torch", marker = "sys_platform == 'linux'", specifier = ">=2.6.0", index = "https://download.pytorch.org/whl/cu129" }, + { name = "torch", marker = "sys_platform == 'linux'", specifier = ">=2.6.0", index = "https://download.pytorch.org/whl/cu130" }, { name = "torchao" }, - { name = "torchcodec", marker = "platform_machine == 'x86_64' and sys_platform != 'darwin' and extra == 'vlm'" }, { name = "torchdata" }, { name = "torchvision", marker = "sys_platform == 'darwin' and extra == 'diffusion'", index = "https://pypi.org/simple" }, { name = "torchvision", marker = "sys_platform != 'darwin' and sys_platform != 'linux' and extra == 'diffusion'", index = "https://download.pytorch.org/whl/cpu" }, - { name = "torchvision", marker = "sys_platform == 'linux' and extra == 'diffusion'", index = "https://download.pytorch.org/whl/cu129" }, - { name = "transformer-engine", extras = ["pytorch"], marker = "extra == 'cuda'", specifier = "<=2.11.0" }, - { name = "transformers", specifier = "==5.5.0" }, - { name = "wandb" }, + { name = "torchvision", marker = "sys_platform == 'linux' and extra == 'diffusion'", index = "https://download.pytorch.org/whl/cu130" }, + { name = "transformer-engine", extras = ["pytorch"], marker = "extra == 'cuda'", specifier = ">=2.14.1" }, + { name = "transformers", specifier = "==5.12.1" }, + { name = "wandb", specifier = ">=0.28.0" }, ] -provides-extras = ["diffusion", "diffusion-kernels", "cuda", "cuda-source", "extra", "fa", "fla", "delta-databricks", "moe", "vlm", "cli", "all"] +provides-extras = ["diffusion", "diffusion-kernels", "cuda", "cuda-source", "extra", "fa", "ffpa", "fla", "delta-databricks", "moe", "vlm", "cli", "s3", "msc", "vlm-media", "diffusion-media", "media", "all"] [package.metadata.requires-dev] build = [ @@ -4120,7 +4156,7 @@ build = [ { name = "setuptools" }, { name = "torch", marker = "sys_platform != 'darwin' and sys_platform != 'linux'", specifier = "<=2.10.0", index = "https://download.pytorch.org/whl/cpu" }, { name = "torch", marker = "sys_platform == 'darwin'", specifier = "<=2.10.0", index = "https://pypi.org/simple" }, - { name = "torch", marker = "sys_platform == 'linux'", specifier = "<=2.10.0", index = "https://download.pytorch.org/whl/cu129" }, + { name = "torch", marker = "sys_platform == 'linux'", specifier = "<=2.10.0", index = "https://download.pytorch.org/whl/cu130" }, ] dev = [ { name = "cut-cross-entropy", git = "https://github.com/apple/ml-cross-entropy.git?rev=87a86aba72cfd2f0d8abecaf81c13c4528ea07d8" }, @@ -4137,16 +4173,21 @@ docs = [ { name = "sphinx-design" }, ] linting = [ + { name = "bandit", specifier = "~=1.9.0" }, { name = "import-linter", specifier = "~=2.4" }, { name = "pre-commit", specifier = ">=4.2.0" }, { name = "ruff", specifier = "~=0.9.0" }, { name = "ty", specifier = ">=0.0.20" }, ] +magi = [{ name = "magi-attention", git = "https://github.com/SandAI-org/MagiAttention.git?rev=d7ea8afd44c790b65fab68a04a6a0fdd5adbf182" }] test = [ { name = "coverage" }, { name = "onnxruntime-gpu", marker = "platform_machine == 'x86_64' and sys_platform != 'darwin'", index = "https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/onnxruntime-cuda-13/pypi/simple/" }, { name = "peft", specifier = ">=0.18.1" }, { name = "pytest" }, + { name = "pytest-shard" }, + { name = "ruamel-yaml" }, + { name = "sentence-transformers", specifier = ">=5.6.0" }, ] [[package]] @@ -4160,7 +4201,7 @@ dependencies = [ { name = "fastapi", extra = ["standard"] }, { name = "fonttools" }, { name = "gitpython" }, - { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "hydra-core", version = "1.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "itsdangerous" }, { name = "mcp" }, @@ -4324,7 +4365,7 @@ dependencies = [ { name = "datasets" }, { name = "debugpy" }, { name = "fastokens-b10" }, - { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "hydra-core", version = "1.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "math-verify" }, { name = "matplotlib" }, @@ -4356,17 +4397,15 @@ dependencies = [ { name = "tensorboard" }, { name = "tensordict" }, { name = "tiktoken" }, - { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "timm" }, { name = "torch" }, { name = "torchdata" }, { name = "torchvision" }, { name = "transferqueue" }, - { name = "transformers", version = "5.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "triton" }, { name = "wandb" }, { name = "zstandard" }, @@ -4375,48 +4414,47 @@ dependencies = [ [package.optional-dependencies] automodel = [ { name = "causal-conv1d" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mamba-ssm" }, { name = "mistral-common" }, - { name = "nemo-automodel", extra = ["moe"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nemo-automodel", extra = ["moe"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nv-grouped-gemm" }, - { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, - { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.5.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] fsdp = [ { name = "causal-conv1d" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mamba-ssm" }, - { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] mcore = [ { name = "causal-conv1d" }, { name = "cupy-cuda13x" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-mla" }, { name = "flashinfer-cubin", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-jit-cache", version = "0.6.8.post1+cu130", source = { registry = "https://flashinfer.ai/whl/cu130" } }, { name = "flashinfer-python", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "mamba-ssm" }, - { name = "megatron-bridge", extra = ["ssm", "te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-bridge", extra = ["ssm", "te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvshmem4py-cu13" }, { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" } }, { name = "torch-memory-saver" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] modelopt = [ - { name = "nvidia-modelopt" }, + { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, ] nemo-gym = [ { name = "nemo-gym" }, @@ -4442,18 +4480,18 @@ trtllm = [ ] vllm = [ { name = "cuda-python" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "deep-gemm" }, { name = "flashinfer-cubin", version = "0.6.13", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-jit-cache", version = "0.6.13+cu130", source = { registry = "https://flashinfer.ai/whl/cu130" } }, { name = "flashinfer-python", version = "0.6.13", source = { registry = "https://pypi.org/simple" } }, { name = "num2words" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, - { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, + { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.dev-dependencies] @@ -4588,7 +4626,7 @@ requires-dist = [ { name = "tiktoken" }, { name = "tilelang", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')", specifier = ">=0.1.9,<0.1.12" }, { name = "tilelang", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'mcore') or (platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'mcore')", specifier = "==0.1.9" }, - { name = "tilelang", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'automodel'", specifier = "==0.1.9" }, + { name = "tilelang", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'automodel'", specifier = "==0.1.11" }, { name = "tilelang", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'fsdp'", specifier = "==0.1.9" }, { name = "tilelang", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'sglang'", specifier = "==0.1.11" }, { name = "tilelang", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'trtllm'", specifier = "==0.1.9" }, @@ -4602,13 +4640,13 @@ requires-dist = [ { name = "torchvision", marker = "sys_platform == 'darwin'", specifier = "==0.26.0", index = "https://pypi.org/simple" }, { name = "transferqueue", git = "https://github.com/Ascend/TransferQueue.git?rev=c51614308b68c8d7a87c9b3ef62d59e14c69bde2" }, { name = "transformer-engine", extras = ["core-cu13", "pytorch"], marker = "extra == 'automodel'", git = "https://github.com/NVIDIA/TransformerEngine.git?rev=v2.14.1" }, - { name = "transformers", specifier = ">=5.5.0,<5.13.0" }, - { name = "transformers", marker = "extra == 'automodel'", specifier = "==5.5.0" }, - { name = "transformers", marker = "extra == 'fsdp'", specifier = ">=5.5.0,<5.9.0" }, - { name = "transformers", marker = "extra == 'mcore'", specifier = "==5.8.1" }, + { name = "transformers", specifier = ">=5.5.0,<=5.12.1" }, + { name = "transformers", marker = "extra == 'automodel'", specifier = "==5.12.1" }, + { name = "transformers", marker = "extra == 'fsdp'", specifier = "==5.12.1" }, + { name = "transformers", marker = "extra == 'mcore'", specifier = "==5.12.1" }, { name = "transformers", marker = "extra == 'sglang'", specifier = "==5.12.1" }, { name = "transformers", marker = "extra == 'trtllm'", specifier = "==5.5.4" }, - { name = "transformers", marker = "extra == 'vllm'", specifier = "==5.8.1" }, + { name = "transformers", marker = "extra == 'vllm'", specifier = "==5.12.1" }, { name = "triton", marker = "(platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')", index = "https://download.pytorch.org/whl/cu130" }, { name = "vllm", marker = "platform_machine == 'aarch64' and sys_platform == 'linux' and extra == 'vllm'", url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_aarch64.whl" }, { name = "vllm", marker = "platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'vllm'", url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_x86_64.whl" }, @@ -5135,21 +5173,21 @@ name = "nvidia-modelopt" version = "0.46.0.dev86+gc3b913b9c" source = { git = "https://github.com/NVIDIA/Model-Optimizer?rev=c3b913b9cc1d82d5a0af9fa77b4db87829e6f158#c3b913b9cc1d82d5a0af9fa77b4db87829e6f158" } dependencies = [ - { name = "ninja" }, - { name = "numpy" }, - { name = "nvidia-ml-py" }, - { name = "omegaconf" }, - { name = "packaging" }, - { name = "pulp" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "regex" }, - { name = "rich" }, - { name = "safetensors" }, - { name = "scipy" }, - { name = "setuptools" }, - { name = "torch" }, - { name = "tqdm" }, + { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-ml-py", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "omegaconf", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pulp", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pydantic", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "regex", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "rich", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "scipy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, ] [[package]] @@ -5205,19 +5243,19 @@ name = "nvidia-resiliency-ext" version = "0.6.0" source = { git = "https://github.com/NVIDIA/nvidia-resiliency-ext.git?tag=v0.6.0#6c5f2a13c7688d92a7ac7ee6e464721eb8b7345d" } dependencies = [ - { name = "defusedxml" }, - { name = "grpcio" }, - { name = "grpcio-tools", version = "1.81.1", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "grpcio-tools", version = "1.82.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "httpx" }, - { name = "numpy" }, - { name = "nvidia-ml-py" }, - { name = "packaging" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil" }, - { name = "pyyaml" }, - { name = "torch" }, + { name = "defusedxml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "grpcio-tools", version = "1.81.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio-tools", version = "1.82.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "httpx", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "nvidia-ml-py", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, ] [[package]] @@ -5293,7 +5331,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ml-dtypes" }, { name = "numpy" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" } }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/19/8ea73a64b368b75fe339771a20a02bc61ea1f551484c9e3d9d0bfbd0450f/onnx-1.22.0.tar.gz", hash = "sha256:ef40c0aaf0b643857ea9306fc7eddce17eaf9fb0407e4801f1fc5758443a38e0", size = 12024721, upload-time = "2026-06-15T12:50:05.354Z" } @@ -5454,8 +5493,8 @@ dependencies = [ { name = "cloudpickle" }, { name = "grpcio" }, { name = "httpx" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/5d/4e/8fc4660a1cd57e92f4bc160234c29ef95ffef12b7b442f04a033b7cf7fe2/openshell-0.0.102-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:f9905a5e8fdab13300fac1a911619e3af3bab12e75059dd3b5bdba5067fbdc69", size = 8564345, upload-time = "2026-08-10T15:06:32.369Z" }, @@ -5585,8 +5624,8 @@ name = "opentelemetry-proto" version = "1.44.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/64/01/40ac4ae9a149263cc52c2cee200ddd80cb6d8db1a4610abf8eabce0fe771/opentelemetry_proto-1.44.0.tar.gz", hash = "sha256:c547a79c2f8c0c515d31509154682e5921c7cfd5ca67b70e1f9266e2c3e103f3", size = 46488, upload-time = "2026-07-16T15:25:45.34Z" } wheels = [ @@ -5727,7 +5766,7 @@ dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "pytz" }, - { name = "tzdata", version = "2025.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tzdata", version = "2025.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "tzdata", version = "2026.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } @@ -5783,8 +5822,8 @@ dependencies = [ { name = "safetensors" }, { name = "torch" }, { name = "tqdm" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/86/cf/037f1e3d5186496c05513a6754639e2dab3038a05f384284d49a9bd06a2d/peft-0.19.1.tar.gz", hash = "sha256:0d97542fe96dcdaa20d3b81c06f26f988618f416a73544ab23c3618ccb674a40", size = 763738, upload-time = "2026-04-16T15:46:45.105Z" } wheels = [ @@ -5965,8 +6004,8 @@ name = "proto-plus" version = "1.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/87/44/767757fd2cdd4a60d7e4440d9f7b491d6131103d313638d2c03e06c268fb/proto_plus-1.28.1.tar.gz", hash = "sha256:832e68e7fe064cf90ab153b6e5eb935b27891bb89aaeb68b115e9b702f6cb168", size = 57166, upload-time = "2026-07-08T17:04:02.367Z" } wheels = [ @@ -6581,7 +6620,7 @@ name = "pyzmq" version = "27.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cffi", marker = "implementation_name == 'pypy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ @@ -6606,17 +6645,37 @@ resolution-markers = [ dependencies = [ { name = "apache-tvm-ffi" }, { name = "einops" }, - { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "torch" }, - { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/58/58b82e91b236539f424ff5681e7095b1f2860ddfb7778fe0be14d8fb58de/quack_kernels-0.4.1.tar.gz", hash = "sha256:9d7d6ba412bc0c8a9b1331c52a73db76280adb9dc2f2750df4851ddabef1466b", size = 274766, upload-time = "2026-04-30T14:37:55.65Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/38/e4/a6c3bbbe3d4242fa412454b8e8069a079e500be331aecf8f2aa666164e9c/quack_kernels-0.4.1-py3-none-any.whl", hash = "sha256:c1c8df2935bf5156ec47d2c5384ac08b411fd0ee702d80ae916dbf6d6f5ae813", size = 260827, upload-time = "2026-04-30T14:37:54.584Z" }, ] +[[package]] +name = "quack-kernels" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "platform_machine == 'x86_64' and sys_platform == 'linux'", + "platform_machine == 'aarch64' and sys_platform == 'linux'", +] +dependencies = [ + { name = "apache-tvm-ffi" }, + { name = "einops" }, + { name = "nvidia-cutlass-dsl", version = "4.6.0", source = { registry = "https://pypi.org/simple" } }, + { name = "torch" }, + { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/17/890875f88f4d7da28faec9e6cf0a0cc565715b01474e50501fafc5bc71b4/quack_kernels-0.6.1.tar.gz", hash = "sha256:a694f89c91d137478de523c0227365a331ac9cb66790cfb08baa3dbfaafc71e7", size = 387353, upload-time = "2026-07-05T11:50:19.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/65/a38a30a6ac96a757363a5be9d09cef799640bb143a64ba5a2f4d400d95d9/quack_kernels-0.6.1-py3-none-any.whl", hash = "sha256:266705ea82117e9b1c8a9e44d68a458519f2498d966c0efffd6812120c3995ad", size = 358439, upload-time = "2026-07-05T11:50:18.502Z" }, +] + [[package]] name = "quack-kernels" version = "0.6.3" @@ -6694,8 +6753,8 @@ dependencies = [ { name = "jsonschema" }, { name = "msgpack" }, { name = "packaging" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "pyyaml" }, { name = "requests" }, ] @@ -7019,12 +7078,12 @@ dependencies = [ { name = "distro" }, { name = "easydict" }, { name = "einops" }, - { name = "fastapi", extra = ["standard"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-attn-4", version = "4.0.0b19", source = { registry = "https://pypi.org/simple" } }, - { name = "flashinfer-python", version = "0.6.14", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flashinfer-python", version = "0.6.14", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "gguf" }, { name = "helion" }, - { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "interegular" }, { name = "ipython" }, { name = "kernels" }, @@ -7035,7 +7094,7 @@ dependencies = [ { name = "ninja" }, { name = "numba", version = "0.65.1", source = { registry = "https://pypi.org/simple" } }, { name = "numpy" }, - { name = "nvidia-cutlass-dsl", version = "4.6.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.6.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-mathdx" }, { name = "nvidia-ml-py" }, { name = "openai" }, @@ -7096,7 +7155,7 @@ version = "0.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, - { name = "fastapi", extra = ["standard"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "orjson" }, { name = "setproctitle" }, { name = "uvicorn" }, @@ -7186,8 +7245,8 @@ version = "0.4.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/d4/beb65e474390131753f9cf984f6ad90e98af46d74836adce78eaf1291eb7/smg_grpc_proto-0.4.14.tar.gz", hash = "sha256:a8ea20872934472c94ffa192bafb2a4f71bc591ab4bfb240cb567801210fbc0f", size = 28677, upload-time = "2026-07-11T08:16:55.404Z" } wheels = [ @@ -7657,8 +7716,8 @@ dependencies = [ { name = "numpy" }, { name = "packaging" }, { name = "pillow" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "setuptools" }, { name = "tensorboard-data-server" }, { name = "werkzeug" }, @@ -7749,7 +7808,7 @@ dependencies = [ { name = "diffusers" }, { name = "einops" }, { name = "etcd-sdk-python" }, - { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-attn-4", version = "4.0.0b11", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-python", version = "0.6.12", source = { registry = "https://pypi.org/simple" } }, { name = "ftfy" }, @@ -7768,9 +7827,9 @@ dependencies = [ { name = "numpy" }, { name = "nvidia-cuda-nvrtc" }, { name = "nvidia-cuda-tileiras" }, - { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-ml-py" }, - { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-nccl-cu13" }, { name = "nvtx" }, { name = "omegaconf" }, @@ -7790,7 +7849,7 @@ dependencies = [ { name = "psutil" }, { name = "pulp" }, { name = "pydantic" }, - { name = "pydantic-settings", extra = ["yaml"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "pydantic-settings", extra = ["yaml"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "python-multipart" }, { name = "pyzmq" }, { name = "sentencepiece" }, @@ -7932,6 +7991,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/c6/d393e3185a276505182f7abd93fe714f3c444a2be9180798fa052347504e/tiktoken-0.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:165cf1820ea4a354985c2490a5205d4cc74661c934aca79dd0368232fff94e0f", size = 1239489, upload-time = "2026-05-15T04:50:57.918Z" }, ] +[[package]] +name = "tile-kernels" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" } }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/70/f0f62438b89c96bfe36d6ed95bfcc101b75df12f771a800cb6feb0fa9337/tile_kernels-1.0.0.tar.gz", hash = "sha256:259b7d70219cce6afa868f724c3032936c6ae331239285b1111554c4baa46eb3", size = 107895, upload-time = "2026-04-23T09:01:30.093Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/74/7511421ab2a2f292ca2c147a7af78eaec90e39bd6d6703283a4ba8fd7dfc/tile_kernels-1.0.0-py3-none-any.whl", hash = "sha256:9f1e09c1bccde32f3189d1ff32ba9725f86fc04ac1d0ac93284e16fcab1a5666", size = 120627, upload-time = "2026-04-23T09:01:28.287Z" }, +] + [[package]] name = "tilelang" version = "0.1.9" @@ -7941,18 +8013,18 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "apache-tvm-ffi", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "cloudpickle", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "ml-dtypes", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "numpy", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "tqdm", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "z3-solver", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "apache-tvm-ffi", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "cloudpickle", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "ml-dtypes", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "numpy", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "z3-solver", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/56/70/5051f65821baa30a3d61fc48f8ba10c776490315e8c90f82559b92089756/tilelang-0.1.9.tar.gz", hash = "sha256:287f727c913bb648fcf6c1968809ba3390e55eeed257a5c6bb9a80bc05966af4", size = 93395292, upload-time = "2026-04-22T09:19:11.988Z" } wheels = [ @@ -7969,18 +8041,18 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "apache-tvm-ffi", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "cloudpickle", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "ml-dtypes", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "typing-extensions", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "z3-solver", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "apache-tvm-ffi", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cloudpickle", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ml-dtypes", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "numpy", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "typing-extensions", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "z3-solver", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/2b/ea36e371296155b662dfc0ce987b6e1c6f4017714e13824050370a0fd4f1/tilelang-0.1.11.tar.gz", hash = "sha256:ac9d03e67caadeebd4d7f3ac5e2318011db8d3e23f7179f7dd3ba2a249354d47", size = 93229382, upload-time = "2026-06-08T08:37:26.87Z" } wheels = [ @@ -8120,7 +8192,7 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "torch", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/1a/adafdc49546ffe0041f52471da51c084243094382b99332b5706e90ba26a/torch_c_dlpack_ext-0.1.3.tar.gz", hash = "sha256:4b5da66432af7224dcf02aad4f13cc416eeef5331cd153588b7e081a193f4972", size = 3334, upload-time = "2025-11-22T03:50:48.089Z" } wheels = [ @@ -8137,7 +8209,7 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-sglang' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm'" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/37/de/921b6491efce5c389a5ef9bbed3d2d6660005840dae488124173180859ab/torch_c_dlpack_ext-0.1.5.tar.gz", hash = "sha256:d06f0357d575d22a168cc77acb9020fc4bae30968ceb6718a055dcbe92bacabe", size = 12913, upload-time = "2026-01-12T11:25:08.484Z" } wheels = [ @@ -8269,7 +8341,7 @@ name = "transferqueue" version = "0.1.9" source = { git = "https://github.com/Ascend/TransferQueue.git?rev=c51614308b68c8d7a87c9b3ef62d59e14c69bde2#c51614308b68c8d7a87c9b3ef62d59e14c69bde2" } dependencies = [ - { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "hydra-core", version = "1.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "msgspec" }, { name = "numpy" }, @@ -8292,30 +8364,6 @@ dependencies = [ { name = "torch" }, ] -[[package]] -name = "transformers" -version = "5.5.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "platform_machine == 'x86_64' and sys_platform == 'linux'", - "platform_machine == 'aarch64' and sys_platform == 'linux'", -] -dependencies = [ - { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "regex", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "typer", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/9d/fb46e729b461985f41a5740167688b924a4019141e5c164bea77548d3d9e/transformers-5.5.0.tar.gz", hash = "sha256:c8db656cf51c600cd8c75f06b20ef85c72e8b8ff9abc880c5d3e8bc70e0ddcbd", size = 8237745, upload-time = "2026-04-02T16:13:08.113Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/28/35f7411ff80a3640c1f4fc907dcbb6a65061ebb82f66950e38bfc9f7f740/transformers-5.5.0-py3-none-any.whl", hash = "sha256:821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944", size = 10245591, upload-time = "2026-04-02T16:13:03.462Z" }, -] - [[package]] name = "transformers" version = "5.5.4" @@ -8325,45 +8373,21 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "regex", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "typer", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, + { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "numpy", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "regex", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "typer", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/1e/1e244ab2ab50a863e6b52cc55761910567fa532b69a6740f6e99c5fdbd98/transformers-5.5.4.tar.gz", hash = "sha256:2e67cadba81fc7608cc07c4dd54f524820bc3d95b1cabd0ef3db7733c4f8b82e", size = 8227649, upload-time = "2026-04-13T16:55:55.181Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/29/fb/162a66789c65e5afa3b051309240c26bf37fbc8fea285b4546ae747995a2/transformers-5.5.4-py3-none-any.whl", hash = "sha256:0bd6281b82966fe5a7a16f553ea517a9db1dee6284d7cb224dfd88fc0dd1c167", size = 10236696, upload-time = "2026-04-13T16:55:51.497Z" }, ] -[[package]] -name = "transformers" -version = "5.8.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "platform_machine == 'x86_64' and sys_platform == 'linux'", - "platform_machine == 'aarch64' and sys_platform == 'linux'", -] -dependencies = [ - { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "regex", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "typer", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/e6/4134ea2fbea322cddc7ffc94a0d8ee47fe32ce8e876b320cd37d88edfc4d/transformers-5.8.1.tar.gz", hash = "sha256:4dd5b6de4105725104d84fd6abd74b305f4debfc251b38c648ee5dd087cf543b", size = 8532019, upload-time = "2026-05-13T03:21:57.234Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/b1/8be7e7ef0b5200491312201918b6125ef9c9df9dd0f0240ccef9ac824e6b/transformers-5.8.1-py3-none-any.whl", hash = "sha256:5340fb95962162cdfdae5cc91d7f8fedd92ed75216c1154c5e1f590fcf56dd0e", size = 10632882, upload-time = "2026-05-13T03:21:52.876Z" }, -] - [[package]] name = "transformers" version = "5.12.1" @@ -8373,15 +8397,15 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "huggingface-hub", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pyyaml", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "regex", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "safetensors", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tokenizers", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "typer", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "regex", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "typer", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/aa/7c/8240f612819718100a9346dc28dea6a11370c3ca9c8c6eabadd3dea4ef29/transformers-5.12.1.tar.gz", hash = "sha256:679ee731c8225347889ad4fb3b2c926a62e9da3b7d284e9d12c791da7272466b", size = 8924054, upload-time = "2026-06-15T17:27:50.604Z" } wheels = [ @@ -8517,7 +8541,7 @@ standard = [ { name = "httptools" }, { name = "python-dotenv" }, { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "watchfiles" }, { name = "websockets" }, ] @@ -8569,26 +8593,26 @@ dependencies = [ { name = "depyf" }, { name = "diskcache" }, { name = "einops" }, - { name = "fastapi", extra = ["standard"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "fastsafetensors" }, { name = "filelock" }, { name = "flashinfer-cubin", version = "0.6.12", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-python", version = "0.6.12", source = { registry = "https://pypi.org/simple" } }, - { name = "humming-kernels", version = "0.1.6", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "humming-kernels", version = "0.1.6", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "ijson" }, { name = "jsonschema" }, { name = "lark" }, { name = "llguidance" }, { name = "lm-format-enforcer" }, { name = "mcp" }, - { name = "mistral-common", marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "model-hosting-container-standards" }, { name = "msgspec" }, { name = "ninja" }, { name = "numba", version = "0.65.0", source = { registry = "https://pypi.org/simple" } }, { name = "numpy" }, { name = "nvidia-cudnn-frontend" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "openai" }, { name = "openai-harmony" }, { name = "opentelemetry-api" }, @@ -8625,7 +8649,7 @@ dependencies = [ { name = "torchaudio" }, { name = "torchvision" }, { name = "tqdm" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" } }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, { name = "typing-extensions" }, { name = "watchfiles" }, { name = "xgrammar" }, @@ -8655,26 +8679,26 @@ dependencies = [ { name = "depyf", marker = "platform_machine != 'x86_64'" }, { name = "diskcache", marker = "platform_machine != 'x86_64'" }, { name = "einops", marker = "platform_machine != 'x86_64'" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "fastsafetensors", marker = "platform_machine != 'x86_64'" }, { name = "filelock", marker = "platform_machine != 'x86_64'" }, { name = "flashinfer-cubin", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "flashinfer-python", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, - { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "ijson", marker = "platform_machine != 'x86_64'" }, { name = "jsonschema", marker = "platform_machine != 'x86_64'" }, { name = "lark", marker = "platform_machine != 'x86_64'" }, { name = "llguidance", marker = "platform_machine != 'x86_64'" }, { name = "lm-format-enforcer", marker = "platform_machine != 'x86_64'" }, { name = "mcp", marker = "platform_machine != 'x86_64'" }, - { name = "mistral-common", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "model-hosting-container-standards", marker = "platform_machine != 'x86_64'" }, { name = "msgspec", marker = "platform_machine != 'x86_64'" }, { name = "ninja", marker = "platform_machine != 'x86_64'" }, { name = "numba", version = "0.65.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "numpy", marker = "platform_machine != 'x86_64'" }, { name = "nvidia-cudnn-frontend", marker = "platform_machine != 'x86_64'" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvtx", marker = "platform_machine != 'x86_64'" }, { name = "openai", marker = "platform_machine != 'x86_64'" }, { name = "openai-harmony", marker = "platform_machine != 'x86_64'" }, @@ -8714,7 +8738,7 @@ dependencies = [ { name = "torchcodec", version = "0.15.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "torchvision", marker = "platform_machine != 'x86_64'" }, { name = "tqdm", marker = "platform_machine != 'x86_64'" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "typing-extensions", marker = "platform_machine != 'x86_64'" }, { name = "watchfiles", marker = "platform_machine != 'x86_64'" }, { name = "xgrammar", marker = "platform_machine != 'x86_64'" }, @@ -8845,26 +8869,26 @@ dependencies = [ { name = "depyf", marker = "platform_machine == 'x86_64'" }, { name = "diskcache", marker = "platform_machine == 'x86_64'" }, { name = "einops", marker = "platform_machine == 'x86_64'" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "fastsafetensors", marker = "platform_machine == 'x86_64'" }, { name = "filelock", marker = "platform_machine == 'x86_64'" }, { name = "flashinfer-cubin", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "flashinfer-python", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, - { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "ijson", marker = "platform_machine == 'x86_64'" }, { name = "jsonschema", marker = "platform_machine == 'x86_64'" }, { name = "lark", marker = "platform_machine == 'x86_64'" }, { name = "llguidance", marker = "platform_machine == 'x86_64'" }, { name = "lm-format-enforcer", marker = "platform_machine == 'x86_64'" }, { name = "mcp", marker = "platform_machine == 'x86_64'" }, - { name = "mistral-common", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "model-hosting-container-standards", marker = "platform_machine == 'x86_64'" }, { name = "msgspec", marker = "platform_machine == 'x86_64'" }, { name = "ninja", marker = "platform_machine == 'x86_64'" }, { name = "numba", version = "0.65.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "numpy", marker = "platform_machine == 'x86_64'" }, { name = "nvidia-cudnn-frontend", marker = "platform_machine == 'x86_64'" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvtx", marker = "platform_machine == 'x86_64'" }, { name = "openai", marker = "platform_machine == 'x86_64'" }, { name = "openai-harmony", marker = "platform_machine == 'x86_64'" }, @@ -8904,7 +8928,7 @@ dependencies = [ { name = "torchcodec", version = "0.15.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "torchvision", marker = "platform_machine == 'x86_64'" }, { name = "tqdm", marker = "platform_machine == 'x86_64'" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "typing-extensions", marker = "platform_machine == 'x86_64'" }, { name = "watchfiles", marker = "platform_machine == 'x86_64'" }, { name = "xgrammar", marker = "platform_machine == 'x86_64'" }, @@ -9024,8 +9048,8 @@ dependencies = [ { name = "click" }, { name = "packaging" }, { name = "platformdirs" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "pydantic" }, { name = "pyyaml" }, { name = "requests" }, @@ -9222,9 +9246,8 @@ dependencies = [ { name = "numpy" }, { name = "pydantic" }, { name = "torch" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.8.1", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-sglang' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "triton", marker = "platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] From 4fe7197b9cc548d1103cf5ca19beb64342337ad8 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Wed, 26 Aug 2026 08:01:54 -0700 Subject: [PATCH 28/34] fix(automodel): check FLA for dense Qwen3.5 CP Signed-off-by: larkzhang-nv --- nemo_rl/models/automodel/setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nemo_rl/models/automodel/setup.py b/nemo_rl/models/automodel/setup.py index 15f79e5567a..e043e69c3a0 100644 --- a/nemo_rl/models/automodel/setup.py +++ b/nemo_rl/models/automodel/setup.py @@ -597,12 +597,12 @@ def setup_model_and_optimizer( "Context parallel is yet not supported for VLM models. Please set cp_size = 1 to train VLM models." ) - if model_config.model_type == "qwen3_5_moe": + if model_config.model_type in ("qwen3_5", "qwen3_5_moe"): try: import fla # noqa: F401 except ImportError: raise ImportError( - "Qwen3.5 MoE requires flash-linear-attention for context parallel. " + "Qwen3.5 requires flash-linear-attention for context parallel. " "Please install it in your Automodel venv: pip install flash-linear-attention" ) From 9121ea2626e0a2dfcf65aa7d22ed685e54547007 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Thu, 27 Aug 2026 01:42:03 -0700 Subject: [PATCH 29/34] docs(automodel): update context parallel guide Signed-off-by: larkzhang-nv --- docs/assets/cp-upgrade-exp/gemma4-26b.png | Bin 186341 -> 0 bytes docs/assets/cp-upgrade-exp/gemma4-e2b.png | Bin 176236 -> 0 bytes docs/assets/cp-upgrade-exp/qwen3.5-35ba3b.png | Bin 174445 -> 0 bytes docs/assets/cp-upgrade-exp/qwen3.5-9b.png | Bin 169571 -> 0 bytes .../design-docs/automodel-context-parallel.md | 290 ++++++++++++++++++ docs/design-docs/automodel-upgrade-intro.md | 264 ---------------- docs/index.md | 2 +- 7 files changed, 291 insertions(+), 265 deletions(-) delete mode 100644 docs/assets/cp-upgrade-exp/gemma4-26b.png delete mode 100644 docs/assets/cp-upgrade-exp/gemma4-e2b.png delete mode 100644 docs/assets/cp-upgrade-exp/qwen3.5-35ba3b.png delete mode 100644 docs/assets/cp-upgrade-exp/qwen3.5-9b.png create mode 100644 docs/design-docs/automodel-context-parallel.md delete mode 100644 docs/design-docs/automodel-upgrade-intro.md diff --git a/docs/assets/cp-upgrade-exp/gemma4-26b.png b/docs/assets/cp-upgrade-exp/gemma4-26b.png deleted file mode 100644 index 6555c302538bfe8c4f8e6f597325dc0484242b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186341 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℘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 $3mfAD6p#m@ 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

9l;>3LYb$5nTG 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.sCSl#CHzBrtk~D*($$&QZv|<@afce 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 G`+or2n1Q$e diff --git a/docs/assets/cp-upgrade-exp/gemma4-e2b.png b/docs/assets/cp-upgrade-exp/gemma4-e2b.png deleted file mode 100644 index 85991edc1f59907ea427c391e765682d6fa3b0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176236 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ⅇUQ7Wbt}lPp6Ei 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 diff --git a/docs/assets/cp-upgrade-exp/qwen3.5-9b.png b/docs/assets/cp-upgrade-exp/qwen3.5-9b.png deleted file mode 100644 index 723c7dc5a816e0ea2e5c2c2b9636285e71b8664a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169571 zcmeFZXH-+s)-J3F2r8l=q99TQ=}Hw5g3?7mL8KSyNbfa?U`4t#sX-Kw4xxtNp7&5FcDsmhyuW1zp#cNPj3;>8V<)tDoQ_T~nPn`OfYH`SBy9 z4-@Hg;>4-6lP6A*zE2+COC$U9D^*Y0sXy0boW~D3zoUbnI3agJRpI_qpOY&o6h1~R zgKt|tI;e6djD$D#+`4m)M$+!n=Rj^6(SBBkzFT6+Z?7hbsWx_~uiQ#7Z|PtwYF>vp zf32=F$p30=H)q_2^}X(kHTjf)n;73o5Je|1J=M|CnYl$JcY^G~%M;{mCr(nynZ4nB ztgStB*K@hFVO&!39O>4dUjuE)_J8y$_|X1+k0Cs9&f zpKqxM1{N5*8@sxyzF@w;`g4j&Xi15&wGvN!O7yDRig2M#gcrL4uYkdHdwYAWv+1*E z^CBW5NB-A&e^T=`T<+Pk%-p=ZhsLMAUHwVqy_3yG4$$m_L*tqVh=nY;!pXQlHT>vs zdb)2^uP)$7<7z?W>)|J(fICc7C#gJq$f~MF3ckKB9z0J>tGZ7m$F@psX>F}^giB5q zD#&WyOoD3kUbQ`QHoo%U>}A;4m{Gi;BwJ)s(#$K2Iz!X1b^PW{-c9nHoLpl&RmVtJ z)9d->=4Pk*m!JZhh&8)lxl<=atvd=B2*YxY`4Gqq%ws7zZZ+e{Kln;wq6$Tz*#kQ} zyX@$0tbjLe^7|>R-k8c|qav3m#x6@MtAq%Mw)8Et+d$}}A8#U}e{RPw-ak7*#t<7@ zX6_ETmpKsoX+L1G=>7ya+!MD$E+%TzwXtxHRhDb0YUS1MP5kv16ZPi1_zsc5gpm5JV@w z(Dt|PNM5C+Wr}>3p8C}NGw7dEd6J6jf!S`dZ`XX|VaMhaMr2zl!N!k0mD>F|^WT$G z(=U$mckgsyrmVYiI#)iqoK&qbTk12fuys8-oxmlMar2*J29l&YPB0MG-p)A|lPzjg z7U%h}IGaWOok9D7So`~EbFQcVq6Dw0RU%D{wP!9185m(l&vibGEzM+1uvreAqWPs& zzZPZiK#qfHtJ?TU@5eZ!)KYuvPb#S$qNqXh43!@~d}v*@>@Y2AEu3N+X{7vnO12(8GS0WOu4kN( zDyq?B+J~yVi=v{U+K;7m9{eKerQ+ zU;iama__iqjhP>m*mQ@C87d*i##)&r{*qL-6M?fA7DvUA43{&x&#Hq!pAjV)U;ov_ zu=$evZLdt7iRqQ0c&1l5;E9hnO$?sRLrbbFHBuZ>o}K%9+b^gv1sWmbv<(d6N;m0vRX}xzSFZd$ z6I-MaSy}Os0RV6+OS;O1m*(%cInuV*GCXs3=2X9SkR9eQ|Eq$1RAb}hZ1h}9o@+3{YM{fzxJk`5iqI zlPSH-GQn0Y?!QS)##pPB31J1q9`c|E4;ks!&Hj>?3oqr|sQ0as`S=1p&$~yD%2fIM z>l(UFSHydp8IP5j@FOHQsQ+a%Q5U`yo9E{4U^hjnw{o@Ex=cadD(ZiauEKJXdXS%w z4|pmvFKbQevFP7~{k@Q5=kb?B9bd{ZU67NDrlbwz{=a|ui#h+{@@x1Bvc!SnEbIR; z-hX)XAHxQUvAulBO>>=0{a?+(KdXmHl zyY&mUWdAR_yG+HFrpn^~;_ZJo^gp)fmw2e0A~B+GlD&ug|7CXvE|TQv?(V?fXyiYN z+rN?#NqNkO@A7HX{{zSVg-_X>Bsub2$^Hd4{(JHHBPnb&$BcOOPLBS6_x!I3wUkM6 zv^=c+Z-x4|LjBSOxqmCvFZ1(nh5BPi{_UZD8`*z*s6U?h-yZ6hKmY#$fj51&co7xr#^M{DR6DMU5ym3f1xbJaZie&Uq4 zp_{GZ<1o(<43kFCF&_PEoor!LHHT>A7_)QjD$Hwj*{OEv?c5Obv-~@yWu|+!kNcWM z`2w~--L4CNlH|yg9YXUDgxu3hb+gBJG{HtX_&M#}^%E8StloM~6?Z%qBj3NY)@y~U zS)WouT9JRxQsW-nHGY<=xi{($eZZ*TzO@76EBx z6@8P3#TG49H%QUDFv-!Lx!GB5MtH$SEs81c_m(b7$IR{Z!~`W742j}#Tx5J6IqIKO|tCe#!^j#Ql@{Ne%SQM zwdUS=E%i0a;P=0P8W!I&J5BoSt;OaUeuxo0#EfP<3eHfDEIRpfddFj6$t;(lLW=rT zkr%5aN?A5)>TAO#Ax2c=Hn^9q-s_M1HGrSbw&Dv z@T0p!!XZWTiT0KG6=MzVRD6SJT_g)LiRO!)_d+?*U)wBvf#^sO#qVlJ6N*jFJi3j0 zv26=>NGU^l@fY6fbH+eEex!r2*!In$@xZ;6-v0c$!xv7v{u287G{g|!z1lsz490h{ zMzK5<^Ntm`5(9F_vLIEEPCd)_s_`4q>!`B=t;mGSJrD@gtmu1x(PY;xuVCz%7xZ?U0Boi&RC{pT6(b}7;F@HFldXr7qJC|#43k-FzXSy zjz*}u9M?Q2YJ3S>xm%@2j>8p0bv}nQcQuC+v2SHba(Uo2tG|pZ`+kV2F3W@T8H5l_ z<`x($g$a9ry~YT@fqoYzzq$a`Ubmo5jWs+>=%w>mmISW%Dhu(8B3S&lO^q}SbJ8+0 z7j}lEv9Kjk>qAifp=**8w77rsdv7MpGXk!jXbJa^PRVtxGv#(Q+m{rq6iU<<0f8IP z>@=Y|&z`}ASN0C1aReQmX9ue6D97r2;I7*%Yp(6Y)&CZD%8P_U~N-PxM0EK4MOLF ztUy}S+_vv{e;?`&Y|tQo-NH-4|A!zS1lDdI^xbcr-{oX?Q236)|3_|stFim379)vzI!~u9(uw ztaRO3z2v?B`JE47m1Kmd&mSNeiCfTW;+ixjINek3eydGqcMWa=SBqw@Qz3hUDX1Ey zVY$l%t-jImaSEfvbfM+#>j`4zhP800^YXT#Q;jS~S`@%9_aJT)`$fGDuebm)6ppN^ zS>v6M4IRDbJ}-bpsKs1#tX_qdNMn;rrZ3y7uzkjkDj0&Eow_WEF3LlHh0d%>lCRn> zdCLPolyq13Xj)RWpD`&5Kq)dN>tdy^TnpI~-#1aUbZbC|yI1G~lo~>c>>kuJ#2Zf! zV5tr5Wku=Uj`4ZleWsA*`XZBy?-J`?W<4$&AEQAGRaL zH7+9}tmuqY>Z{v+Fe5{zFk|5ZkoTV0DWK%IUy}daAo8eylNQjiTBVE%wxL_~e~WL< zJX)yNb^6f(B*PMxMlFiWJqlH-A+UWeNu5`7w z&$5zzM+}|eGZQ`-M|jF2pe4oUBV+f?_e@TOQ1m_X^pqb09BEf|Oy%fh;l;RKsbfSb zJ+tD@Ih|03G(gyZdIeO1pLSKRo1?GxR-H+=m-zB%#P)~gr^Sk$2yy{>ZXtgn$&o3A z+s)uu?N1$^nSZhVFjM3@@Q4~v{}neB>e!h+%%I;9^U`8EviuH+=N?xB{0#hZcB&fzYgfiSB!5V|#*{84dQ34rMI#7gZN^f1`*$55b z8@D&>&s6vBzPI;aU1BpQ&|^GHVTMml6dNP}ocW>Y!e|s=XDN{`^g^&C?hqD5DOtk) z{oRpw=R*coiogiz-9^6!_JgX;@mST{MQ4TTxHwXyX!*Ve2Ph>3_!m2NjBch*uQuAg z%^SV=-e%i3j*6r8?)Gjq_MqF+=kaIKeh};nswYBhN`Z&jJh<-Ha{9Kj?^ba1;h~_^9!{{=v9pRE$)p_&?)g?Gb{kR^v3y+g`bx<>`3GN7j7Q% z2eHrP-yNPazMrXWwOun00}n6eLg(^RPAxT`72WtCn8p#~ee6 z-8LLME<(S6YT6fik~-12+X@^jlyhbHq9b(~(HAK*0gj@*_UR~18nb&E*HGAgi7%w< zXr%X$e#$?50<;7uRA>@ym-Sn2<57Zq9M}uqm1&G^nE^-+?&<1pqEBr+x|K=)XjliW zi|4iSbm*A2lea)ZS;;Qw6;nqBS~r6TV>0A@i7!PywU&>rMNE8tcIzNTk|`&wQIh>) zD5YfqY??S$UOpB<$sl&+^FSnS1#bg+Yl=8)2YIAMo&xT@0mA7sr#;R&QcyQ%=zK3b z|BVyhr+mhX{}aD94_BO>i&8p+R6v;3w_eY%@d(OCmpo#5UHpl)-Usy=6WuA&-7GGx z&t=(iuLd)Yt{9G3bGuMm`x9-K;KZV?Q4n0qiGMg>u830TYv1{#uGpmj8lN_?B9Ccw zxFmy5aW^+T`C;tR!uv1bJ99T#4id5;^KXO+={*2b@KzY(PO{ggDxu2umckOoYVXs! z60eliLpW$$T=$?JN=cjQyXNb?Fur$aadhg>vHXxeGVMMgiOhLVWW?(Gg1XMYnnN3B4vOq`<Q;i#(>RfnZ(pVN+jP9AD%CXwihEO!3|Gfvnye1*}hN_>SE;AOX2ixwPH*6VKQ);!#hCqC<-XKDr>M`(k}dP+N`d2W)EIFqsTN*G-&z-#A_$xDy|s#qQ{ZI7XtAI&Y?MjbAw8Pa*}_dE|1x_w#db|4L2!pOffwme{j ziNGfqm|2%{$Z)2V)j~~x0>NCiEBa-#G)W@RtZT`L_esUcG5U**3|m@%J8ce<6h@?rn}!njD1l4A$pl;pB^GI zFy@1Bq=7n9uD;Kr`Ce6Xob0Ef|E6AhVWLsu*w=Y!Odi@7x=N2uzPA2O@!;zC$Dlr@ zWGXDm3FSDJ7I+HJqM0N+E^QV(Q5VPASN~Rli_h?t%>B`T46O(a-h$1R0ORU_Xa&Je z{XEa3jtE{LG zm`Rb0mUF1jr&(tSejUA0`p~=Faprv5lYVb0w3tg~h<>3sMASQ6!Ve}FI%#T~*=vXx znMG)baOkZWCI-5L$t{a_^At0urKnmLq(x;Jand>5O85Z($R3$C_DOh~&W2DRvp zx>`Y^h==i<=R@9~OUD2=GU7SS>8UGUjd=4tlGTe`;%W8xhR?SeqBGUq`C)I-626!9 z@RHDmhZ%Do9Hek`!DL9M1tJj@^#~F|9{~`W7JdN{>22k@wm?(l}o%ztYw&QiZJ6vN9IO}+>v1!Qh90l=B65uFQoP1fGM|#J1a%4 z-X!TZ1TNk`t*Bw=z@a+(8WuJLlKq01IR;BVOYWnzQcm}0RjELL5PKE*T(Q7}L=!9yc;RLJ2lbcd#Q1l& z7S`B%rl@S6rIEF$C%oo4Bc_=sHe$V~5l*EL^T6K~1mb#(etLDvLQ7WJ(A3@XR7-xn z^%I2tS;Jf3ZnswBj! zpHo>W!k4d+AlNQKgg30bPmXfL#-kv4L@!hS6a+-5!mU=QYOMA>8mW(oQYxvm(D$)+ za0z&5Td!t!7)y8UPtAx~GiRDrK*OtzVk#AK0f-Wz#TkyjETu?LPS1pu20R{~?WW)c z3&l~G&&@0JPFcz7Xuu;QqT_YpCI^nSemk4l-(pjqXImYejca@Abv1!l+y~`w&4lSa z{^&1I-naQsXgk^2E$vn~v&~ycL(kY6gux`8SNadOpsyeTi?@8u|wY#Cr3(VHSQ97+90c1=jJl|Ga*$=1 zEr!8iXhmwOpLyJAb)lp;Na|0eg`5#NQ;5tvVJAD1^;PmQtOK%vsCE&WGy-VoD<#w- zY%a-sr~0lR_(6knNYuQz!hL!unpwP1?-y!)&^>(5!! z&V}Z^G}sB9Ax^2dhpk3^b*X0)?xiO{Ssl5@SfY8o19u;{iJv#Xs3)w zdwt| z8S#Bk^B_3lTFAuXhwDCq33~%ZDbZlld4zM#bNLN;oVt$Oo%Lo3!eBI>35Q<1T6sW~#+M%nCXmylr84h@&4s4cj}@6DTCWgd?+(He~sJfP_B# z=|5FH-;~pMS+m58(SET_8{8|%rn@rlGg{h7h#N<80|y>W3yevcviJ^R_G=;9B6}1d zgLGhb8jU)zJji{U2~$%l5*+CVzJCXe0vC(Z}>)EDq z4m~?eK{CK;GIUog_;%d8;5}J2$dwM@?qLb7P+|FU&RVHx_vXooIZxC6tZtV?_R3|x z-2Ipk!EDKUqOSgGNC@MZXKxXrz{j;$tF@Nk+nfA^7zh|Y=qX-SZoN=YH~PY)2Uu@tse-=Mcw{RW&q7-&9&hu80hxz4F-Xqw;^=iXsVZvj_(O{FqZvM3tZ?xowTwMPn z-4Rk)(;P9na=D7@8hPx6=kD~AV%Ejh-z2=&HpdDHDrW63uOfo3X5PIl3kWD^5)t|$yxDyTgvU|G&FY1%?t60t+$d%ZEsSrm3Fi|Mx?S8WuYtI2XI=cryf{R_ z7=CCgA~;xGXq6lF?a@LCaDoB^zI#M(8LDM?xDz5Ay|_sT$UMa}`rB67(vpwz?V|ep zk$qK(RJnEcOFg#<3T&U^opUqtNa3~{6{v#hJA%N$xS@}AHqg=jd<>MJb^rcnR`~la z*{Vt*&WL4)Ja|mr?&I_1Y(>)~TU0VFh*hl^zGqw9C$ zVKRzSCCAqTy_G4a%Z|D?%b$|Gx4xAXME!AszL)sP66je8tEC?T&kX01DD~yJJ|sG- z!EYLVwq{x@L7J>hzB<2-ePv%Z78NJj2UU9WMsY1vTQj(-=7|d^$JAoy`7=Y$1Yu%| zpdxpm>K*<}N&zldyegZhTgJt(i62&sri+C-+^H0#GVf|^E!x2 z5cft|+!GaGQ3cu;iC-;jImEu?4kDjUsNEfFG`0p7)@Q1l#=YSmj&DcWvG4MWZzRxE z+-87~p!**?d{-n;4`f@jhk90w_QB9X_NoQvM8V(5ATlyTT6rwB0QSq9ry`^dh1YsG z!#Bz7tgnI=P^GGh9K2;4x%9as&C0cQ$?I#B};5-$9|D@B zY|RzZ@o(yeLTSBPYJs)3qLk}_c4UN8miphy{yK(KL(NUMtF z*T8%vIsg$8?ja}2)p*$`3y5;4)!C2qet}t4nd~h3+<3$mDD-4>kN5M9lv3xng3&MU z|1Q1jAyBW{DS@f+nj2Td8f`aE^gl)3|_PSD}keXe@Xj?c`ol*_31gw9EB87%LKxzWXQp(6eQpRd6xkMx462mH5`FyDvr`|Mw<RJ|5V)W4TC$bBCbZWFSDon?2ST zJ5H0cAubcdbxz^PxcWm2L%#XK7RVLn+p1E|K~{r3lVt&4iz0b=-$*`rPdWVVJj- zH_H9G|B>n*MAu{o!b3By36X6aCuJKiq z2wbx6OkJJ0brI+2eI)9(k|!D$tjQsbk?XPFB*sLU~Rkj_GCysxsGUe*@ zEux%w{~e59kXfTgvUhKGM-m+#Q`FuX6}39#WaQPXQ-}TR2S0jIy0hBlabF^*mQbTS zTb=ILwi{_W-RjM~fDOgj`_z+5stD@uDBq&L6Q|==3m7i7G=amjDK zYGE8rbd{eS-kk6msPo<|6&n-7{YwZ>?MH9 zR0{~H7i0e%60B<3{`A{is(}S5@Mx&5n`f^Hn44_{^3&%BJU{3-y!Sf(woDf{!}dxq z=d+7HyIXq9$@B&5KAt^BTmn2~q|-$Njz9thjzl1yCJQifw%q#Y{l!MSmpf6#A-!zQ ziZN-J%Yo@N)g{Cf-my48EuCD5E^l^zzC7oHd)M9mu(FXHw-|<7Ly+X9^+z3~%8O;f zC5D=(^GQ6Z0i#)`bx*~F-@f)~Fw{vZ{X3mH-GD;3-*~eR$o2tOLVKU7S^K7_#eB!4 zV?$xfb@v$DVzj0a2o&htD79dEg;#!cvA??FZ1-^JHOoJZFoC5viZ+y(ec|e-#t#96 zv9mAY*`p%7I(2lL2AycyNzf}NuFm%(E#-C3m5nHjo12>vL>72d?`CPk>?DvxF|rvN zBxslVx|8VL)|`s&%TOCX242Jl*|c)+abFwZ>nc3fVdGdzOd*z*WZkP~H14$FO8iox z1@ppttEd(zyVJ_~du9Mgh7zu9C4?-;d(5+$oWL!4%M~NtxsRVJurn8PV41ux*1|<(h+Sugy=gG(#`5Wt?FGPc#4Yz zr#`oxvA7nn(#8X{?vO--T9z~+NH;?hLA`SI1aGg2Y%e;wPz3$N4fZxq$+6){*!@$d zVI+K9FhTG*=(s7p48QI-d=|(h*K3L_sET9o)K_{EtT~YN(XqO72&6Bhe&PvtKk$(c z{qW@dS2Zt%#)xOb%XV_f4VX%MO^3HTx&eE6lxS%@Yg#ZDbjCreNjm~C9Y5WVo7*{f zYWzFnVW!B|lg!FQ`>H$?|3e$>5`L8I499hym6sS!D@R|rcGg7t1(>4}zMgxiYLf!W zsh%Yktb=v|PBm?$+$sySI-3V?T3n$&1T>_U z$N^FhfM<60($y^ll&^#Iww)%9&tJCUCq;Tnnb;{vB_fXMa_6i2qWQ}_hks~(>rADa zKo0L_^FU_3MmHjM&KK5fs(9}KoSiQi<$G&=M28;0B*rJ_znJsS(`OfWV@)pm1Pn+A z2VUW!N`2^wM_Pn?8KTnemu8n-B!$c!W@seyygvjbJ@0?1Sh~91!ZH>NmM)mMoBJZd zx^BXM4|=tv7umdJauVCZ3i|flERd4oIsplkt@XV(=R!h|zhLQ-yc{BX%xAnzsP(~x zQir40!QZV*3h9(dAy=K9Az9rjLkHP*nXM)Zi5?@cew+1Khi2-|&L9WH-cFMowy6?L znYD71S5hmR=j5sLtg;=(9)v2V$@)?K;A02QjB*R<#MhFycnZ^pBdo|hTMW9q6g!0Tk^%{>TGHp=_tR>IxL`NLbws4)+`=NhT7%+400omINmbd6~v~F&DQ<0L7fMVle1B&T7VF6qx8!H4cK!%t+{cfFU#U|Ka(LoA2M7vz z{)4h%t`1rip+)5Fg>~hRxZEdC;*_U%+6@W`PwfSw>TK+n?N$teEx0axyZ~?@RiU|O zjrc_T@ETZXKHf>LBsre5)&pGCkK2z!QazW+X9YCNZ+vQZEJqbRmmhygz|$94uZ{W2 zN`Ihq4ti`vhX2EM{Bl;ne4f5jS8|ope$n%&`_V&j zsIi@gZL$Y@Xk)Z2Fon|Lqodn4gVCVO4hDIPDs|=XCM_xPD+i@MBDFzP>>41v1?Tlk z77lM%`R$pMugF8OA)9PHT4bC0*4?Qy_~M$HRHxWjU8l&Uf+}d)cFR+QrS{`U=jmYa zk9XP7M&ox2ZkT&bIMSYdWDVP!@Z-!lDQy+_$s7^IcQ)h*UMU_cbl$cDQf)nMd|4C zkgI~V5?0HX=;OCb@C(%soJVdA z({~zDT?KkS0;<+nfsCc4x(i+UgbLH3&$fmpknTl4U)n$g>W*abmbp=^VWG(mMPzVX zbnC&58yRuM4s}+~bB*Z)qwJ5<>Uy`Sn=tPr6tnUz;Oc|<7VTqulZ_Fu`n~s_AZ4s( z6Ko-Km)9LP+x7vux6!a`c@Va-E0grX&_0|uI{ybd<+(-d+w)iZ%%Gn3?ehl5(367= zZ0NcZt9;&DV5-T6jAXbZ$zw+SjMe0anfe{Z%#@t$+wI!QZrr%BmIVR3j#qnEd>;@u z)Kd6@w581L3pkx!$1HQZ?X;MoS0jytid#0~gElt{@AyBOYVT5>JP?q7du|sjSj%aZ z5ZPK^HE@m%Z>AQ)_h$QBXI#D_y3gNk)srqXug-6aqjv85BLt#DoL#=A{NUS@IKhl} zrVUESWS<7tIJcT9H^o}VgRUg!+Hpo^%TK`t^3$O{@pnJem1pk>R%I>LDb)b4SkdWU zA5nS@(&AS5O6gp>mWXnnK2)B961F2WPXwnCLKkm{DyhH5)-Fag_eJ{TM=WA&U{i!q6$B#C#-LjZ}M2ey)RJeS95TBAl>fOFR8}DN

Ja@ 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

BF(F}VP%&5_<>W9Sb_C$a9`)i&zI0i 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 z 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 diff --git a/docs/design-docs/automodel-context-parallel.md b/docs/design-docs/automodel-context-parallel.md new file mode 100644 index 00000000000..0505b93ad59 --- /dev/null +++ b/docs/design-docs/automodel-context-parallel.md @@ -0,0 +1,290 @@ +# Automodel v0.6.0 and Context-Parallel Integration + +This design note describes NeMo RL's Automodel DTensor v2 integration after the +Automodel dependency was pinned to the official `v0.6.0` tag. It also explains the +migration from NeMo RL's fixed context-parallel (CP) layout to Automodel's model-owned +sharding protocol. + +## 1. Scope and Baselines + +The before-and-after comparisons in this document use the following fixed baselines: + +| Baseline | NeMo RL revision | Automodel revision | +| --- | --- | --- | +| Before the upgrade | `13b9dae09c31d9069575ce24de1e234943da7b92` | `24b47e856263d313b942f0ed666c63fff83306b4` from `main`; package version `0.4.0` | +| After the upgrade | This integration | [`v0.6.0`](https://github.com/NVIDIA-NeMo/Automodel/tree/v0.6.0) at `89c248a1743b47e135bab5a3e08856d2e24f3bd3` | + +The support matrices below describe the **NeMo RL Automodel integration**, not every +capability available in upstream Automodel. In particular, a model or layout can be +supported upstream while still being rejected by a NeMo RL worker guard. "Supported" +means that the NeMo RL path implements CP and does not explicitly reject the combination; +it does not mean that every model, topology, and sequence length has been tested. + +## 2. Automodel v0.6.0 Upgrade + +### 2.1 Submodule and Environment + +The submodule now records the exact commit referenced by the `v0.6.0` tag instead of +tracking Automodel's moving `main` branch. Moving or recreating the upstream tag does not +change an existing checkout automatically; NeMo RL must explicitly update its gitlink to +adopt a different commit. + +The dependency changes in `pyproject.toml` are: + +| Dependency | Before | After | +| --- | --- | --- | +| Base `transformers` constraint | `>=5.5.0,<5.9.0` | `>=5.5.0,<=5.12.1` | +| Automodel extra | `transformers>=5.5.0,<5.6.0` | `transformers==5.12.1` | +| FSDP, vLLM, and MCore extras | No direct Transformers pin | `transformers==5.12.1` | +| Automodel TileLang dependency on Linux x86_64 | No Automodel-specific pin | `tilelang==0.1.11` | +| Shared `apache-tvm-ffi` override | `>=0.1.9` | `==0.1.11` | +| `megatron-fsdp` | No root constraint | Git constraint at [`455389c4`](https://github.com/yuhezhang-ai/Megatron-LM/commit/455389c480af6b3acdca74c7830c68b3274eb083) | + +The Automodel, FSDP, vLLM, and MCore environments select Transformers 5.12.1. The SGLang +extra remains independently pinned to Transformers 5.6.0. The `megatron-fsdp` constraint +mirrors Automodel's source and revision so `uv` can resolve the transitive URL dependency +consistently. The lock file was regenerated as part of the dependency upgrade. + +Automodel's TileLang kernels also require the 0.1.11 TVM FFI ABI. In the container, +`z3/lib` is added to `LD_LIBRARY_PATH` because TileLang's symlinked worker-venv layout can +otherwise prevent `libtvm_compiler.so` from finding `libz3.so`. + +### 2.2 Distributed Setup and Model Loading + +Automodel v0.6.0 consolidates distributed setup and model loading: + +| Area | Before | After | +| --- | --- | --- | +| Device mesh | `create_device_mesh(...)` | `MeshContext.build(FSDP2Config, ParallelismSizes, ...)` | +| Model loading | Separate mesh, FSDP, MoE, and activation-checkpointing arguments | One `DistributedSetup` passed to `from_pretrained()` | +| FSDP backend | `FSDP2Config(backend="nccl")` | No `backend` field; NeMo RL initializes the process-group backend separately | +| MoE config import | `components.moe.config` | `components.distributed.config` | + +The main upstream API change is Automodel +[#2266](https://github.com/NVIDIA-NeMo/Automodel/pull/2266): + +```python +mesh_context = MeshContext.build( + fsdp2_config, + ParallelismSizes(tp_size=tp_size, cp_size=cp_size, ep_size=ep_size), + world_size=world_size, +) + +distributed_setup = DistributedSetup( + mesh_context=mesh_context, + strategy_config=fsdp2_config, + pipeline_config=None, + moe_parallel_config=moe_config if ep_size > 1 else None, + activation_checkpointing=activation_checkpointing, +) + +model = model_class.from_pretrained( + model_name, + distributed_setup=distributed_setup, + # Other model arguments remain unchanged. +) +``` + +### 2.3 Other API and Compatibility Changes + +- `BackendConfig` now comes from `components.models.common.utils` + ([#1172](https://github.com/NVIDIA-NeMo/Automodel/pull/1172)). +- `Checkpointer._should_write_hf_metadata()` became the module-level + `_should_write_hf_metadata(config)`. +- `save_consolidated` now uses `SaveConsolidatedMode`; NeMo RL normalizes values with + `_normalize_save_consolidated()` after configuration updates + ([#2289](https://github.com/NVIDIA-NeMo/Automodel/pull/2289)). NeMo RL currently rejects + `save_consolidated: final` because its checkpoint calls do not identify the final save; + use `true`/`every` when inline consolidated export is required. + +The upgrade removes three compatibility workarounds: + +- NeMo RL now imports Automodel's exported `NeMoAutoModelForTokenClassification` instead + of maintaining a local shim + ([#1634](https://github.com/NVIDIA-NeMo/Automodel/pull/1634)). +- The `_restore_loaded_model_dtype()` monkeypatch is no longer needed because Automodel + preserves an explicitly requested FP32 parameter dtype + ([#2419](https://github.com/NVIDIA-NeMo/Automodel/pull/2419)). +- The Gemma 4 KV-sharing `use_cache=True` workaround is removed. Transformers 5.12.1 + contains the required fix, so Automodel training continues with `use_cache=False` + ([Transformers #45312](https://github.com/huggingface/transformers/pull/45312)). + +## 3. Context-Parallel Integration + +### 3.1 Model-Owned Sharding + +Automodel [#2937](https://github.com/NVIDIA-NeMo/Automodel/pull/2937) unifies CP input +handling across model families and attention backends through `ContextParallelSharder`: + +```python +cp_sharder = ContextParallelSharder(model, device_mesh, batch) +train_ctx, sharded_batch = cp_sharder.shard(batch) + +with train_ctx(): + output = model(**sharded_batch) +``` + +`shard()` selects the model- and backend-specific strategy, pads and shards the batch, +returns the forward context, and stores the resulting `ShardLayout` on +`cp_sharder.shard_layout`. The layout records how local tokens map to global positions and +the sequence lengths before and after padding. The sharder then exposes +`shard_token_tensor()` and `gather_token_tensor()` so callers can map targets, masks, +logprobs, and logits through the exact layout used by the forward pass. + +Automodel therefore owns the model-input layout and attention communication. NeMo RL keeps +canonical, unsharded algorithm data and uses the sharder to compute losses or restore +public outputs such as full-sequence logprobs and top-k logits. + +### 3.2 Support Matrix Before the Upgrade + +This matrix describes the NeMo RL tree at the before-upgrade baseline. + +| Scope | Status | Boundary | +| --- | --- | --- | +| Text-only causal LMs without an explicit guard | Supported | Used NeMo RL's fixed head-tail round-robin layout and required a CP-compatible attention path | +| VLMs | Not supported | Model setup and batch handling rejected multimodal input with `CP>1` | +| GRPO and DAPO | Supported | Policy forward, loss, logprob, and logits post-processing had legacy CP paths | +| SFT | Supported | Reused the generic policy loss path | +| DPO | Supported | Restored full-sequence policy and reference logprobs before the DPO loss | +| Same-tokenizer distillation | Supported | Teacher top-k export and student distillation loss were CP-aware | +| X-token distillation | Conditional | Specialized heterogeneous teacher/student TP and CP path; no sequence packing | +| PPO | Not supported end to end | Actor policy could use CP, but the Automodel DTensor critic/value path required `CP=1` | +| Reward-model training | Not supported | The Automodel DTensor RM path rejected `CP>1` | +| CP with sequence packing | Not supported | Explicit NeMo RL guard | +| CP with DTensor sequence parallel | Not supported | Explicit guard when TP sequence parallelism and CP were both active | +| Non-packed sequence length | Restricted | Legacy load-balanced sharding required divisibility by `2 * cp_size` | + +### 3.3 Support Matrix After the Upgrade + +This matrix describes the current NeMo RL integration pinned to Automodel `v0.6.0`. + +| Scope | Status | Boundary | +| --- | --- | --- | +| Text-only causal LMs without an explicit guard | Conditional | Uses the sharder selected by the model and attention backend; support still depends on that strategy being CP-capable | +| VLMs | Not supported in NeMo RL | NeMo RL still rejects VLM training with `CP>1`, even where upstream Automodel has VLM CP hooks | +| GRPO and DAPO | Supported | Canonical full-sequence loss/logprob path; replicated losses use effective backward scaling of `loss * DP` | +| SFT | Supported | Uses the canonical policy loss path and the same replicated-loss fanout correction | +| DPO | Supported | Full-sequence policy/reference logprobs are restored through the sharder before loss computation | +| Same-tokenizer distillation | Supported | Top-k and student outputs are restored through the sharder; replicated loss uses `loss * DP` | +| X-token distillation | Conditional | Specialized heterogeneous TP/CP path remains; no sequence packing, and each teacher/student sequence length must be divisible by its own CP size for the contiguous IPC windows | +| PPO | Not supported end to end | Actor policy can use CP, but the Automodel DTensor critic/value path still requires `CP=1` | +| Reward-model training and scoring | Not supported | RM setup and `ScorePostProcessor` reject `CP>1` | +| CP with sequence packing | Not supported in NeMo RL | The integration still rejects it, even though the upstream sharder can represent packed/THD layouts | +| CP with DTensor sequence parallel | Not supported | The existing TP sequence-parallel guard remains | +| Non-packed sequence length | Supported with padding | The generic sharder pads and trims automatically; x-token keeps the divisibility restriction described above | + +### 3.4 GRPO Workflow Before and After + +The GRPO algorithm remains unchanged. The refactor changes how `policy.train()` and +`policy.get_logprobs()` map between canonical RL data and the model's local CP layout. + +#### Before + +```mermaid +flowchart TB + A["Rollout, reward, and advantage"] --> B["policy.train"] + B --> C["Build cp_buffers and seq_index"] + C --> D["create_context_parallel_ctx"] + D --> E["Model forward
local logits"] + E --> F["prepare_data_for_cp
CP+TP DTensor logits"] + F --> G["Recompute the local target layout
from seq_index"] + G --> H["TP target logprob"] + H --> I["CP all-gather and reorder
full logprobs"] + I --> J["Replicated ClippedPGLossFn"] + J --> K["backward: loss * DP * CP"] +``` + +NeMo RL implemented the layout twice: once for the model input and again for targets and +logprobs. This coupled the loss path to Automodel's legacy round-robin assumptions. + +#### After + +```mermaid +flowchart TB + A["Rollout, reward, and advantage"] --> B["policy.train"] + B --> C["Keep canonical data
build a private model_batch"] + C --> D["ContextParallelSharder.shard"] + D --> E["Automodel ShardLayout and context
model forward"] + C --> F["Global next-token shift"] + F --> G["shard_token_tensor
local targets"] + E --> H["TP target logprob"] + G --> H + H --> I["gather_token_tensor(trim=True)
canonical full logprobs"] + I --> J["Replicated ClippedPGLossFn"] + J --> K["Correct CP gradient fanout
backward: loss * DP"] +``` + +| Key change | Before | After | +| --- | --- | --- | +| Layout owner | Automodel and NeMo RL both encoded the layout | Automodel owns `ShardLayout` | +| Data boundary | `cp_buffers` could mutate loss-side tensors in place | Canonical data stays unchanged; only `model_batch` is sharded | +| Target/result mapping | Manual `seq_index` and CP collectives | Sharder token operations | +| Backward scale | Fixed `loss * DP * CP` | CP fanout is removed; GRPO uses `loss * DP` | + +For `CP=1`, the worker keeps the direct fast path without constructing a sharder. + +### 3.5 X-Token Distillation Workflow Before and After + +The outer algorithm is unchanged: tokenize and align fixed text, export teacher full-vocab +logits over CUDA IPC, then compute projection-based KD and student CE. The refactor changes +how teacher and student model layouts are converted into the contiguous windows required by +the IPC and alignment contracts. + +#### Before + +```mermaid +flowchart TB + A["Dual tokenization and TokenAligner"] --> B["Teacher get_full_logits_ipc"] + B --> C["Teacher cp_buffers and legacy CP context"] + C --> D["Teacher forward
load-balanced logits"] + D --> E["cp_load_balanced_to_contiguous"] + E --> F["Teacher TP*CP CUDA IPC shards"] + + A --> G["student_policy.train"] + F --> G + G --> H["Student cp_buffers
input, mask, and alignment"] + H --> I["Student forward and CP+TP DTensor logits"] + I --> J["Manual student relayout
to a contiguous CP window"] + F --> K["Rebuild teacher full-vocab window"] + J --> L["Projection, chunk aggregation, KD, and CE"] + K --> L + L --> M["backward and optimizer step"] +``` + +Teacher export, student relayout, and alignment localization all depended on the fixed +legacy layout. + +#### After + +```mermaid +flowchart TB + A["Canonical student/teacher IDs and alignment"] --> B["Teacher get_full_logits_ipc"] + B --> C["Teacher ContextParallelSharder"] + C --> D["Teacher forward
local logits"] + D --> E["gather_token_tensor(trim=True)
then slice a contiguous teacher window"] + E --> F["Teacher CUDA IPC shards"] + + A --> G["student_policy.train"] + F --> G + G --> H["Student ContextParallelSharder
and model forward"] + H --> I["Restore canonical logits
then slice the student CP window"] + A --> J["Global shift of IDs, masks, and alignment
then slice the same window"] + F --> K["Rebuild teacher full-vocab window"] + I --> L["Projection and partitioned chunk KD"] + J --> L + K --> L + H --> M["Sharder-aligned window CE
with CP SUM"] + L --> N["KD + CE
backward: loss * DP * CP"] + M --> N +``` + +| Key change | Before | After | +| --- | --- | --- | +| Teacher IPC window | Manual legacy relayout | Sharder gather, trim, then contiguous slice | +| Student loss window | Rebuilt from CP DTensor assumptions | Restored from the actual `ShardLayout` | +| Alignment | Student fields traveled through `cp_buffers` | Canonical fields are globally shifted, then sliced | +| Preserved x-token logic | CUDA IPC, heterogeneous TP/CP, projection, chunk alignment, and multi-teacher aggregation | Unchanged; these remain NeMo RL responsibilities | + +X-token KD and CE keep a partitioned gradient contract, so `cp_gradient_fanout=1` and the +effective backward scale remains `loss * DP * CP`. This differs from GRPO's replicated +full-sequence loss. diff --git a/docs/design-docs/automodel-upgrade-intro.md b/docs/design-docs/automodel-upgrade-intro.md deleted file mode 100644 index b25b648115a..00000000000 --- a/docs/design-docs/automodel-upgrade-intro.md +++ /dev/null @@ -1,264 +0,0 @@ -# Automodel r0.6.0 Upgrade and Context-Parallel Integration - -This PR updates NeMo-RL for Automodel r0.6.0 and migrates the DTensor v2 -context-parallel (CP) path to Automodel's model-owned sharding protocol. - -## 1. Automodel r0.6.0 Upgrade - -### 1.1 Environment Upgrade - -Automodel r0.6.0 requires the following dependency updates in `pyproject.toml`; `uv.lock` -is regenerated accordingly: - -| Dependency | Before | After | -| --- | --- | --- | -| Base `transformers` range | `>=5.5.0,<5.9.0` | `>=5.5.0,<5.13.0` | -| Automodel extra | `transformers>=5.5.0,<5.6.0` | `transformers>=5.12.1,<5.13.0` | -| `megatron-fsdp` | No root constraint | Git constraint at [`455389c4`](https://github.com/yuhezhang-ai/Megatron-LM/commit/455389c480af6b3acdca74c7830c68b3274eb083) | - -The Transformers update matches Automodel's `transformers==5.12.1` pin. The -`megatron-fsdp` constraint mirrors Automodel's Megatron-LM fork and revision so `uv` can -resolve the transitive URL dependency consistently. - -### 1.2 Automodel API Updates - -The r0.6.0 upgrade consolidates distributed setup and model loading: - -| Area | Before | After | -| --- | --- | --- | -| Device mesh | `create_device_mesh(...)` | `MeshContext.build(FSDP2Config, ParallelismSizes, ...)` | -| Model loading | Separate mesh, FSDP, MoE, and activation-checkpointing arguments | One `DistributedSetup` passed to `from_pretrained()` | -| FSDP backend | `FSDP2Config(backend="nccl")` | `backend` removed; mesh setup selects NCCL | -| MoE config import | `components.moe.config` | `components.distributed.config` | - -The simplified call pattern is shown below. The main upstream change is Automodel -[#2266](https://github.com/NVIDIA-NeMo/Automodel/pull/2266). - -```python -mesh_context = MeshContext.build( - fsdp2_config, - ParallelismSizes(tp_size=tp_size, cp_size=cp_size, ep_size=ep_size), - world_size=world_size, -) - -distributed_setup = DistributedSetup( - mesh_context=mesh_context, - strategy_config=fsdp2_config, - pipeline_config=None, - moe_parallel_config=moe_config if ep_size > 1 else None, - activation_checkpointing=activation_checkpointing, -) - -model = model_class.from_pretrained( - model_name, - distributed_setup=distributed_setup, - # Other model arguments remain unchanged. -) -``` - -Other module and checkpoint API changes: - -- `BackendConfig` now comes from `components.models.common.utils` - ([#1172](https://github.com/NVIDIA-NeMo/Automodel/pull/1172)). -- `Checkpointer._should_write_hf_metadata()` became the module-level - `_should_write_hf_metadata(config)`, and `save_consolidated` now uses enum semantics. - Call `_normalize_save_consolidated()` after updating checkpoint configuration through - `setattr` ([#2289](https://github.com/NVIDIA-NeMo/Automodel/pull/2289)). - -The upgrade also removes three compatibility workarounds: - -- Use Automodel's exported `NeMoAutoModelForTokenClassification` directly instead of the - local NeMo-RL shim ([#1634](https://github.com/NVIDIA-NeMo/Automodel/pull/1634)). -- Remove the `_restore_loaded_model_dtype()` monkeypatch; Automodel now preserves an - explicitly requested FP32 parameter dtype - ([#2419](https://github.com/NVIDIA-NeMo/Automodel/pull/2419)). -- Remove the Gemma 4 KV-sharing `use_cache=True` workaround. This is enabled by the newer - Transformers version used with r0.6.0, rather than by an Automodel API change - ([Transformers #45312](https://github.com/huggingface/transformers/pull/45312)). - -## 2. CP API Changes and Support Scope - -This section covers the Automodel DTensor v2 training path only. - -### 2.1 Automodel CP API Changes - -Automodel [#2937](https://github.com/NVIDIA-NeMo/Automodel/pull/2937) unifies CP handling -across models and attention backends through `ContextParallelSharder`. A basic call is: - -```python -cp_sharder = ContextParallelSharder(model, device_mesh, batch) -train_ctx, sharded_batch = cp_sharder.shard(batch) - -with train_ctx(): - output = model(**sharded_batch) -``` - -`shard()` selects the model-specific layout, pads and shards the batch, and returns the -forward context required by the attention backend. Its `ShardLayout` records the global -position of each local token and the sequence lengths before and after padding. Callers -therefore consume the actual layout used by the forward instead of assuming how tokens -were partitioned. - -This creates a clear ownership boundary: Automodel manages the CP layout and communication -for model inputs, while NeMo-RL reuses that layout to compute RL losses and restore public -outputs such as logprobs and top-k logits. - -### 2.2 Pre-Refactor CP Support - -The legacy implementation supported the following combinations, subject to its fixed -round-robin layout: - -| Scope | CP support | Notes | -| --- | --- | --- | -| Text LLM | Supported | Policy forward, loss, logprob, and logits post-processing had CP paths | -| VLM | Not supported | Model setup and batch processing rejected multimodal input with `CP>1` | -| Gemma 3 / Qwen3.5 dense | Not supported | Explicit model guards; Qwen3.5 MoE required its designated backend | -| GRPO / DAPO | Supported | CP-aware logprob and policy loss paths; DTensor CP recipes existed | -| SFT | Supported | Reused the generic policy loss path | -| DPO | Supported | Restored full-sequence policy/reference logprobs before DPO loss | -| Same-tokenizer distillation | Supported | Teacher top-k export and student distillation loss were CP-aware | -| X-token distillation | Supported with a specialized path | Supported heterogeneous teacher/student TP and CP; no sequence packing | -| PPO | Not supported end to end | The actor path supported CP, but the Automodel critic/value path required `CP=1` | -| Reward model training | Not supported | The DTensor RM entry point rejected `CP>1` | - -Additional restrictions were `CP + sequence packing`, `CP + DTensor sequence parallel`, and -sequence lengths incompatible with the legacy `2 * cp_size` load-balanced split. - -### 2.3 GRPO Workflow Before and After - -The GRPO algorithm remains unchanged. The refactor changes how `policy.train()` and -`policy.get_logprobs()` map between canonical RL data and the model's local CP layout. - -#### Before - -```mermaid -flowchart TB - A["Rollout, reward, and advantage"] --> B["policy.train"] - B --> C["Build cp_buffers and seq_index"] - C --> D["create_context_parallel_ctx"] - D --> E["Model forward
local logits"] - E --> F["prepare_data_for_cp
CP+TP DTensor logits"] - F --> G["Recompute the local target layout
from seq_index"] - G --> H["TP target logprob"] - H --> I["CP all-gather and reorder
full logprobs"] - I --> J["Replicated ClippedPGLossFn"] - J --> K["backward: loss × DP × CP"] -``` - -NeMo-RL implemented the layout twice: once for the model input and again for targets and -logprobs. This coupled the loss path to Automodel's legacy round-robin assumptions. - -#### After - -```mermaid -flowchart TB - A["Rollout, reward, and advantage"] --> B["policy.train"] - B --> C["Keep canonical data
build a private model_batch"] - C --> D["ContextParallelSharder.shard"] - D --> E["Automodel ShardLayout and context
model forward"] - C --> F["Global next-token shift"] - F --> G["shard_token_tensor
local targets"] - E --> H["TP target logprob"] - G --> H - H --> I["gather_token_tensor(trim=True)
canonical full logprobs"] - I --> J["Replicated ClippedPGLossFn"] - J --> K["Correct CP gradient fanout
backward: loss × DP"] -``` - -| Key change | Before | After | -| --- | --- | --- | -| Layout owner | Automodel and NeMo-RL both encoded the layout | Automodel owns `ShardLayout` | -| Data boundary | `cp_buffers` could mutate loss-side tensors in place | Canonical data stays unchanged; only `model_batch` is sharded | -| Target/result mapping | Manual `seq_index` and CP collectives | Sharder token operations | -| Backward scale | Fixed `loss × DP × CP` | CP fanout is removed; GRPO uses `loss × DP` | - -For `CP=1`, the worker keeps the direct fast path without constructing a sharder. - -### 2.4 X-Token Distillation Workflow Before and After - -The outer algorithm is unchanged: tokenize and align fixed text, export teacher full-vocab -logits over CUDA IPC, then compute projection-based KD and student CE. The refactor changes -how teacher and student model layouts are converted into the contiguous windows required by -the IPC and alignment contracts. - -#### Before - -```mermaid -flowchart TB - A["Dual tokenization and TokenAligner"] --> B["Teacher get_full_logits_ipc"] - B --> C["Teacher cp_buffers and legacy CP context"] - C --> D["Teacher forward
load-balanced logits"] - D --> E["cp_load_balanced_to_contiguous"] - E --> F["Teacher TP×CP CUDA IPC shards"] - - A --> G["student_policy.train"] - F --> G - G --> H["Student cp_buffers
input, mask, and alignment"] - H --> I["Student forward and CP+TP DTensor logits"] - I --> J["Manual student relayout
to a contiguous CP window"] - F --> K["Rebuild teacher full-vocab window"] - J --> L["Projection, chunk aggregation, KD, and CE"] - K --> L - L --> M["backward and optimizer step"] -``` - -Teacher export, student relayout, and alignment localization all depended on the fixed legacy -layout. - -#### After - -```mermaid -flowchart TB - A["Canonical student/teacher IDs and alignment"] --> B["Teacher get_full_logits_ipc"] - B --> C["Teacher ContextParallelSharder"] - C --> D["Teacher forward
local logits"] - D --> E["gather_token_tensor(trim=True)
then slice a contiguous teacher window"] - E --> F["Teacher CUDA IPC shards"] - - A --> G["student_policy.train"] - F --> G - G --> H["Student ContextParallelSharder
and model forward"] - H --> I["Restore canonical logits
then slice the student CP window"] - A --> J["Global shift of IDs, masks, and alignment
then slice the same window"] - F --> K["Rebuild teacher full-vocab window"] - I --> L["Projection and partitioned chunk KD"] - J --> L - K --> L - H --> M["Sharder-aligned window CE
with CP SUM"] - L --> N["KD + CE
backward: loss × DP × CP"] - M --> N -``` - -| Key change | Before | After | -| --- | --- | --- | -| Teacher IPC window | Manual legacy relayout | Sharder gather, trim, then contiguous slice | -| Student loss window | Rebuilt from CP DTensor assumptions | Restored from the actual `ShardLayout` | -| Alignment | Student fields traveled through `cp_buffers` | Canonical fields are globally shifted, then sliced | -| Preserved x-token logic | CUDA IPC, heterogeneous TP/CP, projection, chunk alignment, and multi-teacher aggregation | Unchanged; these remain NeMo-RL responsibilities | - -X-token KD and CE keep a partitioned gradient contract, so `cp_gradient_fanout=1` and the -effective backward scale remains `loss × DP × CP`. This differs from GRPO's replicated -full-sequence loss. - -### 2.5 GRPO Test Results - -We compared `CP=1/2/4` in short GRPO/DAPO runs using `train/reward`, -`train/mean_gen_tokens_per_sample`, and `train/gen_kl_error`. The three CP configurations -show similar short-run trends without a persistent CP-size-dependent shift. These runs check -functional and short-run numerical consistency; they are not long-horizon convergence tests. - -#### Gemma 4 E2B (DAPO) - -![Gemma 4 E2B DAPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/gemma4-e2b.png) - -#### Gemma 4 26B (DAPO) - -![Gemma 4 26B DAPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/gemma4-26b.png) - -#### Qwen3.5 35B-A3B (GRPO) - -![Qwen3.5 35B-A3B GRPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/qwen3.5-35ba3b.png) - -#### Qwen3.5 9B (GRPO) - -![Qwen3.5 9B GRPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/qwen3.5-9b.png) diff --git a/docs/index.md b/docs/index.md index 4d51ad237dd..82e2d421ba1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -372,7 +372,7 @@ design-docs/nemo-gym-integration.md design-docs/modelopt-real-quant-architecture.md design-docs/nccl-reshard-refit.md design-docs/media-token-validity-mask.md -design-docs/automodel-upgrade-intro.md +design-docs/automodel-context-parallel.md ``` ```{toctree} From e9f29445d90de642eb82c6412adcac965898e63d Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Thu, 27 Aug 2026 02:22:31 -0700 Subject: [PATCH 30/34] build(automodel): track r0.6.0 branch Signed-off-by: larkzhang-nv --- 3rdparty/Automodel-workspace/Automodel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/Automodel-workspace/Automodel b/3rdparty/Automodel-workspace/Automodel index 94387e4318b..1814c6c93a6 160000 --- a/3rdparty/Automodel-workspace/Automodel +++ b/3rdparty/Automodel-workspace/Automodel @@ -1 +1 @@ -Subproject commit 94387e4318bfd04cb21ff57782061864e0c7bcec +Subproject commit 1814c6c93a66b9d59d254960ef6a99a64249b671 From 00f52fd6dfef804d4473ce42c867da3028d2eac8 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Thu, 27 Aug 2026 03:22:39 -0700 Subject: [PATCH 31/34] build: drop obsolete SGLang dependency conflicts SGLang now uses Transformers 5.12.1, matching the ModelOpt, NVRx, and NeMo Gym environments. Remove the uv conflict pairs that were only needed while SGLang remained on Transformers 5.6.0. Signed-off-by: larkzhang-nv --- pyproject.toml | 12 -- uv.lock | 331 ++++++++++++++++++++++++------------------------- 2 files changed, 161 insertions(+), 182 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1d66d42a616..b9dc139b872 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -566,18 +566,6 @@ conflicts = [ { extra = "trtllm" }, { extra = "nemo_gym" }, ], - [ - { extra = "sglang" }, - { extra = "modelopt" }, - ], - [ - { extra = "sglang" }, - { extra = "nvrx" }, - ], - [ - { extra = "sglang" }, - { extra = "nemo_gym" }, - ], ] diff --git a/uv.lock b/uv.lock index e68f5373d48..e9048665ebc 100644 --- a/uv.lock +++ b/uv.lock @@ -72,15 +72,6 @@ conflicts = [[ ], [ { package = "nemo-rl", extra = "nemo-gym" }, { package = "nemo-rl", extra = "trtllm" }, -], [ - { package = "nemo-rl", extra = "modelopt" }, - { package = "nemo-rl", extra = "sglang" }, -], [ - { package = "nemo-rl", extra = "nvrx" }, - { package = "nemo-rl", extra = "sglang" }, -], [ - { package = "nemo-rl", extra = "nemo-gym" }, - { package = "nemo-rl", extra = "sglang" }, ]] [manifest] @@ -740,9 +731,9 @@ name = "causal-conv1d" version = "1.5.4" source = { git = "https://github.com/Dao-AILab/causal-conv1d?rev=4f6ae4e26ae5fe8af9372f8d312ab25cc4595223#4f6ae4e26ae5fe8af9372f8d312ab25cc4595223" } dependencies = [ - { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, ] [[package]] @@ -771,7 +762,7 @@ name = "cffi" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } wheels = [ @@ -868,7 +859,7 @@ version = "3.58.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dulwich" }, - { name = "everett", extra = ["ini"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "everett", extra = ["ini"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "jsonschema" }, { name = "psutil" }, { name = "python-box" }, @@ -972,7 +963,7 @@ name = "cryptography" version = "48.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/12/45/870e7f4bef50e5f53b9f51d4428aee5290eedf58ba443f16b1ebb7ab8e66/cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a", size = 832989, upload-time = "2026-06-09T22:32:31.8Z" } wheels = [ @@ -1806,11 +1797,11 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "einops", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "ninja", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "einops", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ninja", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] wheels = [ { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl", hash = "sha256:9fdfbdf2d4ca984ffa34518a4054c62c295fa06e184d7a233848dc06be8f1ec2" }, @@ -1833,11 +1824,11 @@ resolution-markers = [ "platform_machine == 'x86_64' and sys_platform == 'linux'", ] dependencies = [ - { name = "einops", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "ninja", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "einops", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ninja", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] wheels = [ { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl", hash = "sha256:a14fea157eb61dfee56f605a24a7a6150704517759125b3942dd04bffa05d6cf" }, @@ -2041,13 +2032,13 @@ resolution-markers = [ dependencies = [ { name = "apache-tvm-ffi" }, { name = "click" }, - { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm')" }, + { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "einops" }, { name = "ninja" }, { name = "numpy" }, { name = "nvidia-cudnn-frontend" }, - { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "nvidia-ml-py" }, { name = "packaging" }, { name = "requests" }, @@ -2071,7 +2062,7 @@ resolution-markers = [ dependencies = [ { name = "apache-tvm-ffi" }, { name = "click" }, - { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cuda-tile", version = "1.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "einops" }, { name = "ninja" }, { name = "numpy" }, @@ -2294,7 +2285,7 @@ dependencies = [ { name = "googleapis-common-protos" }, { name = "proto-plus" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/03/33/00277be1305fd68355d08197f05e22db259c0cff49a10c8590a1869ade9b/google_api_core-2.32.0.tar.gz", hash = "sha256:2b33aad226b19272458c46abfe5c5a38d9531ece0c44502129a1463ce83674ac", size = 177659, upload-time = "2026-07-16T20:36:07.717Z" } @@ -2321,7 +2312,7 @@ version = "1.75.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } wheels = [ @@ -2435,9 +2426,9 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/b3/1c5951352d6777fd7f99a0ccee04617fdfd8a5dbf2918a1f58c8b2b280b8/grpcio_tools-1.81.1.tar.gz", hash = "sha256:a22a3870180927fdd84e2b27d079ef5b7f5f8c6110181b6736afc17a463481f1", size = 6236155, upload-time = "2026-06-11T12:51:21.235Z" } wheels = [ @@ -2456,9 +2447,9 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4c/ca/af008a0df6f9ec85ae136f763aed207e68097c952a17443d2c2af9d60a91/grpcio_tools-1.82.1.tar.gz", hash = "sha256:2bd3176ccdbf7cd1f463eb75b7b83544c7d6429f5ca8a0f7f784b76097dac891", size = 6399590, upload-time = "2026-07-08T12:38:15.186Z" } wheels = [ @@ -2747,9 +2738,9 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "antlr4-python3-runtime", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "omegaconf", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "antlr4-python3-runtime", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "omegaconf", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/8e/07e42bc434a847154083b315779b0a81d567154504624e181caf2c71cd98/hydra-core-1.3.2.tar.gz", hash = "sha256:8a878ed67216997c3e9d88a8e72e7b4767e81af37afb4ea3334b269a4390a824", size = 3263494, upload-time = "2023-02-23T18:33:43.03Z" } wheels = [ @@ -3206,10 +3197,10 @@ name = "mamba-ssm" version = "2.2.6.post3" source = { git = "https://github.com/state-spaces/mamba.git?rev=a14b1dff0454a3bc27d9eb31355dc01e4b2490ec#a14b1dff0454a3bc27d9eb31355dc01e4b2490ec" } dependencies = [ - { name = "causal-conv1d", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "causal-conv1d", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, ] [[package]] @@ -3357,7 +3348,7 @@ dependencies = [ { name = "flashinfer-cubin", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-python", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" } }, - { name = "megatron-core", extra = ["dev", "mlm"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-core", extra = ["dev", "mlm"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mistral-common" }, { name = "mlflow" }, { name = "nvidia-resiliency-ext" }, @@ -3385,7 +3376,7 @@ ssm = [ { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" } }, ] te = [ - { name = "megatron-core", extra = ["te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-core", extra = ["te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.metadata] @@ -3490,18 +3481,18 @@ dev = [ { name = "einops" }, { name = "emerging-optimizers" }, { name = "fast-hadamard-transform" }, - { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-linear-attention" }, { name = "flashinfer-python", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "hypercorn" }, - { name = "megatron-energon", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-energon", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "multi-storage-client" }, { name = "nemo-lens" }, { name = "nvidia-cudnn-frontend" }, - { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-resiliency-ext" }, { name = "onnxscript" }, - { name = "openai", extra = ["aiohttp"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "openai", extra = ["aiohttp"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "opentelemetry-api" }, { name = "orjson" }, { name = "quart" }, @@ -3520,7 +3511,7 @@ mlm = [ { name = "wandb" }, ] te = [ - { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.metadata] @@ -3763,7 +3754,7 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "packaging" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, { name = "pydantic" }, { name = "python-dotenv" }, { name = "pyyaml" }, @@ -3790,7 +3781,7 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "packaging" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, { name = "pydantic" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/a6/76964d8f265be984838a13b77656b047686c492b61b3f46ca2ef29ef7325/mlflow_tracing-3.15.1.tar.gz", hash = "sha256:ba1c4d873151c0ceeab37f53daf0997feea18a1c092358995072dc53e1944a29", size = 1501188, upload-time = "2026-08-03T09:26:15.541Z" } @@ -3803,7 +3794,7 @@ name = "model-hosting-container-standards" version = "0.1.16" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "httpx" }, { name = "jmespath" }, { name = "pydantic" }, @@ -3972,7 +3963,7 @@ version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ast-serialize" }, - { name = "librt", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, @@ -4042,7 +4033,7 @@ dependencies = [ { name = "datasets" }, { name = "flashoptim" }, { name = "megatron-fsdp" }, - { name = "mistral-common", extra = ["audio", "hf-hub", "sentencepiece"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", extra = ["audio", "hf-hub", "sentencepiece"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mlflow" }, { name = "pybind11" }, { name = "pyyaml" }, @@ -4059,15 +4050,15 @@ dependencies = [ moe = [ { name = "apache-tvm-ffi" }, { name = "causal-conv1d" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-linear-attention" }, { name = "mamba-ssm" }, { name = "nv-grouped-gemm" }, { name = "onnxscript" }, { name = "tile-kernels" }, { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" } }, - { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.metadata] @@ -4201,7 +4192,7 @@ dependencies = [ { name = "fastapi", extra = ["standard"] }, { name = "fonttools" }, { name = "gitpython" }, - { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "hydra-core", version = "1.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "itsdangerous" }, { name = "mcp" }, @@ -4365,7 +4356,7 @@ dependencies = [ { name = "datasets" }, { name = "debugpy" }, { name = "fastokens-b10" }, - { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "hydra-core", version = "1.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "math-verify" }, { name = "matplotlib" }, @@ -4397,14 +4388,14 @@ dependencies = [ { name = "tensorboard" }, { name = "tensordict" }, { name = "tiktoken" }, - { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "timm" }, { name = "torch" }, { name = "torchdata" }, { name = "torchvision" }, { name = "transferqueue" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "triton" }, { name = "wandb" }, @@ -4414,22 +4405,22 @@ dependencies = [ [package.optional-dependencies] automodel = [ { name = "causal-conv1d" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-automodel') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mamba-ssm" }, { name = "mistral-common" }, - { name = "nemo-automodel", extra = ["moe"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nemo-automodel", extra = ["moe"], marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nv-grouped-gemm" }, { name = "tilelang", version = "0.1.11", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, - { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformer-engine", marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] fsdp = [ { name = "causal-conv1d" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "mamba-ssm" }, { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, @@ -4437,24 +4428,24 @@ fsdp = [ mcore = [ { name = "causal-conv1d" }, { name = "cupy-cuda13x" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "flash-attn", version = "2.8.1+cu13torch2.10cxx11abitrue", source = { url = "https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.1/flash_attn-2.8.1+cu13torch2.10cxx11abiTRUE-cp313-cp313-linux_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-mla" }, { name = "flashinfer-cubin", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-jit-cache", version = "0.6.8.post1+cu130", source = { registry = "https://flashinfer.ai/whl/cu130" } }, { name = "flashinfer-python", version = "0.6.8.post1", source = { registry = "https://pypi.org/simple" } }, { name = "mamba-ssm" }, - { name = "megatron-bridge", extra = ["ssm", "te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "megatron-bridge", extra = ["ssm", "te"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvshmem4py-cu13" }, { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" } }, { name = "torch-memory-saver" }, { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, ] modelopt = [ - { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] nemo-gym = [ { name = "nemo-gym" }, @@ -4480,18 +4471,18 @@ trtllm = [ ] vllm = [ { name = "cuda-python" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=29d31c095796f3c8ece47ee9cdcc167051bbeed9#29d31c095796f3c8ece47ee9cdcc167051bbeed9" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "deep-ep", version = "1.2.1+29d31c0", source = { git = "https://github.com/deepseek-ai/DeepEP.git?rev=a48493600c4886c1b297aaa78db0e1ebc2d8dd6c#a48493600c4886c1b297aaa78db0e1ebc2d8dd6c" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "deep-gemm" }, { name = "flashinfer-cubin", version = "0.6.13", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-jit-cache", version = "0.6.13+cu130", source = { registry = "https://flashinfer.ai/whl/cu130" } }, { name = "flashinfer-python", version = "0.6.13", source = { registry = "https://pypi.org/simple" } }, { name = "num2words" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "tilelang", version = "0.1.9", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" } }, - { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_aarch64.whl" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "vllm", version = "0.25.1", source = { url = "https://github.com/vllm-project/vllm/releases/download/v0.25.1/vllm-0.25.1-cp38-abi3-manylinux_2_28_x86_64.whl" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] [package.dev-dependencies] @@ -5173,21 +5164,21 @@ name = "nvidia-modelopt" version = "0.46.0.dev86+gc3b913b9c" source = { git = "https://github.com/NVIDIA/Model-Optimizer?rev=c3b913b9cc1d82d5a0af9fa77b4db87829e6f158#c3b913b9cc1d82d5a0af9fa77b4db87829e6f158" } dependencies = [ - { name = "ninja", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-ml-py", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "omegaconf", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pulp", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pydantic", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "regex", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "rich", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "scipy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "setuptools", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra != 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "ninja" }, + { name = "numpy" }, + { name = "nvidia-ml-py" }, + { name = "omegaconf" }, + { name = "packaging" }, + { name = "pulp" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "rich" }, + { name = "safetensors" }, + { name = "scipy" }, + { name = "setuptools" }, + { name = "torch" }, + { name = "tqdm" }, ] [[package]] @@ -5243,19 +5234,19 @@ name = "nvidia-resiliency-ext" version = "0.6.0" source = { git = "https://github.com/NVIDIA/nvidia-resiliency-ext.git?tag=v0.6.0#6c5f2a13c7688d92a7ac7ee6e464721eb8b7345d" } dependencies = [ - { name = "defusedxml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "grpcio-tools", version = "1.81.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "grpcio-tools", version = "1.82.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "httpx", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "nvidia-ml-py", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "psutil", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, - { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm')" }, + { name = "defusedxml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio-tools", version = "1.81.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "grpcio-tools", version = "1.82.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "httpx", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "numpy", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-ml-py", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "psutil", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-modelopt' or extra == 'extra-7-nemo-rl-nemo-gym' or extra == 'extra-7-nemo-rl-nvrx' or extra == 'extra-7-nemo-rl-sglang' or extra != 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] [[package]] @@ -5331,8 +5322,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ml-dtypes" }, { name = "numpy" }, - { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/19/8ea73a64b368b75fe339771a20a02bc61ea1f551484c9e3d9d0bfbd0450f/onnx-1.22.0.tar.gz", hash = "sha256:ef40c0aaf0b643857ea9306fc7eddce17eaf9fb0407e4801f1fc5758443a38e0", size = 12024721, upload-time = "2026-06-15T12:50:05.354Z" } @@ -5494,7 +5485,7 @@ dependencies = [ { name = "grpcio" }, { name = "httpx" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/5d/4e/8fc4660a1cd57e92f4bc160234c29ef95ffef12b7b442f04a033b7cf7fe2/openshell-0.0.102-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:f9905a5e8fdab13300fac1a911619e3af3bab12e75059dd3b5bdba5067fbdc69", size = 8564345, upload-time = "2026-08-10T15:06:32.369Z" }, @@ -5625,7 +5616,7 @@ version = "1.44.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/64/01/40ac4ae9a149263cc52c2cee200ddd80cb6d8db1a4610abf8eabce0fe771/opentelemetry_proto-1.44.0.tar.gz", hash = "sha256:c547a79c2f8c0c515d31509154682e5921c7cfd5ca67b70e1f9266e2c3e103f3", size = 46488, upload-time = "2026-07-16T15:25:45.34Z" } wheels = [ @@ -5766,7 +5757,7 @@ dependencies = [ { name = "numpy" }, { name = "python-dateutil" }, { name = "pytz" }, - { name = "tzdata", version = "2025.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tzdata", version = "2025.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "tzdata", version = "2026.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } @@ -5822,8 +5813,8 @@ dependencies = [ { name = "safetensors" }, { name = "torch" }, { name = "tqdm" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/86/cf/037f1e3d5186496c05513a6754639e2dab3038a05f384284d49a9bd06a2d/peft-0.19.1.tar.gz", hash = "sha256:0d97542fe96dcdaa20d3b81c06f26f988618f416a73544ab23c3618ccb674a40", size = 763738, upload-time = "2026-04-16T15:46:45.105Z" } wheels = [ @@ -6005,7 +5996,7 @@ version = "1.28.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/87/44/767757fd2cdd4a60d7e4440d9f7b491d6131103d313638d2c03e06c268fb/proto_plus-1.28.1.tar.gz", hash = "sha256:832e68e7fe064cf90ab153b6e5eb935b27891bb89aaeb68b115e9b702f6cb168", size = 57166, upload-time = "2026-07-08T17:04:02.367Z" } wheels = [ @@ -6620,7 +6611,7 @@ name = "pyzmq" version = "27.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "cffi", marker = "implementation_name == 'pypy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ @@ -6645,11 +6636,11 @@ resolution-markers = [ dependencies = [ { name = "apache-tvm-ffi" }, { name = "einops" }, - { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "torch" }, - { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/2a/58/58b82e91b236539f424ff5681e7095b1f2860ddfb7778fe0be14d8fb58de/quack_kernels-0.4.1.tar.gz", hash = "sha256:9d7d6ba412bc0c8a9b1331c52a73db76280adb9dc2f2750df4851ddabef1466b", size = 274766, upload-time = "2026-04-30T14:37:55.65Z" } wheels = [ @@ -6754,7 +6745,7 @@ dependencies = [ { name = "msgpack" }, { name = "packaging" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, { name = "pyyaml" }, { name = "requests" }, ] @@ -7246,7 +7237,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "grpcio" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/d4/beb65e474390131753f9cf984f6ad90e98af46d74836adce78eaf1291eb7/smg_grpc_proto-0.4.14.tar.gz", hash = "sha256:a8ea20872934472c94ffa192bafb2a4f71bc591ab4bfb240cb567801210fbc0f", size = 28677, upload-time = "2026-07-11T08:16:55.404Z" } wheels = [ @@ -7717,7 +7708,7 @@ dependencies = [ { name = "packaging" }, { name = "pillow" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, { name = "setuptools" }, { name = "tensorboard-data-server" }, { name = "werkzeug" }, @@ -7808,7 +7799,7 @@ dependencies = [ { name = "diffusers" }, { name = "einops" }, { name = "etcd-sdk-python" }, - { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "flash-attn-4", version = "4.0.0b11", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-python", version = "0.6.12", source = { registry = "https://pypi.org/simple" } }, { name = "ftfy" }, @@ -7827,9 +7818,9 @@ dependencies = [ { name = "numpy" }, { name = "nvidia-cuda-nvrtc" }, { name = "nvidia-cuda-tileiras" }, - { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-ml-py" }, - { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-modelopt", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvidia-nccl-cu13" }, { name = "nvtx" }, { name = "omegaconf" }, @@ -7849,7 +7840,7 @@ dependencies = [ { name = "psutil" }, { name = "pulp" }, { name = "pydantic" }, - { name = "pydantic-settings", extra = ["yaml"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pydantic-settings", extra = ["yaml"], marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "python-multipart" }, { name = "pyzmq" }, { name = "sentencepiece" }, @@ -8013,18 +8004,18 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "apache-tvm-ffi", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "cloudpickle", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "ml-dtypes", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "numpy", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, - { name = "z3-solver", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "apache-tvm-ffi", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "cloudpickle", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "ml-dtypes", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "numpy", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "psutil", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "setuptools", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "torch", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-sglang') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang' and extra != 'extra-7-nemo-rl-trtllm') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, + { name = "z3-solver", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-fsdp') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (platform_machine == 'x86_64' and extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/56/70/5051f65821baa30a3d61fc48f8ba10c776490315e8c90f82559b92089756/tilelang-0.1.9.tar.gz", hash = "sha256:287f727c913bb648fcf6c1968809ba3390e55eeed257a5c6bb9a80bc05966af4", size = 93395292, upload-time = "2026-04-22T09:19:11.988Z" } wheels = [ @@ -8048,7 +8039,7 @@ dependencies = [ { name = "psutil", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "setuptools", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "torch", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch-c-dlpack-ext", version = "0.1.3", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "torch-c-dlpack-ext", version = "0.1.5", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-fsdp' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-nvrx' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "tqdm", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "typing-extensions", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-trtllm') or (platform_machine != 'x86_64' and extra != 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-vllm' and extra != 'extra-8-nemo-gym-vllm') or extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, @@ -8192,7 +8183,7 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "torch", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "torch", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/1a/adafdc49546ffe0041f52471da51c084243094382b99332b5706e90ba26a/torch_c_dlpack_ext-0.1.3.tar.gz", hash = "sha256:4b5da66432af7224dcf02aad4f13cc416eeef5331cd153588b7e081a193f4972", size = 3334, upload-time = "2025-11-22T03:50:48.089Z" } wheels = [ @@ -8341,7 +8332,7 @@ name = "transferqueue" version = "0.1.9" source = { git = "https://github.com/Ascend/TransferQueue.git?rev=c51614308b68c8d7a87c9b3ef62d59e14c69bde2#c51614308b68c8d7a87c9b3ef62d59e14c69bde2" } dependencies = [ - { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "hydra-core", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "hydra-core", version = "1.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra != 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "msgspec" }, { name = "numpy" }, @@ -8373,15 +8364,15 @@ resolution-markers = [ "platform_machine == 'aarch64' and sys_platform == 'linux'", ] dependencies = [ - { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "numpy", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "packaging", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "regex", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "typer", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "huggingface-hub", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "numpy", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "packaging", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "pyyaml", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "regex", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "safetensors", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tokenizers", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "tqdm", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "typer", marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/1e/1e244ab2ab50a863e6b52cc55761910567fa532b69a6740f6e99c5fdbd98/transformers-5.5.4.tar.gz", hash = "sha256:2e67cadba81fc7608cc07c4dd54f524820bc3d95b1cabd0ef3db7733c4f8b82e", size = 8227649, upload-time = "2026-04-13T16:55:55.181Z" } wheels = [ @@ -8541,7 +8532,7 @@ standard = [ { name = "httptools" }, { name = "python-dotenv" }, { name = "pyyaml" }, - { name = "uvloop", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "watchfiles" }, { name = "websockets" }, ] @@ -8593,26 +8584,26 @@ dependencies = [ { name = "depyf" }, { name = "diskcache" }, { name = "einops" }, - { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "fastsafetensors" }, { name = "filelock" }, { name = "flashinfer-cubin", version = "0.6.12", source = { registry = "https://pypi.org/simple" } }, { name = "flashinfer-python", version = "0.6.12", source = { registry = "https://pypi.org/simple" } }, - { name = "humming-kernels", version = "0.1.6", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, + { name = "humming-kernels", version = "0.1.6", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "ijson" }, { name = "jsonschema" }, { name = "lark" }, { name = "llguidance" }, { name = "lm-format-enforcer" }, { name = "mcp" }, - { name = "mistral-common", marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, + { name = "mistral-common", marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "model-hosting-container-standards" }, { name = "msgspec" }, { name = "ninja" }, { name = "numba", version = "0.65.0", source = { registry = "https://pypi.org/simple" } }, { name = "numpy" }, { name = "nvidia-cudnn-frontend" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm')" }, { name = "openai" }, { name = "openai-harmony" }, { name = "opentelemetry-api" }, @@ -8679,26 +8670,26 @@ dependencies = [ { name = "depyf", marker = "platform_machine != 'x86_64'" }, { name = "diskcache", marker = "platform_machine != 'x86_64'" }, { name = "einops", marker = "platform_machine != 'x86_64'" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "fastsafetensors", marker = "platform_machine != 'x86_64'" }, { name = "filelock", marker = "platform_machine != 'x86_64'" }, { name = "flashinfer-cubin", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "flashinfer-python", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, - { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "ijson", marker = "platform_machine != 'x86_64'" }, { name = "jsonschema", marker = "platform_machine != 'x86_64'" }, { name = "lark", marker = "platform_machine != 'x86_64'" }, { name = "llguidance", marker = "platform_machine != 'x86_64'" }, { name = "lm-format-enforcer", marker = "platform_machine != 'x86_64'" }, { name = "mcp", marker = "platform_machine != 'x86_64'" }, - { name = "mistral-common", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "model-hosting-container-standards", marker = "platform_machine != 'x86_64'" }, { name = "msgspec", marker = "platform_machine != 'x86_64'" }, { name = "ninja", marker = "platform_machine != 'x86_64'" }, { name = "numba", version = "0.65.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine != 'x86_64'" }, { name = "numpy", marker = "platform_machine != 'x86_64'" }, { name = "nvidia-cudnn-frontend", marker = "platform_machine != 'x86_64'" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine != 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvtx", marker = "platform_machine != 'x86_64'" }, { name = "openai", marker = "platform_machine != 'x86_64'" }, { name = "openai-harmony", marker = "platform_machine != 'x86_64'" }, @@ -8869,26 +8860,26 @@ dependencies = [ { name = "depyf", marker = "platform_machine == 'x86_64'" }, { name = "diskcache", marker = "platform_machine == 'x86_64'" }, { name = "einops", marker = "platform_machine == 'x86_64'" }, - { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "fastapi", extra = ["standard"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "fastsafetensors", marker = "platform_machine == 'x86_64'" }, { name = "filelock", marker = "platform_machine == 'x86_64'" }, { name = "flashinfer-cubin", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "flashinfer-python", version = "0.6.13", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, - { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "humming-kernels", version = "0.1.10", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "ijson", marker = "platform_machine == 'x86_64'" }, { name = "jsonschema", marker = "platform_machine == 'x86_64'" }, { name = "lark", marker = "platform_machine == 'x86_64'" }, { name = "llguidance", marker = "platform_machine == 'x86_64'" }, { name = "lm-format-enforcer", marker = "platform_machine == 'x86_64'" }, { name = "mcp", marker = "platform_machine == 'x86_64'" }, - { name = "mistral-common", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "mistral-common", marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "model-hosting-container-standards", marker = "platform_machine == 'x86_64'" }, { name = "msgspec", marker = "platform_machine == 'x86_64'" }, { name = "ninja", marker = "platform_machine == 'x86_64'" }, { name = "numba", version = "0.65.0", source = { registry = "https://pypi.org/simple" }, marker = "platform_machine == 'x86_64'" }, { name = "numpy", marker = "platform_machine == 'x86_64'" }, { name = "nvidia-cudnn-frontend", marker = "platform_machine == 'x86_64'" }, - { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "nvidia-cutlass-dsl", version = "4.5.2", source = { registry = "https://pypi.org/simple" }, extra = ["cu13"], marker = "(platform_machine == 'x86_64' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "nvtx", marker = "platform_machine == 'x86_64'" }, { name = "openai", marker = "platform_machine == 'x86_64'" }, { name = "openai-harmony", marker = "platform_machine == 'x86_64'" }, @@ -9049,7 +9040,7 @@ dependencies = [ { name = "packaging" }, { name = "platformdirs" }, { name = "protobuf", version = "6.33.6", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-automodel' or extra == 'extra-7-nemo-rl-sglang' or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, - { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-modelopt') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nemo-gym') or (extra != 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-nvrx') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-trtllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra != 'extra-7-nemo-rl-modelopt' and extra != 'extra-7-nemo-rl-nemo-gym' and extra != 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "protobuf", version = "7.35.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-fsdp' or extra == 'extra-7-nemo-rl-mcore' or extra == 'extra-7-nemo-rl-trtllm' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra != 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-sglang')" }, { name = "pydantic" }, { name = "pyyaml" }, { name = "requests" }, @@ -9246,7 +9237,7 @@ dependencies = [ { name = "numpy" }, { name = "pydantic" }, { name = "torch" }, - { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm')" }, + { name = "transformers", version = "5.5.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-trtllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-sglang') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-sglang' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-vllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-automodel' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-8-nemo-gym-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-7-nemo-rl-vllm') or (extra == 'extra-7-nemo-rl-mcore' and extra != 'extra-7-nemo-rl-trtllm' and extra == 'extra-8-nemo-gym-vllm')" }, { name = "transformers", version = "5.12.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-7-nemo-rl-sglang' or extra == 'extra-7-nemo-rl-vllm' or extra == 'extra-8-nemo-gym-vllm' or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-fsdp') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-mcore') or (extra == 'extra-7-nemo-rl-automodel' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-fsdp' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-mcore' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-modelopt' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nemo-gym' and extra == 'extra-7-nemo-rl-trtllm') or (extra == 'extra-7-nemo-rl-nvrx' and extra == 'extra-7-nemo-rl-trtllm')" }, { name = "triton", marker = "platform_machine == 'x86_64'" }, { name = "typing-extensions" }, From 254ec1a724f2b7338524c0004eb684e7fe0b5b0f Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Thu, 27 Aug 2026 22:47:41 -0700 Subject: [PATCH 32/34] test(automodel): fix context parallel import ordering Signed-off-by: larkzhang-nv --- tests/unit/models/automodel/test_automodel_context_parallel.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/unit/models/automodel/test_automodel_context_parallel.py b/tests/unit/models/automodel/test_automodel_context_parallel.py index 12f70e78c2f..59d264e445f 100644 --- a/tests/unit/models/automodel/test_automodel_context_parallel.py +++ b/tests/unit/models/automodel/test_automodel_context_parallel.py @@ -36,6 +36,7 @@ round_robin_local_indices, shard_batch_identity, ) + from nemo_rl.algorithms.loss.interfaces import LossInputType from nemo_rl.distributed.batched_data_dict import BatchedDataDict from nemo_rl.distributed.model_utils import ( From 30c26e469558abc9c32466350e54757edcf82194 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 28 Aug 2026 02:37:14 -0700 Subject: [PATCH 33/34] test(automodel): fix async checkpoint tests Signed-off-by: larkzhang-nv --- tests/unit/models/policy/test_dtensor_worker_v2.py | 1 + tests/unit/utils/test_native_checkpoint.py | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/unit/models/policy/test_dtensor_worker_v2.py b/tests/unit/models/policy/test_dtensor_worker_v2.py index a02c6e5c2e7..e4a830946ab 100644 --- a/tests/unit/models/policy/test_dtensor_worker_v2.py +++ b/tests/unit/models/policy/test_dtensor_worker_v2.py @@ -467,6 +467,7 @@ def test_dtensor_v2_checkpoint_save_and_load( optimizer_path=optimizer_path, checkpointing_cfg=checkpointing_config, ) + policy.finalize_async_save() # Verify checkpoint files were created assert os.path.exists(weights_path), "Weights path should exist after save" diff --git a/tests/unit/utils/test_native_checkpoint.py b/tests/unit/utils/test_native_checkpoint.py index 731c34c1036..9c7c4ac6077 100755 --- a/tests/unit/utils/test_native_checkpoint.py +++ b/tests/unit/utils/test_native_checkpoint.py @@ -390,6 +390,7 @@ def test_convert_dcp_to_hf(policy, num_gpus, request): "model_save_format": "torch_save" if policy_version_is_v2 else None, }, ) + policy.finalize_async_save() # Dynamically create the expected set of distcp files based on num_gpus expected_distcp_files = {f"__{rank}_0.distcp" for rank in range(num_gpus)} From f56b445642ff53686895fa264522fcd0a30685c4 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Fri, 28 Aug 2026 08:23:58 -0700 Subject: [PATCH 34/34] fix(ci): fix Qwen-VL weight mapping issue Signed-off-by: larkzhang-nv --- nemo_rl/models/automodel/checkpoint.py | 4 ++++ tests/functional/test_converter_roundtrip.py | 1 + 2 files changed, 5 insertions(+) diff --git a/nemo_rl/models/automodel/checkpoint.py b/nemo_rl/models/automodel/checkpoint.py index 6a5540034fd..bae67b71977 100644 --- a/nemo_rl/models/automodel/checkpoint.py +++ b/nemo_rl/models/automodel/checkpoint.py @@ -95,6 +95,10 @@ def _patched_get_combined_key_mapping(model_type, model_key_mapping=None): result = dict(result or {}) if not any(str(t).startswith("model.visual") for t in result.values()): result[r"^visual\."] = "model.visual." + if not any( + str(t).startswith("model.language_model") for t in result.values() + ): + result[r"^model(?!\.(language_model|visual))"] = "model.language_model" return result or None _patched_get_combined_key_mapping._nrl_vision_patch = True diff --git a/tests/functional/test_converter_roundtrip.py b/tests/functional/test_converter_roundtrip.py index 6d9009de5a8..12347c1e36f 100644 --- a/tests/functional/test_converter_roundtrip.py +++ b/tests/functional/test_converter_roundtrip.py @@ -243,6 +243,7 @@ def create_dcp_checkpoint( policy.save_checkpoint( dcp_checkpoint_path, checkpointing_cfg=config["checkpointing"] ) + policy.finalize_async_save() if not check_file_exists(dcp_checkpoint_path): raise FileNotFoundError(

9l;>3LYb$5nTG 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.sCSl#CHzBrtk~D*($$&QZv|<@afce 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 G`+or2n1Q$e literal 0 HcmV?d00001 diff --git a/docs/assets/cp-upgrade-exp/gemma4-e2b.png b/docs/assets/cp-upgrade-exp/gemma4-e2b.png new file mode 100644 index 0000000000000000000000000000000000000000..85991edc1f59907ea427c391e765682d6fa3b0dd GIT binary patch literal 176236 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ⅇUQ7Wbt}lPp6Ei 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 literal 0 HcmV?d00001 diff --git a/docs/design-docs/automodel-upgrade-intro.md b/docs/design-docs/automodel-upgrade-intro.md new file mode 100644 index 00000000000..e9fdeff5d75 --- /dev/null +++ b/docs/design-docs/automodel-upgrade-intro.md @@ -0,0 +1,207 @@ +# Automodel r0.6.0 Upgrade and Context-Parallel Integration + +This PR updates NeMo-RL for Automodel r0.6.0 and migrates the DTensor v2 +context-parallel (CP) path to Automodel's model-owned sharding protocol. The comparison is +based on NeMo-RL commits +[`72d48e7f`](https://github.com/NVIDIA-NeMo/RL/commit/72d48e7ff0cb8d1076520f89e853f3f53aa97472) +and +[`11e14e91`](https://github.com/NVIDIA-NeMo/RL/commit/11e14e91af64f9c4136ab97fa2191a3de5a1af1d). + +## 1. Automodel API Updates + +The r0.6.0 upgrade consolidates distributed setup and model loading: + +| Area | Before | After | +| --- | --- | --- | +| Device mesh | `create_device_mesh(...)` | `MeshContext.build(FSDP2Config, ParallelismSizes, ...)` | +| Model loading | Separate mesh, FSDP, MoE, and activation-checkpointing arguments | One `DistributedSetup` passed to `from_pretrained()` | +| FSDP backend | `FSDP2Config(backend="nccl")` | `backend` removed; mesh setup selects NCCL | +| MoE config import | `components.moe.config` | `components.distributed.config` | + +The main upstream change is Automodel +[#2266](https://github.com/NVIDIA-NeMo/Automodel/pull/2266). This PR also updates moved +modules and checkpoint helpers, and removes obsolete local shims and compatibility +workarounds ([#3187](https://github.com/NVIDIA-NeMo/Automodel/pull/3187), +[#1172](https://github.com/NVIDIA-NeMo/Automodel/pull/1172), +[#2289](https://github.com/NVIDIA-NeMo/Automodel/pull/2289), +[#1634](https://github.com/NVIDIA-NeMo/Automodel/pull/1634), and +[#2419](https://github.com/NVIDIA-NeMo/Automodel/pull/2419)). + +## 2. CP API Changes and Support Scope + +This section covers the Automodel DTensor v2 training path only. Megatron-Core CP is out of +scope. The pre-refactor support summary uses NeMo-RL +[`dd39d384`](https://github.com/NVIDIA-NeMo/RL/commit/dd39d384db8727f95069f33327047740d70e19a9) +as the baseline. + +### 2.1 Automodel CP API Changes + +Automodel [#2937](https://github.com/NVIDIA-NeMo/Automodel/pull/2937) introduced +`ContextParallelSharder`, making Automodel the single owner of the model's token layout. + +| Before | After | +| --- | --- | +| NeMo-RL builds `cp_buffers` and `seq_index` | `ContextParallelSharder.shard()` pads and shards the model batch | +| Workers call `create_context_parallel_ctx()` directly | `shard()` returns the model forward context | +| Loss code assumes the legacy head-tail layout | `ShardLayout` describes the layout selected for this forward | +| NeMo-RL manually shards and gathers token tensors | `shard_token_tensor()` and `gather_token_tensor()` reuse the model layout | + +Automodel now owns layout selection, padding, and attention transport. NeMo-RL retains the +canonical RL data, loss semantics, TP vocabulary operations, public outputs, and backward +scaling. + +### 2.2 Pre-Refactor CP Support + +The legacy implementation supported the following combinations, subject to its fixed +round-robin layout: + +| Scope | CP support | Notes | +| --- | --- | --- | +| Text LLM | Supported | Policy forward, loss, logprob, and logits post-processing had CP paths | +| VLM | Not supported | Model setup and batch processing rejected multimodal input with `CP>1` | +| Gemma 3 / Qwen3.5 dense | Not supported | Explicit model guards; Qwen3.5 MoE required its designated backend | +| GRPO / DAPO | Supported | CP-aware logprob and policy loss paths; DTensor CP recipes existed | +| SFT | Supported | Reused the generic policy loss path | +| DPO | Supported | Restored full-sequence policy/reference logprobs before DPO loss | +| Same-tokenizer distillation | Supported | Teacher top-k export and student distillation loss were CP-aware | +| X-token distillation | Supported with a specialized path | Supported heterogeneous teacher/student TP and CP; no sequence packing | +| PPO | Not supported end to end | The actor path supported CP, but the Automodel critic/value path required `CP=1` | +| Reward model training | Not supported | The DTensor RM entry point rejected `CP>1` | + +Additional restrictions were `CP + sequence packing`, `CP + DTensor sequence parallel`, and +sequence lengths incompatible with the legacy `2 * cp_size` load-balanced split. + +### 2.3 GRPO Workflow Before and After + +The GRPO algorithm remains unchanged. The refactor changes how `policy.train()` and +`policy.get_logprobs()` map between canonical RL data and the model's local CP layout. + +#### Before + +```mermaid +flowchart TB + A["Rollout, reward, and advantage"] --> B["policy.train"] + B --> C["Build cp_buffers and seq_index"] + C --> D["create_context_parallel_ctx"] + D --> E["Model forward
local logits"] + E --> F["prepare_data_for_cp
CP+TP DTensor logits"] + F --> G["Recompute the local target layout
from seq_index"] + G --> H["TP target logprob"] + H --> I["CP all-gather and reorder
full logprobs"] + I --> J["Replicated ClippedPGLossFn"] + J --> K["backward: loss × DP × CP"] +``` + +NeMo-RL implemented the layout twice: once for the model input and again for targets and +logprobs. This coupled the loss path to Automodel's legacy round-robin assumptions. + +#### After + +```mermaid +flowchart TB + A["Rollout, reward, and advantage"] --> B["policy.train"] + B --> C["Keep canonical data
build a private model_batch"] + C --> D["ContextParallelSharder.shard"] + D --> E["Automodel ShardLayout and context
model forward"] + C --> F["Global next-token shift"] + F --> G["shard_token_tensor
local targets"] + E --> H["TP target logprob"] + G --> H + H --> I["gather_token_tensor(trim=True)
canonical full logprobs"] + I --> J["Replicated ClippedPGLossFn"] + J --> K["Correct CP gradient fanout
backward: loss × DP"] +``` + +| Key change | Before | After | +| --- | --- | --- | +| Layout owner | Automodel and NeMo-RL both encoded the layout | Automodel owns `ShardLayout` | +| Data boundary | `cp_buffers` could mutate loss-side tensors in place | Canonical data stays unchanged; only `model_batch` is sharded | +| Target/result mapping | Manual `seq_index` and CP collectives | Sharder token operations | +| Backward scale | Fixed `loss × DP × CP` | CP fanout is removed; GRPO uses `loss × DP` | + +For `CP=1`, the worker keeps the direct fast path without constructing a sharder. + +### 2.4 X-Token Distillation Workflow Before and After + +The outer algorithm is unchanged: tokenize and align fixed text, export teacher full-vocab +logits over CUDA IPC, then compute projection-based KD and student CE. The refactor changes +how teacher and student model layouts are converted into the contiguous windows required by +the IPC and alignment contracts. + +#### Before + +```mermaid +flowchart TB + A["Dual tokenization and TokenAligner"] --> B["Teacher get_full_logits_ipc"] + B --> C["Teacher cp_buffers and legacy CP context"] + C --> D["Teacher forward
load-balanced logits"] + D --> E["cp_load_balanced_to_contiguous"] + E --> F["Teacher TP×CP CUDA IPC shards"] + + A --> G["student_policy.train"] + F --> G + G --> H["Student cp_buffers
input, mask, and alignment"] + H --> I["Student forward and CP+TP DTensor logits"] + I --> J["Manual student relayout
to a contiguous CP window"] + F --> K["Rebuild teacher full-vocab window"] + J --> L["Projection, chunk aggregation, KD, and CE"] + K --> L + L --> M["backward and optimizer step"] +``` + +Teacher export, student relayout, and alignment localization all depended on the fixed legacy +layout. + +#### After + +```mermaid +flowchart TB + A["Canonical student/teacher IDs and alignment"] --> B["Teacher get_full_logits_ipc"] + B --> C["Teacher ContextParallelSharder"] + C --> D["Teacher forward
local logits"] + D --> E["gather_token_tensor(trim=True)
then slice a contiguous teacher window"] + E --> F["Teacher CUDA IPC shards"] + + A --> G["student_policy.train"] + F --> G + G --> H["Student ContextParallelSharder
and model forward"] + H --> I["Restore canonical logits
then slice the student CP window"] + A --> J["Global shift of IDs, masks, and alignment
then slice the same window"] + F --> K["Rebuild teacher full-vocab window"] + I --> L["Projection and partitioned chunk KD"] + J --> L + K --> L + H --> M["Sharder-aligned window CE
with CP SUM"] + L --> N["KD + CE
backward: loss × DP × CP"] + M --> N +``` + +| Key change | Before | After | +| --- | --- | --- | +| Teacher IPC window | Manual legacy relayout | Sharder gather, trim, then contiguous slice | +| Student loss window | Rebuilt from CP DTensor assumptions | Restored from the actual `ShardLayout` | +| Alignment | Student fields traveled through `cp_buffers` | Canonical fields are globally shifted, then sliced | +| Preserved x-token logic | CUDA IPC, heterogeneous TP/CP, projection, chunk alignment, and multi-teacher aggregation | Unchanged; these remain NeMo-RL responsibilities | + +X-token KD and CE keep a partitioned gradient contract, so `cp_gradient_fanout=1` and the +effective backward scale remains `loss × DP × CP`. This differs from GRPO's replicated +full-sequence loss. + +### 2.5 GRPO Test Results + +We compared `CP=1/2/4` over 20 GRPO/DAPO steps using `train/reward`, +`train/mean_gen_tokens_per_sample`, and `train/gen_kl_error`. The three CP configurations +show similar short-run trends without a persistent CP-size-dependent shift. These runs check +functional and short-run numerical consistency; they are not long-horizon convergence tests. + +#### Gemma 4 E2B (DAPO) + +![Gemma 4 E2B DAPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/gemma4-e2b.png) + +#### Gemma 4 26B (DAPO) + +![Gemma 4 26B DAPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/gemma4-26b.png) + +#### Qwen3.5 35B-A3B (GRPO) + +![Qwen3.5 35B-A3B GRPO comparison for CP1, CP2, and CP4](../assets/cp-upgrade-exp/qwen3.5-35ba3b.png) From 2f373521084d5856f0426dc96a2096807a967fb6 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Wed, 5 Aug 2026 00:00:33 -0700 Subject: [PATCH 11/34] docs: update Automodel upgrade introduction Signed-off-by: larkzhang-nv --- docs/design-docs/automodel-upgrade-intro.md | 111 +++++++++++++++----- docs/index.md | 1 + 2 files changed, 83 insertions(+), 29 deletions(-) diff --git a/docs/design-docs/automodel-upgrade-intro.md b/docs/design-docs/automodel-upgrade-intro.md index e9fdeff5d75..4bb6ae3a448 100644 --- a/docs/design-docs/automodel-upgrade-intro.md +++ b/docs/design-docs/automodel-upgrade-intro.md @@ -1,13 +1,26 @@ # Automodel r0.6.0 Upgrade and Context-Parallel Integration This PR updates NeMo-RL for Automodel r0.6.0 and migrates the DTensor v2 -context-parallel (CP) path to Automodel's model-owned sharding protocol. The comparison is -based on NeMo-RL commits -[`72d48e7f`](https://github.com/NVIDIA-NeMo/RL/commit/72d48e7ff0cb8d1076520f89e853f3f53aa97472) -and -[`11e14e91`](https://github.com/NVIDIA-NeMo/RL/commit/11e14e91af64f9c4136ab97fa2191a3de5a1af1d). +context-parallel (CP) path to Automodel's model-owned sharding protocol. -## 1. Automodel API Updates +## 1. Automodel r0.6.0 Upgrade + +### 1.1 Environment Upgrade + +Automodel r0.6.0 requires the following dependency updates in `pyproject.toml`; `uv.lock` +is regenerated accordingly: + +| Dependency | Before | After | +| --- | --- | --- | +| Base `transformers` range | `>=5.5.0,<5.9.0` | `>=5.5.0,<5.13.0` | +| Automodel extra | `transformers>=5.5.0,<5.6.0` | `transformers>=5.12.1,<5.13.0` | +| `megatron-fsdp` | No root constraint | Git constraint at [`455389c4`](https://github.com/yuhezhang-ai/Megatron-LM/commit/455389c480af6b3acdca74c7830c68b3274eb083) | + +The Transformers update matches Automodel's `transformers==5.12.1` pin. The +`megatron-fsdp` constraint mirrors Automodel's Megatron-LM fork and revision so `uv` can +resolve the transitive URL dependency consistently. + +### 1.2 Automodel API Updates The r0.6.0 upgrade consolidates distributed setup and model loading: @@ -18,37 +31,77 @@ The r0.6.0 upgrade consolidates distributed setup and model loading: | FSDP backend | `FSDP2Config(backend="nccl")` | `backend` removed; mesh setup selects NCCL | | MoE config import | `components.moe.config` | `components.distributed.config` | -The main upstream change is Automodel -[#2266](https://github.com/NVIDIA-NeMo/Automodel/pull/2266). This PR also updates moved -modules and checkpoint helpers, and removes obsolete local shims and compatibility -workarounds ([#3187](https://github.com/NVIDIA-NeMo/Automodel/pull/3187), -[#1172](https://github.com/NVIDIA-NeMo/Automodel/pull/1172), -[#2289](https://github.com/NVIDIA-NeMo/Automodel/pull/2289), -[#1634](https://github.com/NVIDIA-NeMo/Automodel/pull/1634), and -[#2419](https://github.com/NVIDIA-NeMo/Automodel/pull/2419)). +The simplified call pattern is shown below. The main upstream change is Automodel +[#2266](https://github.com/NVIDIA-NeMo/Automodel/pull/2266). + +```python +mesh_context = MeshContext.build( + fsdp2_config, + ParallelismSizes(tp_size=tp_size, cp_size=cp_size, ep_size=ep_size), + world_size=world_size, +) + +distributed_setup = DistributedSetup( + mesh_context=mesh_context, + strategy_config=fsdp2_config, + pipeline_config=None, + moe_parallel_config=moe_config if ep_size > 1 else None, + activation_checkpointing=activation_checkpointing, +) + +model = model_class.from_pretrained( + model_name, + distributed_setup=distributed_setup, + # Other model arguments remain unchanged. +) +``` + +Other module and checkpoint API changes: + +- `BackendConfig` now comes from `components.models.common.utils` + ([#1172](https://github.com/NVIDIA-NeMo/Automodel/pull/1172)). +- `Checkpointer._should_write_hf_metadata()` became the module-level + `_should_write_hf_metadata(config)`, and `save_consolidated` now uses enum semantics. + Call `_normalize_save_consolidated()` after updating checkpoint configuration through + `setattr` ([#2289](https://github.com/NVIDIA-NeMo/Automodel/pull/2289)). + +The upgrade also removes three compatibility workarounds: + +- Use Automodel's exported `NeMoAutoModelForTokenClassification` directly instead of the + local NeMo-RL shim ([#1634](https://github.com/NVIDIA-NeMo/Automodel/pull/1634)). +- Remove the `_restore_loaded_model_dtype()` monkeypatch; Automodel now preserves an + explicitly requested FP32 parameter dtype + ([#2419](https://github.com/NVIDIA-NeMo/Automodel/pull/2419)). +- Remove the Gemma 4 KV-sharing `use_cache=True` workaround. This is enabled by the newer + Transformers version used with r0.6.0, rather than by an Automodel API change + ([Transformers #45312](https://github.com/huggingface/transformers/pull/45312)). ## 2. CP API Changes and Support Scope -This section covers the Automodel DTensor v2 training path only. Megatron-Core CP is out of -scope. The pre-refactor support summary uses NeMo-RL -[`dd39d384`](https://github.com/NVIDIA-NeMo/RL/commit/dd39d384db8727f95069f33327047740d70e19a9) -as the baseline. +This section covers the Automodel DTensor v2 training path only. ### 2.1 Automodel CP API Changes -Automodel [#2937](https://github.com/NVIDIA-NeMo/Automodel/pull/2937) introduced -`ContextParallelSharder`, making Automodel the single owner of the model's token layout. +Automodel [#2937](https://github.com/NVIDIA-NeMo/Automodel/pull/2937) unifies CP handling +across models and attention backends through `ContextParallelSharder`. A basic call is: + +```python +cp_sharder = ContextParallelSharder(model, device_mesh, batch) +train_ctx, sharded_batch = cp_sharder.shard(batch) + +with train_ctx(): + output = model(**sharded_batch) +``` -| Before | After | -| --- | --- | -| NeMo-RL builds `cp_buffers` and `seq_index` | `ContextParallelSharder.shard()` pads and shards the model batch | -| Workers call `create_context_parallel_ctx()` directly | `shard()` returns the model forward context | -| Loss code assumes the legacy head-tail layout | `ShardLayout` describes the layout selected for this forward | -| NeMo-RL manually shards and gathers token tensors | `shard_token_tensor()` and `gather_token_tensor()` reuse the model layout | +`shard()` selects the model-specific layout, pads and shards the batch, and returns the +forward context required by the attention backend. Its `ShardLayout` records the global +position of each local token and the sequence lengths before and after padding. Callers +therefore consume the actual layout used by the forward instead of assuming how tokens +were partitioned. -Automodel now owns layout selection, padding, and attention transport. NeMo-RL retains the -canonical RL data, loss semantics, TP vocabulary operations, public outputs, and backward -scaling. +This creates a clear ownership boundary: Automodel manages the CP layout and communication +for model inputs, while NeMo-RL reuses that layout to compute RL losses and restore public +outputs such as logprobs and top-k logits. ### 2.2 Pre-Refactor CP Support diff --git a/docs/index.md b/docs/index.md index d32943ff391..4d51ad237dd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -372,6 +372,7 @@ design-docs/nemo-gym-integration.md design-docs/modelopt-real-quant-architecture.md design-docs/nccl-reshard-refit.md design-docs/media-token-validity-mask.md +design-docs/automodel-upgrade-intro.md ``` ```{toctree} From 605eafa535e9c9909cf477b4905a33cd20d7c800 Mon Sep 17 00:00:00 2001 From: larkzhang-nv Date: Wed, 5 Aug 2026 00:26:00 -0700 Subject: [PATCH 12/34] docs: add Qwen3.5 9B CP results Signed-off-by: larkzhang-nv --- docs/assets/cp-upgrade-exp/qwen3.5-9b.png | Bin 0 -> 169571 bytes docs/design-docs/automodel-upgrade-intro.md | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/assets/cp-upgrade-exp/qwen3.5-9b.png diff --git a/docs/assets/cp-upgrade-exp/qwen3.5-9b.png b/docs/assets/cp-upgrade-exp/qwen3.5-9b.png new file mode 100644 index 0000000000000000000000000000000000000000..723c7dc5a816e0ea2e5c2c2b9636285e71b8664a GIT binary patch literal 169571 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