torchmonarch-nightly 2025.6.6__cp310-cp310-manylinux2014_x86_64.whl → 2025.6.7__cp310-cp310-manylinux2014_x86_64.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.
monarch/_rust_bindings.so CHANGED
Binary file
monarch/actor_mesh.py CHANGED
@@ -39,7 +39,7 @@ from typing import (
39
39
  import monarch
40
40
  from monarch import ActorFuture as Future
41
41
 
42
- from monarch._rust_bindings.monarch_hyperactor.actor import PythonMessage
42
+ from monarch._rust_bindings.monarch_hyperactor.actor import PanicFlag, PythonMessage
43
43
  from monarch._rust_bindings.monarch_hyperactor.actor_mesh import PythonActorMesh
44
44
  from monarch._rust_bindings.monarch_hyperactor.mailbox import (
45
45
  Mailbox,
@@ -462,12 +462,12 @@ class _Actor:
462
462
  def __init__(self) -> None:
463
463
  self.instance: object | None = None
464
464
  self.active_requests: asyncio.Queue[asyncio.Future[object]] = asyncio.Queue()
465
- self.complete_task: object | None = None
465
+ self.complete_task: asyncio.Task | None = None
466
466
 
467
467
  def handle(
468
- self, mailbox: Mailbox, message: PythonMessage
468
+ self, mailbox: Mailbox, message: PythonMessage, panic_flag: PanicFlag
469
469
  ) -> Optional[Coroutine[Any, Any, Any]]:
470
- return self.handle_cast(mailbox, 0, singleton_shape, message)
470
+ return self.handle_cast(mailbox, 0, singleton_shape, message, panic_flag)
471
471
 
472
472
  def handle_cast(
473
473
  self,
@@ -475,6 +475,7 @@ class _Actor:
475
475
  rank: int,
476
476
  shape: Shape,
477
477
  message: PythonMessage,
478
+ panic_flag: PanicFlag,
478
479
  ) -> Optional[Coroutine[Any, Any, Any]]:
479
480
  port = None
480
481
  try:
@@ -495,10 +496,10 @@ class _Actor:
495
496
  port.send("result", result)
496
497
  return None
497
498
 
498
- return self.run_async(ctx, self.run_task(port, result))
499
+ return self.run_async(ctx, self.run_task(port, result, panic_flag))
499
500
  except Exception as e:
500
501
  traceback.print_exc()
501
- s = ActorMeshRefCallFailedException(e)
502
+ s = ActorError(e)
502
503
 
503
504
  # The exception is delivered to exactly one of:
504
505
  # (1) our caller, (2) our supervisor
@@ -510,17 +511,17 @@ class _Actor:
510
511
  async def run_async(self, ctx, coroutine):
511
512
  _context.set(ctx)
512
513
  if self.complete_task is None:
513
- asyncio.create_task(self._complete())
514
+ self.complete_task = asyncio.create_task(self._complete())
514
515
  await self.active_requests.put(create_eager_task(coroutine))
515
516
 
516
- async def run_task(self, port, coroutine):
517
+ async def run_task(self, port, coroutine, panic_flag):
517
518
  try:
518
519
  result = await coroutine
519
520
  if port is not None:
520
521
  port.send("result", result)
521
522
  except Exception as e:
522
523
  traceback.print_exc()
523
- s = ActorMeshRefCallFailedException(e)
524
+ s = ActorError(e)
524
525
 
525
526
  # The exception is delivered to exactly one of:
526
527
  # (1) our caller, (2) our supervisor
@@ -528,6 +529,16 @@ class _Actor:
528
529
  port.send("exception", s)
529
530
  else:
530
531
  raise s from None
532
+ except BaseException as e:
533
+ # A BaseException can be thrown in the case of a Rust panic.
534
+ # In this case, we need a way to signal the panic to the Rust side.
535
+ # See [Panics in async endpoints]
536
+ try:
537
+ panic_flag.signal_panic(e)
538
+ except Exception:
539
+ # The channel might be closed if the Rust side has already detected the error
540
+ pass
541
+ raise
531
542
 
532
543
  async def _complete(self) -> None:
533
544
  while True:
@@ -655,7 +666,7 @@ class ActorMeshRef(MeshTrait):
655
666
  )
656
667
 
657
668
 
658
- class ActorMeshRefCallFailedException(Exception):
669
+ class ActorError(Exception):
659
670
  """
660
671
  Deterministic problem with the user's code.
661
672
  For example, an OOM resulting in trying to allocate too much GPU memory, or violating
monarch/bootstrap_main.py CHANGED
@@ -53,6 +53,9 @@ def invoke_main():
53
53
  record.levelno,
54
54
  )
55
55
 
56
+ if os.environ.get("MONARCH_ERROR_DURING_BOOTSTRAP_FOR_TESTING") == "1":
57
+ raise RuntimeError("Error during bootstrap for testing")
58
+
56
59
  # forward logs to rust tracing. Defaults to on.
57
60
  if os.environ.get("MONARCH_PYTHON_LOG_TRACING", "1") == "1":
58
61
  logging.root.addHandler(TracingForwarder())
Binary file
monarch/rdma.py CHANGED
@@ -6,10 +6,7 @@
6
6
 
7
7
  import ctypes
8
8
 
9
- import traceback
10
-
11
9
  from dataclasses import dataclass
12
- from traceback import extract_tb, StackSummary
13
10
  from typing import cast, Dict, Optional, Tuple
14
11
 
15
12
  import torch
@@ -163,28 +160,3 @@ class RDMABuffer:
163
160
  src.numel(),
164
161
  )
165
162
  await RDMAManager.on_proc(self.proc_id).put.call_one(self.addr, offset, bytes)
166
-
167
-
168
- class ActorMeshRefCallFailedException(Exception):
169
- """
170
- Deterministic problem with the user's code.
171
- For example, an OOM resulting in trying to allocate too much GPU memory, or violating
172
- some invariant enforced by the various APIs.
173
- """
174
-
175
- def __init__(
176
- self,
177
- exception: Exception,
178
- message: str = "A remote service call has failed asynchronously.",
179
- ) -> None:
180
- self.exception = exception
181
- self.actor_mesh_ref_frames: StackSummary = extract_tb(exception.__traceback__)
182
- self.message = message
183
-
184
- def __str__(self) -> str:
185
- exe = str(self.exception)
186
- actor_mesh_ref_tb = "".join(traceback.format_list(self.actor_mesh_ref_frames))
187
- return (
188
- f"{self.message}\n"
189
- f"Traceback of where the service call failed (most recent call last):\n{actor_mesh_ref_tb}{type(self.exception).__name__}: {exe}"
190
- )
@@ -7,6 +7,8 @@
7
7
  import ctypes
8
8
  import sys
9
9
 
10
+ import click
11
+
10
12
  from monarch._rust_bindings.monarch_extension.panic import panicking_function
11
13
 
12
14
  from monarch.actor_mesh import Actor, endpoint
@@ -115,24 +117,33 @@ def _run_error_test(num_procs, sync_endpoint, endpoint_name):
115
117
  asyncio.run(run_test())
116
118
 
117
119
 
120
+ @click.group()
118
121
  def main():
119
- import argparse
122
+ pass
120
123
 
121
- parser = argparse.ArgumentParser()
122
- parser.add_argument("--num-procs", type=int)
123
- parser.add_argument("--sync-test-impl", type=bool)
124
- parser.add_argument("--sync-endpoint", type=bool)
125
- parser.add_argument("--endpoint-name", type=str)
126
- args = parser.parse_args()
127
124
 
125
+ @main.command("error-endpoint")
126
+ @click.option("--num-procs", type=int, required=True)
127
+ @click.option("--sync-test-impl", type=bool, required=True)
128
+ @click.option("--sync-endpoint", type=bool, required=True)
129
+ @click.option("--endpoint-name", type=str, required=True)
130
+ def error_endpoint(num_procs, sync_test_impl, sync_endpoint, endpoint_name):
128
131
  print(
129
- f"Running segfault test: {args.num_procs=} {args.sync_test_impl=} {args.sync_endpoint=}, {args.endpoint_name=}"
132
+ f"Running segfault test: {num_procs=} {sync_test_impl=} {sync_endpoint=}, {endpoint_name=}"
130
133
  )
131
134
 
132
- if args.sync_test_impl:
133
- _run_error_test_sync(args.num_procs, args.sync_endpoint, args.endpoint_name)
135
+ if sync_test_impl:
136
+ _run_error_test_sync(num_procs, sync_endpoint, endpoint_name)
134
137
  else:
135
- _run_error_test(args.num_procs, args.sync_endpoint, args.endpoint_name)
138
+ _run_error_test(num_procs, sync_endpoint, endpoint_name)
139
+
140
+
141
+ @main.command("error-bootstrap")
142
+ def error_bootstrap():
143
+ print("I actually ran")
144
+ sys.stdout.flush()
145
+
146
+ proc_mesh(gpus=4, env={"MONARCH_ERROR_DURING_BOOTSTRAP_FOR_TESTING": "1"}).get()
136
147
 
137
148
 
138
149
  if __name__ == "__main__":
tests/test_actor_error.py CHANGED
@@ -8,47 +8,36 @@ import importlib.resources
8
8
  import subprocess
9
9
 
10
10
  import pytest
11
- from monarch.actor_mesh import Actor, ActorMeshRefCallFailedException, endpoint
11
+ from monarch.actor_mesh import Actor, ActorError, endpoint
12
12
 
13
13
  from monarch.proc_mesh import proc_mesh
14
14
 
15
15
 
16
16
  class ExceptionActor(Actor):
17
- """An actor that has endpoints which raise exceptions."""
18
-
19
17
  @endpoint
20
18
  async def raise_exception(self) -> None:
21
- """Endpoint that raises an exception."""
22
19
  raise Exception("This is a test exception")
23
20
 
24
21
 
25
22
  class ExceptionActorSync(Actor):
26
- """An actor that has endpoints which raise exceptions."""
27
-
28
23
  @endpoint # pyre-ignore
29
24
  def raise_exception(self) -> None:
30
- """Endpoint that raises an exception."""
31
25
  raise Exception("This is a test exception")
32
26
 
33
27
 
34
28
  @pytest.mark.parametrize(
35
- "actor_class,actor_name",
36
- [
37
- (ExceptionActor, "exception_actor_async_call"),
38
- (ExceptionActorSync, "exception_actor_sync_call"),
39
- ],
29
+ "actor_class",
30
+ [ExceptionActor, ExceptionActorSync],
40
31
  )
41
32
  @pytest.mark.parametrize("num_procs", [1, 2])
42
- async def test_actor_exception(actor_class, actor_name, num_procs):
33
+ async def test_actor_exception(actor_class, num_procs):
43
34
  """
44
35
  Test that exceptions raised in actor endpoints are propagated to the client.
45
36
  """
46
37
  proc = await proc_mesh(gpus=num_procs)
47
- exception_actor = await proc.spawn(actor_name, actor_class)
38
+ exception_actor = await proc.spawn("exception_actor", actor_class)
48
39
 
49
- with pytest.raises(
50
- ActorMeshRefCallFailedException, match="This is a test exception"
51
- ):
40
+ with pytest.raises(ActorError, match="This is a test exception"):
52
41
  if num_procs == 1:
53
42
  await exception_actor.raise_exception.call_one()
54
43
  else:
@@ -56,23 +45,18 @@ async def test_actor_exception(actor_class, actor_name, num_procs):
56
45
 
57
46
 
58
47
  @pytest.mark.parametrize(
59
- "actor_class,actor_name",
60
- [
61
- (ExceptionActor, "exception_actor_async_call"),
62
- (ExceptionActorSync, "exception_actor_sync_call"),
63
- ],
48
+ "actor_class",
49
+ [ExceptionActor, ExceptionActorSync],
64
50
  )
65
51
  @pytest.mark.parametrize("num_procs", [1, 2])
66
- def test_actor_exception_sync(actor_class, actor_name, num_procs):
52
+ def test_actor_exception_sync(actor_class, num_procs):
67
53
  """
68
54
  Test that exceptions raised in actor endpoints are propagated to the client.
69
55
  """
70
56
  proc = proc_mesh(gpus=num_procs).get()
71
- exception_actor = proc.spawn(actor_name, actor_class).get()
57
+ exception_actor = proc.spawn("exception_actor", actor_class).get()
72
58
 
73
- with pytest.raises(
74
- ActorMeshRefCallFailedException, match="This is a test exception"
75
- ):
59
+ with pytest.raises(ActorError, match="This is a test exception"):
76
60
  if num_procs == 1:
77
61
  exception_actor.raise_exception.call_one().get()
78
62
  else:
@@ -85,25 +69,62 @@ def test_actor_exception_sync(actor_class, actor_name, num_procs):
85
69
  @pytest.mark.parametrize("sync_endpoint", [False, True])
86
70
  @pytest.mark.parametrize("sync_test_impl", [False, True])
87
71
  @pytest.mark.parametrize("endpoint_name", ["cause_segfault", "cause_panic"])
88
- def test_actor_segfault(num_procs, sync_endpoint, sync_test_impl, endpoint_name):
72
+ def test_actor_supervision(num_procs, sync_endpoint, sync_test_impl, endpoint_name):
89
73
  """
90
- Test that segfaults in actor endpoints result in a non-zero exit code.
91
- This test spawns a subprocess that will segfault and checks its exit code.
74
+ Test that an endpoint causing spontaenous process exit is handled by the supervisor.
92
75
 
93
- Tests both ExceptionActor and ExceptionActorSync using async API.
76
+ Today, these events are delivered to the client and cause the client process
77
+ to exit with a non-zero code, so the only way we can test it is via a
78
+ subprocess harness.
94
79
  """
95
80
  # Run the segfault test in a subprocess
96
81
  test_bin = importlib.resources.files("monarch.python.tests").joinpath("test_bin")
97
82
  cmd = [
98
83
  str(test_bin),
84
+ "error-endpoint",
99
85
  f"--num-procs={num_procs}",
100
86
  f"--sync-endpoint={sync_endpoint}",
101
87
  f"--sync-test-impl={sync_test_impl}",
102
88
  f"--endpoint-name={endpoint_name}",
103
89
  ]
104
- process = subprocess.run(cmd, capture_output=True, timeout=60)
105
- print(process.stdout.decode())
106
- print(process.stderr.decode())
90
+ try:
91
+ process = subprocess.run(cmd, capture_output=True, timeout=180)
92
+ except subprocess.TimeoutExpired as e:
93
+ print("timeout expired")
94
+ if e.stdout is not None:
95
+ print(e.stdout.decode())
96
+ if e.stderr is not None:
97
+ print(e.stderr.decode())
98
+ raise
99
+
100
+ # Assert that the subprocess exited with a non-zero code
101
+ assert "I actually ran" in process.stdout.decode()
102
+ assert (
103
+ process.returncode != 0
104
+ ), f"Expected non-zero exit code, got {process.returncode}"
105
+
106
+
107
+ # oss_skip: importlib not pulling resource correctly in git CI, needs to be revisited
108
+ @pytest.mark.oss_skip
109
+ def test_proc_mesh_bootstrap_error():
110
+ """
111
+ Test that attempts to spawn a ProcMesh with a failure during bootstrap.
112
+ """
113
+ # Run the segfault test in a subprocess
114
+ test_bin = importlib.resources.files("monarch.python.tests").joinpath("test_bin")
115
+ cmd = [
116
+ str(test_bin),
117
+ "error-bootstrap",
118
+ ]
119
+ try:
120
+ process = subprocess.run(cmd, capture_output=True, timeout=180)
121
+ except subprocess.TimeoutExpired as e:
122
+ print("timeout expired")
123
+ if e.stdout is not None:
124
+ print(e.stdout.decode())
125
+ if e.stderr is not None:
126
+ print(e.stderr.decode())
127
+ raise
107
128
 
108
129
  # Assert that the subprocess exited with a non-zero code
109
130
  assert "I actually ran" in process.stdout.decode()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: torchmonarch-nightly
3
- Version: 2025.6.6
3
+ Version: 2025.6.7
4
4
  Summary: Monarch: Single controller library
5
5
  Author: Meta
6
6
  Author-email: oncall+monarch@xmail.facebook.com
@@ -1,15 +1,15 @@
1
1
  monarch/__init__.py,sha256=iUvWHc0-7Q2tovRoRxOIiA3TsefMXCbWl-jEfQ2djew,6897
2
- monarch/_rust_bindings.so,sha256=b3W_9ICPY2P_yDKwRY6liTdhGGhi2euITQwhj0-4hZk,39102560
2
+ monarch/_rust_bindings.so,sha256=seyf4m6FoGBVbC4DBiG2dJdoSqsVRTWTbH9KeBvc1Is,39128520
3
3
  monarch/_testing.py,sha256=MN8DK1e-wzV0-R_nFW1b_7-O5oKfWvZ12BMGD4Z7PQk,6755
4
- monarch/actor_mesh.py,sha256=KfvHST97c35kyL7FslAfkRxo22UN33u3_gk2yrbZu4A,22320
4
+ monarch/actor_mesh.py,sha256=_IVpdQ1HIC5JumB7cwcamdeWREPKqeMYjiz7NOV9Klw,22842
5
5
  monarch/allocator.py,sha256=_2DKFP9pSD33zDgH7xZJC8Tq7BQrCeQEUmMB7_xCT0Y,1784
6
- monarch/bootstrap_main.py,sha256=_LgEvfI_kFHj2QWH8CLRBQI1tbxS0uWrnHqwzOVbjeI,2417
6
+ monarch/bootstrap_main.py,sha256=SYTOz-pTXiJNk78PPD5HAOJDSb8t2JfitRWdmWB3ogo,2559
7
7
  monarch/cached_remote_function.py,sha256=kYdB6r4OHx_T_uX4q3tCNcp1t2DJwF8tPTIahUiT2pU,8785
8
8
  monarch/fetch.py,sha256=61jxo7sx4QNUTkc0_rF5NaJROen4tKbAaiIjrXWLOvg,1705
9
9
  monarch/future.py,sha256=lcdFEe7m1shYPPuvZ1RkS6JUIChEKGBWe3v7x_nu4Hg,731
10
10
  monarch/gradient_generator.py,sha256=Rl3dmXGceTdCc1mYBg2JciR88ywGPnW7TVkL86KwqEA,6366
11
11
  monarch/memory.py,sha256=ol86dBhFAJqg78iF25-BuK0wuwj1onR8FIioZ_B0gjw,1377
12
- monarch/monarch_controller,sha256=LlUJ69r9spjCivWYdew83cFM4YszUx5Djqp9k_xxppo,20386688
12
+ monarch/monarch_controller,sha256=ptqqARjqzjjVP0R-1ZPAd0y_K1-0XHFQhE-HR4J6MOo,20389704
13
13
  monarch/notebook.py,sha256=zu9MKDFKf1-rCM2TqFSRJjMBeiWuKcJSyUFLvoZRQzs,25949
14
14
  monarch/opaque_module.py,sha256=oajOu_WD1hD4hxE8HDdO-tvWY7KDHWd7VaAhJEa5L2I,10446
15
15
  monarch/opaque_object.py,sha256=IVpll4pyuKZMo_EnPh4s0qnx8RlAcJrJ1yoLX6E75wQ,2782
@@ -17,7 +17,7 @@ monarch/proc_mesh.py,sha256=sTMmwQLKqM0h-yY0mn8uSzOb9B_MX9DKWCI9EsyfD6s,6384
17
17
  monarch/profiler.py,sha256=TQ9fnVM8H7smBWtYdB_6Irtzz8DBOmcp7U1T3wlUmco,4911
18
18
  monarch/python_local_mesh.py,sha256=YsureIzR9uGlNVrKd4vRghxOXBeYabkt9lICRErfRAI,3536
19
19
  monarch/random.py,sha256=f9QR7Esu4Vxqxs-KCf5QYyVqlWvXJ3-UtG90L_h4j40,1527
20
- monarch/rdma.py,sha256=eWwYKurW-Y6j68m0xH8jeyE3bfmSgB5ZwM2j-RmbCHc,6397
20
+ monarch/rdma.py,sha256=1pNh11S_FWeETRgkdUpauTMUlodrRohIq1UfQjKVnN8,5418
21
21
  monarch/remote_class.py,sha256=-OAowzU1aDP6i4ik_SjXntVUC9h4dqAzgqwohkQ6Grc,4167
22
22
  monarch/rust_backend_mesh.py,sha256=1htC62of4MgFtkezWGlsxSFtKJdc0CIeqeSuOx7yu3M,9944
23
23
  monarch/rust_local_mesh.py,sha256=7ASptybn3wy4J7eoBc7LhGW4j4AA6bigl5Kuhyflw8s,47405
@@ -127,9 +127,9 @@ monarch_supervisor/python_executable.py,sha256=WfCiK3wdAvm9Jxx5jgjGF991NgGc9-oHU
127
127
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
128
  tests/dispatch_bench.py,sha256=sU_m-8KAjQgYTsxI5khV664NdgLLutidni69Rtowk98,3933
129
129
  tests/dispatch_bench_helper.py,sha256=1ORgAMrRgjAjmmWeCHLLQd_bda9mJk0rS2ucEbRu28s,633
130
- tests/error_test_binary.py,sha256=r9-mm4eDqaJYnBo3gXcuqwhpYq1HeH6xem3a4p8rakI,4600
130
+ tests/error_test_binary.py,sha256=64H-ucdkQ2i7GD8sidStl227cOy7gyeqvO4kTm1y7Ic,4817
131
131
  tests/sleep_binary.py,sha256=XfLYaAfwm9xgzM-svs8fhAeFhwYIg6SyVEnx4e6wbUw,1009
132
- tests/test_actor_error.py,sha256=YBDS6BKwZqgKTFtydEJt4qwJGXRfWx3hgxup9ayVbhY,3827
132
+ tests/test_actor_error.py,sha256=K4buy0Z3MfCF7uSgIMRCpw7A2fTl3iRh8g_aNiJHnBU,4530
133
133
  tests/test_alloc.py,sha256=D6DdQbtOZEvvnnc7LV-WyWFMk0Xb77eblH6Oz90zJTA,745
134
134
  tests/test_coalescing.py,sha256=-KtAWzTaeXbyzltplfojavx0iFeeZnvej-tFTlu2p5k,15616
135
135
  tests/test_controller.py,sha256=yxuVp2DG3TDKJlwuE3cFm9dbWMlbrYtG1uHfvVWRYbw,30935
@@ -149,9 +149,9 @@ tests/simulator/test_profiling.py,sha256=TGYCfzTLdkpIwnOuO6KApprmrgPIRQe60KRX3wk
149
149
  tests/simulator/test_simulator.py,sha256=LO8lA0ssY-OGEBL5ipEu74f97Y765TEwfUOv-DtIptM,14568
150
150
  tests/simulator/test_task.py,sha256=ipqBDuDAysuo1xOB9S5psaFvwe6VATD43IovCTSs0t4,2327
151
151
  tests/simulator/test_worker.py,sha256=QrWWIJ3HDgDLkBPRc2mwYPlOQoXQcj1qRfc0WUfKkFY,3507
152
- torchmonarch_nightly-2025.6.6.dist-info/licenses/LICENSE,sha256=e0Eotbf_rHOYPuEUlppIbvwy4SN98CZnl_hqwvbDA4Q,1530
153
- torchmonarch_nightly-2025.6.6.dist-info/METADATA,sha256=q8PbST0aYM1zzxSGM9AjrDdDbTmJbg-7gaMyH6sqDPQ,2771
154
- torchmonarch_nightly-2025.6.6.dist-info/WHEEL,sha256=_wZSFk0d90K9wOBp8Q-UGxshyiJ987JoPiyUBNC6VLk,104
155
- torchmonarch_nightly-2025.6.6.dist-info/entry_points.txt,sha256=sqfQ16oZqjEvttUI-uj9BBXIIE6jt05bYFSmy-2hyXI,106
156
- torchmonarch_nightly-2025.6.6.dist-info/top_level.txt,sha256=E-ZssZzyM17glpVrh-S9--qJ-w9p2EjuYOuNw9tQ4Eg,33
157
- torchmonarch_nightly-2025.6.6.dist-info/RECORD,,
152
+ torchmonarch_nightly-2025.6.7.dist-info/licenses/LICENSE,sha256=e0Eotbf_rHOYPuEUlppIbvwy4SN98CZnl_hqwvbDA4Q,1530
153
+ torchmonarch_nightly-2025.6.7.dist-info/METADATA,sha256=8082irkhKa1D8z8Dq0GBZAfdQXh_JXcirAjEAI-A2_8,2771
154
+ torchmonarch_nightly-2025.6.7.dist-info/WHEEL,sha256=_wZSFk0d90K9wOBp8Q-UGxshyiJ987JoPiyUBNC6VLk,104
155
+ torchmonarch_nightly-2025.6.7.dist-info/entry_points.txt,sha256=sqfQ16oZqjEvttUI-uj9BBXIIE6jt05bYFSmy-2hyXI,106
156
+ torchmonarch_nightly-2025.6.7.dist-info/top_level.txt,sha256=E-ZssZzyM17glpVrh-S9--qJ-w9p2EjuYOuNw9tQ4Eg,33
157
+ torchmonarch_nightly-2025.6.7.dist-info/RECORD,,