node metrics
This commit is contained in:
@@ -120,6 +120,12 @@ def test_dashboard_exposes_admin_model_inventory_and_release_controls():
|
||||
assert 'id="admin-node-pool"' in html
|
||||
assert "renderAdminNodePool" in html
|
||||
assert "model drive" in html
|
||||
# RAM and VRAM live in the network-map capacity object, not at node top level.
|
||||
assert "node.ram_bytes = cap.ram_bytes" in html
|
||||
assert "node.vram_bytes = cap.vram_bytes" in html
|
||||
assert 'id="model-placement-dialog"' in html
|
||||
assert "chooseModelPlacementNode" in html
|
||||
assert "node_id: nodeId" in html
|
||||
|
||||
|
||||
def test_network_map_includes_node_friendly_name():
|
||||
|
||||
@@ -2869,6 +2869,43 @@ def test_same_endpoint_can_register_multiple_models():
|
||||
tracker.stop()
|
||||
|
||||
|
||||
def test_explicit_model_placement_targets_only_the_selected_node():
|
||||
"An admin can add and release a model on one chosen multi-model node.\n\nTags: http, routing, tracker"
|
||||
from meshnet_tracker.server import _release_model_locked, _request_model_load_locked
|
||||
|
||||
tracker = _tracker(model_presets={
|
||||
"model-a": {"total_layers": 4, "bytes_per_layer": {"bfloat16": 1_000}, "hf_repo": "org/ModelA"},
|
||||
"model-b": {"total_layers": 4, "bytes_per_layer": {"bfloat16": 1_000}, "hf_repo": "org/ModelB"},
|
||||
})
|
||||
tracker_port = tracker.start()
|
||||
try:
|
||||
registrations = []
|
||||
for port in (9062, 9063):
|
||||
registrations.append(_post_json(
|
||||
f"http://127.0.0.1:{tracker_port}/v1/nodes/register",
|
||||
{"endpoint": f"http://127.0.0.1:{port}", "model": "model-a", "hf_repo": "org/ModelA",
|
||||
"num_layers": 4, "shard_start": 0, "shard_end": 3, "max_loaded_shards": 2,
|
||||
"vram_bytes": 20_000, "ram_bytes": 20_000, "quantizations": ["bfloat16"],
|
||||
"benchmark_tokens_per_sec": 1.0, "hardware_profile": {}, "score": 1.0},
|
||||
))
|
||||
selected, other = (item["node_id"] for item in registrations)
|
||||
|
||||
with tracker._lock:
|
||||
assignment = _request_model_load_locked(tracker._server, "model-b", selected) # type: ignore[arg-type]
|
||||
assert assignment is not None
|
||||
assert assignment["node_id"] == selected
|
||||
assert tracker._registry[selected].pending_new_assignment is not None
|
||||
assert tracker._registry[other].pending_new_assignment is None
|
||||
|
||||
with tracker._lock:
|
||||
released = _release_model_locked(tracker._server, "model-a", selected) # type: ignore[arg-type]
|
||||
assert released == 1
|
||||
assert len(tracker._registry[selected].pending_directives) == 2
|
||||
assert tracker._registry[other].pending_directives == []
|
||||
finally:
|
||||
tracker.stop()
|
||||
|
||||
|
||||
def test_scale_demanded_models_queues_add_shard_on_spare_host():
|
||||
"Scale demanded models queues add shard on spare host\n\nTags: http, routing, tracker"
|
||||
tracker = _tracker(model_presets={
|
||||
|
||||
Reference in New Issue
Block a user