import logging
from types import SimpleNamespace
from modelexpress.refit import (
RefitTimingRecorder,
current_refit_timing,
set_refit_cold,
use_refit_timing,
)
from modelexpress_rl import timing
from modelexpress_rl.inference.adapter import (
GeneratorSource,
GeneratorTransferInputs,
NixlGeneratorSource,
)
from modelexpress_rl.inference.methods.load_time_tensor import (
LoadTimeTensorNixlUpdateMethod,
_attribute_transfer,
)
from modelexpress_rl.inference.plan import TrainerUpdateSource
from modelexpress_rl.train import WeightPayloadFormat
STAGED_METRICS = {
"bytes_received": 4_000_000_000,
"segments": 12,
"wire_s": 1.5,
"reconstruct_s": 0.25,
}
def test_a_cycle_is_opened_by_default(monkeypatch):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
assert timing.start_cycle(version_id="run.a1:7", rank=0) is not None
def test_a_cycle_can_be_turned_off(monkeypatch):
monkeypatch.setenv("MX_REFIT_TIMING", "0")
assert timing.start_cycle(version_id="run.a1:7", rank=0) is None
def test_a_caller_driving_its_own_cycle_is_not_displaced(monkeypatch):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
outer = RefitTimingRecorder(backend="caller", version=1)
with use_refit_timing(outer):
assert timing.start_cycle(version_id="run.a1:7", rank=0) is None
_attribute_transfer(STAGED_METRICS)
assert outer.has_measurements("wire_transfer")
def test_the_wire_and_the_work_after_it_are_charged_apart(monkeypatch):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
recorder = timing.start_cycle(version_id="run.a1:7", rank=0)
with timing.active(recorder):
_attribute_transfer(STAGED_METRICS)
stages = recorder.as_dict()["stages"]
assert stages["wire_transfer"]["duration_ms"] == 1500.0
assert stages["receive_sync"]["duration_ms"] == 250.0
def test_the_payload_size_travels_with_the_timing(monkeypatch):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
recorder = timing.start_cycle(version_id="run.a1:7", rank=0)
with timing.active(recorder):
_attribute_transfer(STAGED_METRICS)
assert recorder.as_dict()["bytes"] == 4_000_000_000
def test_a_peer_pull_reports_a_wire_time_and_no_reconstruction(monkeypatch):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
recorder = timing.start_cycle(version_id="run.a1:7", rank=0)
with timing.active(recorder):
_attribute_transfer({"bytes_received": 1, "wire_s": 0.5, "peer_s": 0.6})
assert recorder.has_measurements("wire_transfer")
assert not recorder.has_measurements("receive_sync")
def test_reusing_a_transfer_plan_is_marked_warm(monkeypatch):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
recorder = timing.start_cycle(version_id="run.a1:7", rank=0)
with timing.active(recorder):
set_refit_cold(False)
assert recorder.as_dict()["cold_warm"] == "warm"
def test_version_digest_refreshes_verification_without_replanning():
class Transfer:
def __init__(self):
self.prepare_calls = 0
self.refresh_calls = 0
def unpublish_peer(self):
pass
def prepare(self, **_kwargs):
self.prepare_calls += 1
return object()
def refresh_sources(self, _prepared, _manifests):
self.refresh_calls += 1
def stage(self, _prepared):
return SimpleNamespace(metrics={"bytes_received": 0})
transfer = Transfer()
method = LoadTimeTensorNixlUpdateMethod(
transfer=transfer,
capture_layout=lambda _manifest: None,
)
def source(version, digest):
return TrainerUpdateSource(
inputs=GeneratorTransferInputs(
version_id=version,
base_version_id=None,
layout_signature="layout",
payload_format=WeightPayloadFormat.FULL_TENSOR,
sources=(
GeneratorSource(
source_slot_id="rank:0",
worker_id="trainer-0",
manifest_digest=digest,
transport=NixlGeneratorSource(
manifest_endpoint="trainer:9000",
manifest=version.encode(),
structural_digest="stable-structure",
),
),
),
)
)
first = method.prepare(version=None, source=source("v1", "digest-1"))
method.release(first)
second = method.prepare(version=None, source=source("v2", "digest-2"))
method.release(second)
assert transfer.prepare_calls == 1
assert transfer.refresh_calls == 1
def test_the_record_is_emitted_once(monkeypatch, caplog):
monkeypatch.delenv("MX_REFIT_TIMING", raising=False)
recorder = timing.start_cycle(version_id="run.a1:7", rank=0)
logger = logging.getLogger("test_rl_generator_timing")
with caplog.at_level(logging.INFO, logger=logger.name):
timing.emit(recorder, logger)
timing.emit(recorder, logger)
assert len([r for r in caplog.records if "MX_REFIT_TIMING" in r.getMessage()]) == 1
def test_nothing_is_emitted_when_there_is_no_cycle():
logger = logging.getLogger("test_rl_generator_timing")
timing.emit(None, logger)
with timing.active(None):
_attribute_transfer(STAGED_METRICS)
set_refit_cold(True)
assert current_refit_timing() is None