from __future__ import annotations
from unittest.mock import MagicMock
import pytest
import torch
from modelexpress.nixl_transfer import (
NixlTransferManager,
_pool_reg_enabled,
)
from modelexpress.types import ManifestMismatchError, TensorDescriptor
def _desc(name: str, addr: int, size: int) -> TensorDescriptor:
return TensorDescriptor(
name=name,
addr=addr,
size=size,
device_id=0,
dtype="torch.float16",
)
class _FakeDriver:
def __init__(
self,
allocations: list[tuple[int, int]],
err_override=None,
) -> None:
self._allocations = allocations
self._err_override = err_override
self.calls = 0
def cuMemGetAddressRange(self, addr: int):
from cuda.bindings import driver
self.calls += 1
if self._err_override is not None:
return (self._err_override, 0, 0)
for alloc_base, alloc_size in self._allocations:
if alloc_base <= addr < alloc_base + alloc_size:
return (driver.CUresult.CUDA_SUCCESS, alloc_base, alloc_size)
return (driver.CUresult.CUDA_ERROR_INVALID_VALUE, 0, 0)
@pytest.fixture
def fake_driver(monkeypatch):
from cuda.bindings import driver
def _make(allocations, err_override=None):
fake = _FakeDriver(allocations, err_override)
monkeypatch.setattr(
driver,
"cuMemGetAddressRange",
fake.cuMemGetAddressRange,
)
return fake
return _make
class TestPoolRegEnabled:
def test_default_is_off(self, monkeypatch):
monkeypatch.delenv("MX_POOL_REG", raising=False)
assert _pool_reg_enabled() is False
def test_explicit_zero_is_off(self, monkeypatch):
monkeypatch.setenv("MX_POOL_REG", "0")
assert _pool_reg_enabled() is False
def test_one_is_on(self, monkeypatch):
monkeypatch.setenv("MX_POOL_REG", "1")
assert _pool_reg_enabled() is True
def test_arbitrary_truthy_is_off(self, monkeypatch):
for value in ("true", "True", "yes", "on", "2", ""):
monkeypatch.setenv("MX_POOL_REG", value)
assert _pool_reg_enabled() is False, f"value={value!r} should not enable"
def test_read_at_call_time(self, monkeypatch):
monkeypatch.setenv("MX_POOL_REG", "1")
assert _pool_reg_enabled() is True
monkeypatch.setenv("MX_POOL_REG", "0")
assert _pool_reg_enabled() is False
class TestFindCudaAllocations:
def test_empty_returns_empty(self):
assert NixlTransferManager._find_cuda_allocations([]) == []
def test_single_tensor_single_allocation(self, fake_driver):
fake = fake_driver([(0x1000, 0x1000)])
result = NixlTransferManager._find_cuda_allocations(
[_desc("w", 0x1100, 64)]
)
assert result == [(0x1000, 0x1000)]
assert fake.calls == 1
def test_multiple_tensors_same_allocation_dedup(self, fake_driver):
fake = fake_driver([(0x1000, 0x1000)])
descriptors = [
_desc("w0", 0x1000, 64),
_desc("w1", 0x1100, 64),
_desc("w2", 0x1200, 64),
]
result = NixlTransferManager._find_cuda_allocations(descriptors)
assert result == [(0x1000, 0x1000)]
assert fake.calls == 3
def test_multiple_allocations_sorted(self, fake_driver):
fake_driver([
(0x3000, 0x1000),
(0x1000, 0x1000),
(0x2000, 0x1000),
])
descriptors = [
_desc("w0", 0x3010, 64),
_desc("w1", 0x1010, 64),
_desc("w2", 0x2010, 64),
]
result = NixlTransferManager._find_cuda_allocations(descriptors)
assert result == [
(0x1000, 0x1000),
(0x2000, 0x1000),
(0x3000, 0x1000),
]
def test_adjacent_allocations_not_merged(self, fake_driver):
fake_driver([
(0x1000, 0x1000), (0x2000, 0x1000), ])
descriptors = [
_desc("w0", 0x1010, 64),
_desc("w1", 0x2010, 64),
]
result = NixlTransferManager._find_cuda_allocations(descriptors)
assert result == [(0x1000, 0x1000), (0x2000, 0x1000)]
def test_driver_error_raises_runtime_error(self, fake_driver):
from cuda.bindings import driver
fake_driver(allocations=[], err_override=driver.CUresult.CUDA_ERROR_UNKNOWN)
with pytest.raises(RuntimeError, match="cuMemGetAddressRange failed"):
NixlTransferManager._find_cuda_allocations(
[_desc("w", 0x1000, 64)]
)
def test_driver_error_includes_tensor_name(self, fake_driver):
from cuda.bindings import driver
fake_driver(allocations=[], err_override=driver.CUresult.CUDA_ERROR_INVALID_VALUE)
with pytest.raises(RuntimeError, match="'w_named'"):
NixlTransferManager._find_cuda_allocations(
[_desc("w_named", 0x1000, 64)]
)
class TestReceiveFromSourceManifestValidation:
def _make_manager(self, monkeypatch, local_tensors):
monkeypatch.setattr(torch.cuda, "set_device", lambda *args, **kwargs: None)
mgr = NixlTransferManager(agent_name="test", device_id=0)
mgr._agent = MagicMock() mgr._tensors = local_tensors
return mgr
def test_size_mismatch_raises_manifest_mismatch(self, monkeypatch):
local = torch.zeros(10, dtype=torch.float32)
mgr = self._make_manager(monkeypatch, {"w": local})
bogus = TensorDescriptor(
name="w", addr=0x1000, size=80, device_id=0, dtype=str(local.dtype),
)
with pytest.raises(ManifestMismatchError, match="size mismatch"):
mgr.receive_from_source(
source_metadata=b"",
source_tensors=[bogus],
remote_agent_name="dummy",
)
def test_dtype_mismatch_raises_manifest_mismatch(self, monkeypatch):
local = torch.zeros(10, dtype=torch.float32)
mgr = self._make_manager(monkeypatch, {"w": local})
bogus = TensorDescriptor(
name="w", addr=0x1000, size=40, device_id=0, dtype="torch.bfloat16",
)
with pytest.raises(ManifestMismatchError, match="dtype mismatch"):
mgr.receive_from_source(
source_metadata=b"",
source_tensors=[bogus],
remote_agent_name="dummy",
)
def test_unmatched_name_skips_silently(self, monkeypatch):
mgr = self._make_manager(monkeypatch, {"x": torch.zeros(1, dtype=torch.float32)})
wrong_name = TensorDescriptor(
name="w", addr=0x1000, size=4, device_id=0, dtype="torch.float32",
)
result = mgr.receive_from_source(
source_metadata=b"",
source_tensors=[wrong_name],
remote_agent_name="dummy",
)
assert result == (0, 0, 0.0)