from contextlib import nullcontext
from types import SimpleNamespace
import pytest
import torch
from modelexpress.refit.reshard import receiver as receiver_mod
from modelexpress.refit.reshard.transfer_plan import TransferPlan
from modelexpress.refit.reshard.types import CaptureResult
from tests.test_reshard_refit_fused_wire import _build, _RecordingTransport
@pytest.fixture(autouse=True)
def _cpu_only(monkeypatch):
monkeypatch.setattr(torch.cuda, "synchronize", lambda *a, **k: None)
def _refit(harness, step):
metrics = harness.update_weights(step=step)
buffers = {
name: buffer.detach().clone()
for name, buffer in harness._recv_buffers.items()
}
return metrics, buffers
def _zero(harness):
for buffer in harness._recv_buffers.values():
buffer.zero_()
def test_cached_and_uncached_refits_move_identical_bytes(monkeypatch):
monkeypatch.setenv("MX_RESHARD_CACHE_DESCRIPTORS", "0")
uncached_harness, uncached_keepalive = _build(_RecordingTransport())
_, uncached = _refit(uncached_harness, 1)
monkeypatch.setenv("MX_RESHARD_CACHE_DESCRIPTORS", "1")
cached_harness, cached_keepalive = _build(_RecordingTransport())
_, cached = _refit(cached_harness, 1)
assert set(cached) == set(uncached)
for name in cached:
assert torch.equal(cached[name], uncached[name]), name
assert uncached_keepalive and cached_keepalive
def test_second_refit_through_the_cache_repeats_the_first(monkeypatch):
monkeypatch.setenv("MX_RESHARD_CACHE_DESCRIPTORS", "1")
harness, keepalive = _build(_RecordingTransport())
first_metrics, first = _refit(harness, 1)
_zero(harness)
second_metrics, second = _refit(harness, 2)
for name in first:
assert torch.equal(second[name], first[name]), name
assert second_metrics["bytes_received"] == first_metrics["bytes_received"]
assert second_metrics["segments"] == first_metrics["segments"]
assert keepalive
def test_rebuilding_the_plan_drops_the_cache(monkeypatch):
monkeypatch.setenv("MX_RESHARD_CACHE_DESCRIPTORS", "1")
harness, keepalive = _build(_RecordingTransport())
_refit(harness, 1)
assert harness._cached_descriptors is not None
new_plan = TransferPlan()
monkeypatch.setattr(
receiver_mod,
"gather_sources",
lambda *_args, **_kwargs: ({}, {}, {}, {}),
)
monkeypatch.setattr(receiver_mod, "plan_transfer", lambda *_args: new_plan)
monkeypatch.setattr(
receiver_mod, "handshake_endpoints_for_plan", lambda *_args: {}
)
monkeypatch.setattr(receiver_mod, "handshake_with_peers", lambda *_args: None)
monkeypatch.setattr(
receiver_mod, "NixlReshardTransport", lambda *_args, **_kwargs: object()
)
monkeypatch.setattr(receiver_mod, "classic_cuda_alloc", nullcontext)
harness._num_trainer_sources = 0
harness._mx_client = object()
harness._model_name = "model"
harness._global_rank = 0
harness._manager = SimpleNamespace(register_tensors=lambda *_args: None)
harness._capture = lambda _manifest: (CaptureResult(), {})
harness._log_coverage = lambda *_args: None
harness._prepare(timeout=1.0)
assert harness._plan is new_plan
assert harness._cached_descriptors is None
assert keepalive
def test_switching_the_wire_arm_rebuilds_the_cache(monkeypatch):
monkeypatch.setenv("MX_RESHARD_CACHE_DESCRIPTORS", "1")
monkeypatch.setenv("MX_RESHARD_FUSED_WIRE", "0")
harness, keepalive = _build(_RecordingTransport())
phased_metrics, phased = _refit(harness, 1)
assert harness._cached_descriptors[0] is False
monkeypatch.setenv("MX_RESHARD_FUSED_WIRE", "1")
_zero(harness)
fused_metrics, fused = _refit(harness, 2)
assert harness._cached_descriptors[0] is True
for name in phased:
assert torch.equal(fused[name], phased[name]), name
assert fused_metrics["bytes_received"] == phased_metrics["bytes_received"]
assert keepalive
def test_descriptor_build_is_reported_as_a_stage(monkeypatch):
monkeypatch.setenv("MX_RESHARD_CACHE_DESCRIPTORS", "1")
harness, keepalive = _build(_RecordingTransport())
metrics, _ = _refit(harness, 1)
assert "descriptor_build_s" in metrics
assert metrics["descriptor_build_s"] >= 0.0
assert keepalive