Skip to content

Commit 0dc3db5

Browse files
committed
Add CPU test for use_syrk forwarding in newton_schulz_tp
Follow-up to #239. In test_distributed_muon_utils_cpu.py, using a real gloo process group, verifies use_syrk is forwarded through newton_schulz_tp to the underlying newton_schulz for both TP modes and both partition dims: a 3D input with use_syrk=True raises the code-owned TypeError 'use_syrk does not support N-d input' (mirroring test_newton_schulz_use_syrk_with_3d_raises_type_error), while use_syrk=False stays on the dense batched path and succeeds. Signed-off-by: pingtianl <pingtianl@nvidia.com>
1 parent dc80675 commit 0dc3db5

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

tests/test_distributed_muon_utils_cpu.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from absl import flags, logging
2222
from absl.testing import absltest, parameterized
2323

24+
from emerging_optimizers import utils
2425
from emerging_optimizers.orthogonalized_optimizers import muon_utils
2526

2627

@@ -227,6 +228,41 @@ def test_1step_close_to_non_distributed(self, shape, partition_dim, tp_mode):
227228

228229
torch.testing.assert_close(ref_out.chunk(world_size, dim=partition_dim)[rank], dist_out, atol=1e-6, rtol=0)
229230

231+
@parameterized.product(
232+
partition_dim=(0, 1),
233+
tp_mode=("distributed", "duplicated"),
234+
)
235+
def test_use_syrk_forwarded_to_newton_schulz(self, partition_dim, tp_mode):
236+
shape = (8, 16, 32)
237+
world_size = torch.distributed.get_world_size()
238+
if shape[partition_dim] % world_size != 0:
239+
self.skipTest("Skipping because incompatible shape and world size")
240+
rank = torch.distributed.get_rank()
241+
x = torch.randint(-5, 5, shape, device="cpu", dtype=torch.float32)
242+
torch.distributed.all_reduce(x, op=torch.distributed.ReduceOp.SUM)
243+
local_x = x.chunk(world_size, dim=partition_dim)[rank]
244+
245+
with utils.fp32_matmul_precision("medium"):
246+
muon_utils.newton_schulz_tp(
247+
local_x,
248+
steps=1,
249+
coefficient_type="simple",
250+
tp_group=torch.distributed.group.WORLD,
251+
partition_dim=partition_dim,
252+
tp_mode=tp_mode,
253+
use_syrk=False,
254+
)
255+
with self.assertRaisesRegex(TypeError, "use_syrk does not support"):
256+
muon_utils.newton_schulz_tp(
257+
local_x,
258+
steps=1,
259+
coefficient_type="simple",
260+
tp_group=torch.distributed.group.WORLD,
261+
partition_dim=partition_dim,
262+
tp_mode=tp_mode,
263+
use_syrk=True,
264+
)
265+
230266

231267
if __name__ == "__main__":
232268
torch.distributed.init_process_group(backend="gloo")

0 commit comments

Comments
 (0)