[verified] fix: preserve tracker precision eligibility
This commit is contained in:
@@ -32,6 +32,15 @@ from meshnet_node.model_backend import (
|
||||
from meshnet_node.torch_server import TorchNodeServer
|
||||
|
||||
|
||||
def _require_functional_torch():
|
||||
"""Skip tensor-behaviour tests when the installed torch namespace is incomplete."""
|
||||
torch = pytest.importorskip("torch")
|
||||
required = ("tensor", "zeros", "ones", "arange", "bfloat16", "long")
|
||||
if not all(hasattr(torch, name) for name in required):
|
||||
pytest.skip("requires a functional PyTorch tensor runtime")
|
||||
return torch
|
||||
|
||||
|
||||
class _FakeBackend:
|
||||
model_id = "fake-model"
|
||||
total_layers = 12
|
||||
@@ -526,13 +535,14 @@ def test_distributed_generating_log_includes_tps(capsys):
|
||||
out = capsys.readouterr().out
|
||||
assert "generating step=1/1" in out
|
||||
assert " tps=" in out
|
||||
assert "generation complete tokens=1" in out
|
||||
assert "generation complete session=" in out
|
||||
assert "tokens=1" in out
|
||||
assert out.count("generating step=1/1") == 1
|
||||
|
||||
|
||||
def test_int_tensor_header_serializes_torch_tensors():
|
||||
"Int tensor header serializes torch tensors\n\nTags: model, node, real-inference"
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
|
||||
header = _int_tensor_header(torch.tensor([[1, 2, 3]], dtype=torch.long))
|
||||
|
||||
@@ -544,7 +554,7 @@ def test_bfloat16_wire_decode_views_owned_bytes_without_float32_round_trip():
|
||||
|
||||
Tags: model, performance, wire
|
||||
"""
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
body = torch.tensor([[1, 2]], dtype=torch.bfloat16).view(torch.uint8).numpy().tobytes()
|
||||
|
||||
decoded = _tensor_from_bfloat16_bytes(body, [1, 2], torch)
|
||||
@@ -555,7 +565,7 @@ def test_bfloat16_wire_decode_views_owned_bytes_without_float32_round_trip():
|
||||
|
||||
def test_decoder_attention_mask_is_causal_float_mask():
|
||||
"Decoder attention mask is causal float mask\n\nTags: model, node, real-inference"
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
|
||||
hidden_states = torch.zeros((1, 3, 8), dtype=torch.bfloat16)
|
||||
mask = _decoder_attention_mask(torch.ones((1, 3), dtype=torch.long), hidden_states, torch)
|
||||
@@ -573,7 +583,7 @@ def test_call_layer_passes_rotary_position_embeddings():
|
||||
assert kwargs["position_embeddings"] == "rotary"
|
||||
return hidden_states
|
||||
|
||||
hidden, cache_state = _call_layer(
|
||||
hidden = _call_layer(
|
||||
NeedsPositionEmbeddings(),
|
||||
"hidden",
|
||||
attention_mask=None,
|
||||
@@ -582,7 +592,6 @@ def test_call_layer_passes_rotary_position_embeddings():
|
||||
)
|
||||
|
||||
assert hidden == "hidden"
|
||||
assert cache_state is None
|
||||
|
||||
|
||||
def _fake_cache_shard(torch, *, max_sessions=16, ttl=600.0):
|
||||
@@ -618,7 +627,7 @@ def _fake_cache_shard(torch, *, max_sessions=16, ttl=600.0):
|
||||
|
||||
def test_shard_cache_prefill_then_decode_reuses_opaque_layer_state():
|
||||
"Shard cache prefill then decode reuses opaque layer state\n\nTags: cache, model, node, real-inference"
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
shard = _fake_cache_shard(torch)
|
||||
|
||||
prefill_hidden = torch.zeros((1, 4, 2), dtype=torch.bfloat16)
|
||||
@@ -658,7 +667,7 @@ def test_shard_cache_prefill_then_decode_reuses_opaque_layer_state():
|
||||
|
||||
def test_shard_cache_decode_miss_is_explicit():
|
||||
"Shard cache decode miss is explicit\n\nTags: cache, model, node, real-inference"
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
shard = _fake_cache_shard(torch)
|
||||
|
||||
with pytest.raises(KVCacheMiss):
|
||||
@@ -674,7 +683,7 @@ def test_shard_cache_decode_miss_is_explicit():
|
||||
|
||||
def test_shard_cache_lru_bounds_sessions():
|
||||
"Shard cache lru bounds sessions\n\nTags: cache, model, node, real-inference"
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
shard = _fake_cache_shard(torch, max_sessions=1)
|
||||
|
||||
for session in ("old", "new"):
|
||||
@@ -1154,7 +1163,7 @@ def test_torch_model_shard_prefers_partial_loader_for_local_snapshot(tmp_path, m
|
||||
"torch",
|
||||
types.SimpleNamespace(
|
||||
cuda=types.SimpleNamespace(is_available=lambda: False),
|
||||
device=lambda value: value,
|
||||
device=lambda value: types.SimpleNamespace(type=value),
|
||||
bfloat16="bf16",
|
||||
),
|
||||
)
|
||||
@@ -1194,7 +1203,7 @@ def test_two_node_gpt2_completion_is_deterministic():
|
||||
"Two node gpt2 completion is deterministic\n\nTags: model, node, real-inference"
|
||||
if os.environ.get("CI"):
|
||||
pytest.skip("GPT-2 integration test is skipped in CI")
|
||||
torch = pytest.importorskip("torch")
|
||||
torch = _require_functional_torch()
|
||||
pytest.importorskip("transformers")
|
||||
pytest.importorskip("safetensors")
|
||||
pytest.importorskip("accelerate")
|
||||
|
||||
Reference in New Issue
Block a user