torchx-nightly 2025.10.15__py3-none-any.whl → 2025.10.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of torchx-nightly might be problematic. Click here for more details.
- torchx/specs/api.py +91 -12
- {torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/METADATA +4 -4
- {torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/RECORD +7 -7
- {torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/LICENSE +0 -0
- {torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/WHEEL +0 -0
- {torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/entry_points.txt +0 -0
- {torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/top_level.txt +0 -0
torchx/specs/api.py
CHANGED
|
@@ -15,9 +15,10 @@ import os
|
|
|
15
15
|
import pathlib
|
|
16
16
|
import re
|
|
17
17
|
import typing
|
|
18
|
+
import warnings
|
|
18
19
|
from dataclasses import asdict, dataclass, field
|
|
19
20
|
from datetime import datetime
|
|
20
|
-
from enum import Enum
|
|
21
|
+
from enum import Enum, IntEnum
|
|
21
22
|
from json import JSONDecodeError
|
|
22
23
|
from string import Template
|
|
23
24
|
from typing import (
|
|
@@ -891,14 +892,42 @@ class runopt:
|
|
|
891
892
|
Represents the metadata about the specific run option
|
|
892
893
|
"""
|
|
893
894
|
|
|
895
|
+
class AutoAlias(IntEnum):
|
|
896
|
+
snake_case = 0x1
|
|
897
|
+
SNAKE_CASE = 0x2
|
|
898
|
+
camelCase = 0x4
|
|
899
|
+
|
|
900
|
+
@staticmethod
|
|
901
|
+
def convert_to_camel_case(alias: str) -> str:
|
|
902
|
+
words = re.split(r"[_\-\s]+|(?<=[a-z])(?=[A-Z])", alias)
|
|
903
|
+
words = [w for w in words if w] # Remove empty strings
|
|
904
|
+
if not words:
|
|
905
|
+
return ""
|
|
906
|
+
return words[0].lower() + "".join(w.capitalize() for w in words[1:])
|
|
907
|
+
|
|
908
|
+
@staticmethod
|
|
909
|
+
def convert_to_snake_case(alias: str) -> str:
|
|
910
|
+
alias = re.sub(r"[-\s]+", "_", alias)
|
|
911
|
+
alias = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", alias)
|
|
912
|
+
alias = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", alias)
|
|
913
|
+
return alias.lower()
|
|
914
|
+
|
|
915
|
+
@staticmethod
|
|
916
|
+
def convert_to_const_case(alias: str) -> str:
|
|
917
|
+
return runopt.AutoAlias.convert_to_snake_case(alias).upper()
|
|
918
|
+
|
|
894
919
|
class alias(str):
|
|
895
920
|
pass
|
|
896
921
|
|
|
922
|
+
class deprecated(str):
|
|
923
|
+
pass
|
|
924
|
+
|
|
897
925
|
default: CfgVal
|
|
898
926
|
opt_type: Type[CfgVal]
|
|
899
927
|
is_required: bool
|
|
900
928
|
help: str
|
|
901
|
-
aliases:
|
|
929
|
+
aliases: set[alias] | None = None
|
|
930
|
+
deprecated_aliases: set[deprecated] | None = None
|
|
902
931
|
|
|
903
932
|
@property
|
|
904
933
|
def is_type_list_of_str(self) -> bool:
|
|
@@ -990,7 +1019,7 @@ class runopts:
|
|
|
990
1019
|
|
|
991
1020
|
def __init__(self) -> None:
|
|
992
1021
|
self._opts: Dict[str, runopt] = {}
|
|
993
|
-
self._alias_to_key: dict[
|
|
1022
|
+
self._alias_to_key: dict[str, str] = {}
|
|
994
1023
|
|
|
995
1024
|
def __iter__(self) -> Iterator[Tuple[str, runopt]]:
|
|
996
1025
|
return self._opts.items().__iter__()
|
|
@@ -1044,12 +1073,24 @@ class runopts:
|
|
|
1044
1073
|
val = resolved_cfg.get(cfg_key)
|
|
1045
1074
|
resolved_name = None
|
|
1046
1075
|
aliases = runopt.aliases or []
|
|
1076
|
+
deprecated_aliases = runopt.deprecated_aliases or []
|
|
1047
1077
|
if val is None:
|
|
1048
1078
|
for alias in aliases:
|
|
1049
1079
|
val = resolved_cfg.get(alias)
|
|
1050
1080
|
if alias in cfg or val is not None:
|
|
1051
1081
|
resolved_name = alias
|
|
1052
1082
|
break
|
|
1083
|
+
for alias in deprecated_aliases:
|
|
1084
|
+
val = resolved_cfg.get(alias)
|
|
1085
|
+
if val is not None:
|
|
1086
|
+
resolved_name = alias
|
|
1087
|
+
use_instead = self._alias_to_key.get(alias)
|
|
1088
|
+
warnings.warn(
|
|
1089
|
+
f"Run option `{alias}` is deprecated, use `{use_instead}` instead",
|
|
1090
|
+
UserWarning,
|
|
1091
|
+
stacklevel=2,
|
|
1092
|
+
)
|
|
1093
|
+
break
|
|
1053
1094
|
else:
|
|
1054
1095
|
resolved_name = cfg_key
|
|
1055
1096
|
for alias in aliases:
|
|
@@ -1172,23 +1213,51 @@ class runopts:
|
|
|
1172
1213
|
cfg[key] = val
|
|
1173
1214
|
return cfg
|
|
1174
1215
|
|
|
1216
|
+
def _generate_aliases(
|
|
1217
|
+
self, auto_alias: int, aliases: set[str]
|
|
1218
|
+
) -> set[runopt.alias]:
|
|
1219
|
+
generated_aliases = set()
|
|
1220
|
+
for alias in aliases:
|
|
1221
|
+
if auto_alias & runopt.AutoAlias.camelCase:
|
|
1222
|
+
generated_aliases.add(runopt.AutoAlias.convert_to_camel_case(alias))
|
|
1223
|
+
if auto_alias & runopt.AutoAlias.snake_case:
|
|
1224
|
+
generated_aliases.add(runopt.AutoAlias.convert_to_snake_case(alias))
|
|
1225
|
+
if auto_alias & runopt.AutoAlias.SNAKE_CASE:
|
|
1226
|
+
generated_aliases.add(runopt.AutoAlias.convert_to_const_case(alias))
|
|
1227
|
+
return generated_aliases
|
|
1228
|
+
|
|
1175
1229
|
def _get_primary_key_and_aliases(
|
|
1176
1230
|
self,
|
|
1177
|
-
cfg_key: list[str] | str,
|
|
1178
|
-
) -> tuple[str,
|
|
1231
|
+
cfg_key: list[str | int] | str,
|
|
1232
|
+
) -> tuple[str, set[runopt.alias], set[runopt.deprecated]]:
|
|
1179
1233
|
"""
|
|
1180
1234
|
Returns the primary key and aliases for the given cfg_key.
|
|
1181
1235
|
"""
|
|
1182
1236
|
if isinstance(cfg_key, str):
|
|
1183
|
-
return cfg_key,
|
|
1237
|
+
return cfg_key, set(), set()
|
|
1184
1238
|
|
|
1185
1239
|
if len(cfg_key) == 0:
|
|
1186
1240
|
raise ValueError("cfg_key must be a non-empty list")
|
|
1241
|
+
|
|
1242
|
+
if isinstance(cfg_key[0], runopt.alias) or isinstance(
|
|
1243
|
+
cfg_key[0], runopt.deprecated
|
|
1244
|
+
):
|
|
1245
|
+
warnings.warn(
|
|
1246
|
+
"The main name of the run option should be the head of the list.",
|
|
1247
|
+
UserWarning,
|
|
1248
|
+
stacklevel=2,
|
|
1249
|
+
)
|
|
1187
1250
|
primary_key = None
|
|
1188
|
-
|
|
1251
|
+
auto_alias = 0x0
|
|
1252
|
+
aliases = set[runopt.alias]()
|
|
1253
|
+
deprecated_aliases = set[runopt.deprecated]()
|
|
1189
1254
|
for name in cfg_key:
|
|
1190
1255
|
if isinstance(name, runopt.alias):
|
|
1191
|
-
aliases.
|
|
1256
|
+
aliases.add(name)
|
|
1257
|
+
elif isinstance(name, runopt.deprecated):
|
|
1258
|
+
deprecated_aliases.add(name)
|
|
1259
|
+
elif isinstance(name, int):
|
|
1260
|
+
auto_alias = auto_alias | name
|
|
1192
1261
|
else:
|
|
1193
1262
|
if primary_key is not None:
|
|
1194
1263
|
raise ValueError(
|
|
@@ -1199,11 +1268,17 @@ class runopts:
|
|
|
1199
1268
|
raise ValueError(
|
|
1200
1269
|
"Missing cfg_key. Please provide one other than the aliases."
|
|
1201
1270
|
)
|
|
1202
|
-
|
|
1271
|
+
if auto_alias != 0x0:
|
|
1272
|
+
aliases_to_generate_for = aliases | {primary_key}
|
|
1273
|
+
additional_aliases = self._generate_aliases(
|
|
1274
|
+
auto_alias, aliases_to_generate_for
|
|
1275
|
+
)
|
|
1276
|
+
aliases.update(additional_aliases)
|
|
1277
|
+
return primary_key, aliases, deprecated_aliases
|
|
1203
1278
|
|
|
1204
1279
|
def add(
|
|
1205
1280
|
self,
|
|
1206
|
-
cfg_key: str | list[str],
|
|
1281
|
+
cfg_key: str | list[str | int],
|
|
1207
1282
|
type_: Type[CfgVal],
|
|
1208
1283
|
help: str,
|
|
1209
1284
|
default: CfgVal = None,
|
|
@@ -1214,7 +1289,9 @@ class runopts:
|
|
|
1214
1289
|
value (if any). If the ``default`` is not specified then this option
|
|
1215
1290
|
is a required option.
|
|
1216
1291
|
"""
|
|
1217
|
-
primary_key, aliases = self._get_primary_key_and_aliases(
|
|
1292
|
+
primary_key, aliases, deprecated_aliases = self._get_primary_key_and_aliases(
|
|
1293
|
+
cfg_key
|
|
1294
|
+
)
|
|
1218
1295
|
if required and default is not None:
|
|
1219
1296
|
raise ValueError(
|
|
1220
1297
|
f"Required option: {cfg_key} must not specify default value. Given: {default}"
|
|
@@ -1225,9 +1302,11 @@ class runopts:
|
|
|
1225
1302
|
f"Option: {cfg_key}, must be of type: {type_}."
|
|
1226
1303
|
f" Given: {default} ({type(default).__name__})"
|
|
1227
1304
|
)
|
|
1228
|
-
opt = runopt(default, type_, required, help, aliases)
|
|
1305
|
+
opt = runopt(default, type_, required, help, aliases, deprecated_aliases)
|
|
1229
1306
|
for alias in aliases:
|
|
1230
1307
|
self._alias_to_key[alias] = primary_key
|
|
1308
|
+
for deprecated_alias in deprecated_aliases:
|
|
1309
|
+
self._alias_to_key[deprecated_alias] = primary_key
|
|
1231
1310
|
self._opts[primary_key] = opt
|
|
1232
1311
|
|
|
1233
1312
|
def update(self, other: "runopts") -> None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: torchx-nightly
|
|
3
|
-
Version: 2025.10.
|
|
3
|
+
Version: 2025.10.17
|
|
4
4
|
Summary: TorchX SDK and Components
|
|
5
5
|
Home-page: https://github.com/meta-pytorch/torchx
|
|
6
6
|
Author: TorchX Devs
|
|
@@ -47,11 +47,11 @@ Requires-Dist: pytorch-lightning==2.5.0; extra == "dev"
|
|
|
47
47
|
Requires-Dist: tensorboard==2.14.0; extra == "dev"
|
|
48
48
|
Requires-Dist: sagemaker==2.230.0; extra == "dev"
|
|
49
49
|
Requires-Dist: torch-model-archiver>=0.4.2; extra == "dev"
|
|
50
|
-
Requires-Dist: torch
|
|
50
|
+
Requires-Dist: torch; extra == "dev"
|
|
51
51
|
Requires-Dist: torchmetrics==1.6.3; extra == "dev"
|
|
52
52
|
Requires-Dist: torchserve>=0.10.0; extra == "dev"
|
|
53
|
-
Requires-Dist: torchtext
|
|
54
|
-
Requires-Dist: torchvision
|
|
53
|
+
Requires-Dist: torchtext; extra == "dev"
|
|
54
|
+
Requires-Dist: torchvision; extra == "dev"
|
|
55
55
|
Requires-Dist: typing-extensions; extra == "dev"
|
|
56
56
|
Requires-Dist: ts==0.5.1; extra == "dev"
|
|
57
57
|
Requires-Dist: wheel; extra == "dev"
|
|
@@ -70,7 +70,7 @@ torchx/schedulers/lsf_scheduler.py,sha256=YS6Yel8tXJqLPxbcGz95lZG2nCi36AQXdNDyuB
|
|
|
70
70
|
torchx/schedulers/slurm_scheduler.py,sha256=vypGaCZe61bkyNkqRlK4Iwmk_NaAUQi-DsspaWd6BZw,31873
|
|
71
71
|
torchx/schedulers/streams.py,sha256=8_SLezgnWgfv_zXUsJCUM34-h2dtv25NmZuxEwkzmxw,2007
|
|
72
72
|
torchx/specs/__init__.py,sha256=SXS4r_roOkbbAL-p7EY5fl5ou-AG7S9Ck-zKtRBdHOk,6760
|
|
73
|
-
torchx/specs/api.py,sha256=
|
|
73
|
+
torchx/specs/api.py,sha256=mRX6sqBQOpEVuyR3M-tK3LqSGNNVzqoOSIWM6FolqZQ,51118
|
|
74
74
|
torchx/specs/builders.py,sha256=Ye3of4MupJ-da8vLaX6_-nzGo_FRw1BFpYsX6dAZCNk,13730
|
|
75
75
|
torchx/specs/file_linter.py,sha256=z0c4mKJv47BWiPaWCdUM0A8kHwnj4b1s7oTmESuD9Tc,14407
|
|
76
76
|
torchx/specs/finder.py,sha256=gWQNEFrLYqrZoI0gMMhQ70YAC4sxqS0ZFpoWAmcVi44,17438
|
|
@@ -102,9 +102,9 @@ torchx/workspace/__init__.py,sha256=FqN8AN4VhR1C_SBY10MggQvNZmyanbbuPuE-JCjkyUY,
|
|
|
102
102
|
torchx/workspace/api.py,sha256=h2SaC-pYPBLuo3XtkXJ0APMoro-C-ry7KucI7r3EUf4,8753
|
|
103
103
|
torchx/workspace/dir_workspace.py,sha256=npNW_IjUZm_yS5r-8hrRkH46ndDd9a_eApT64m1S1T4,2268
|
|
104
104
|
torchx/workspace/docker_workspace.py,sha256=PFu2KQNVC-0p2aKJ-W_BKA9ZOmXdCY2ABEkCExp3udQ,10269
|
|
105
|
-
torchx_nightly-2025.10.
|
|
106
|
-
torchx_nightly-2025.10.
|
|
107
|
-
torchx_nightly-2025.10.
|
|
108
|
-
torchx_nightly-2025.10.
|
|
109
|
-
torchx_nightly-2025.10.
|
|
110
|
-
torchx_nightly-2025.10.
|
|
105
|
+
torchx_nightly-2025.10.17.dist-info/LICENSE,sha256=WVHfXhFC0Ia8LTKt_nJVYobdqTJVg_4J3Crrfm2A8KQ,1721
|
|
106
|
+
torchx_nightly-2025.10.17.dist-info/METADATA,sha256=qg3D7hiG2TX50v4beQLMAQ8dRszPGKUVYke16hnu87Q,5046
|
|
107
|
+
torchx_nightly-2025.10.17.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
108
|
+
torchx_nightly-2025.10.17.dist-info/entry_points.txt,sha256=T328AMXeKI3JZnnxfkEew2ZcMN1oQDtkXjMz7lkV-P4,169
|
|
109
|
+
torchx_nightly-2025.10.17.dist-info/top_level.txt,sha256=pxew3bc2gsiViS0zADs0jb6kC5v8o_Yy_85fhHj_J1A,7
|
|
110
|
+
torchx_nightly-2025.10.17.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
{torchx_nightly-2025.10.15.dist-info → torchx_nightly-2025.10.17.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|