Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions pmoves/config/profiles/laptop-4090.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,29 +61,31 @@ coding_stacks:
tz_function: coding_alibaba

# VRAM budget (16GB total, 2GB system reserve = 14GB usable)
# Installed variants: qwen3-embedding:8b (4.7GB) and qwen3-vl:8b (6.1GB).
# Profile updated 2026-05-10 to match actual inventory.
vram_budget:
total_mb: 16384
system_reserve_mb: 2048
usable_mb: 14336
max_concurrent_models: 2
idle_timeout_seconds: 180
always_resident:
- model: qwen3-embedding:4b
vram_mb: 3000
- model: qwen3-embedding:8b # 8b installed (original design specified :4b)
vram_mb: 4700
reason: "HiRAG, extract-worker, cipher-memory need constant embeddings"
co_residency_groups:
coding_focus:
models: [qwen3-coder:30b, qwen3-embedding:4b]
total_mb: 9500
models: [qwen3-coder:30b, qwen3-embedding:8b]
total_mb: 11000 # 30b offloads excess layers to 64GB RAM
general_focus:
models: [qwen3.5:9b, qwen3-embedding:4b]
total_mb: 9600
models: [qwen3.5:9b, qwen3-embedding:8b]
total_mb: 11000
research_focus:
models: [lfm2:24b, qwen3-embedding:4b]
total_mb: 14000 # Tight — may need embedding eviction (usable: 14336)
models: [lfm2:24b, qwen3-embedding:8b]
total_mb: 14336 # Tight — may need embedding eviction
multimodal_minimal:
models: [qwen3.5:4b, qwen3-embedding:4b, qwen3-vl:4b]
total_mb: 9000
models: [qwen3.5:4b, qwen3-embedding:8b, qwen3-vl:8b]
total_mb: 13800 # 3GB + 4.7GB + 6.1GB — fits 14.3GB

mcp:
- docker
Expand Down Expand Up @@ -143,6 +145,15 @@ cross_node:
- nats:4222
- minio:9000
access_via: [tailscale]
pmoves-spark:
role: fleet_inference
tailscale_host: pmoves-spark
hardware: "GB10 Grace-Blackwell 128GB unified — ARM64"
services:
- ollama:11434 # Gemma 4 31B FP16, Nemotron-Super-49B
- nim:8200 # NVIDIA NIM (optional)
access_via: [tailscale, nats]
notes: "Primary 120B+ inference node. Route lfm2:24b and qwen3-coder-480b here at full precision."
Comment thread
POWERFULMOVES marked this conversation as resolved.

channels:
nats:
Expand Down Expand Up @@ -174,7 +185,7 @@ nats_announce:
vram: 16gb
cuda: sm_89
coding: [qwen3-coder-30b, qwen3.5-9b]
embeddings: qwen3-embed-4b
embeddings: qwen3-embed-8b
stacks: [claude, codex, glm, minimax, alibaba]
claws: 4
geometry_bus: true
Expand Down
83 changes: 81 additions & 2 deletions pmoves/configs/tac_trees/node-4090-laptop.tac.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,8 @@ root:
# Phase 4: Tailscale Mesh Connectivity
# =========================================================================
- id: n4090.mesh
task: "Tailscale mesh connectivity to 5090 and Z890"
context: "All 3 nodes must be reachable for full fleet operation"
task: "Tailscale mesh connectivity to 5090, Z890, and SPARK"
context: "All fleet nodes must be reachable for full operation"
agent_hint: 4090-claude
children:
- id: n4090.mesh.status
Expand All @@ -160,6 +160,18 @@ root:
expect: "pmoves-laptop online at pmoves-laptop.ts"
agent_hint: 4090-claude

- id: n4090.mesh.ssh-enabled
task: "Tailscale SSH enabled on 4090 laptop"
action:
type: shell
command: "tailscale debug features 2>/dev/null | grep -i ssh || tailscale status --json | python -c \"import json,sys; d=json.load(sys.stdin); print('ssh-enabled' if d.get('Self',{}).get('TailscaleSSHEnabled') else 'DISABLED')\""
expect: "ssh-enabled (or SSH feature listed in debug features output)"
context: >
Tailscale SSH allows SPARK and other fleet nodes to SSH into
pmoves-laptop without Windows password. Auth via Tailscale identity.
Enable with: tailscale set --ssh (operator runs once).
agent_hint: 4090-claude

- id: n4090.mesh.reach-5090
task: "Can reach 5090 (POWERFULMOVES)"
action:
Expand All @@ -177,6 +189,17 @@ root:
expect: "Pong from pmoves-z890.ts via direct connection"
agent_hint: 4090-claude

- id: n4090.mesh.reach-spark
task: "Can reach SPARK (pmoves-spark)"
action:
type: shell
command: "tailscale ping pmoves-spark --timeout 5s --c 1"
expect: "Pong from pmoves-spark via direct connection"
context: >
DGX Spark GB10 Grace-Blackwell 128GB — fleet inference backbone.
Primary 120B+ model host. Must be tagged tag:gpu in Tailscale admin.
agent_hint: 4090-claude

- id: n4090.mesh.z890-services
task: "Z890 key services reachable"
action:
Expand All @@ -189,6 +212,62 @@ root:
expect: "All Z890 services accessible via Tailscale IP"
agent_hint: 4090-claude

# =========================================================================
# Phase 4b: Ollama Model Health
# =========================================================================
- id: n4090.ollama
task: "Ollama model inventory matches laptop-4090.yaml profile"
context: "Profile expects: qwen3-embedding:8b, qwen3-vl:8b, qwen3-coder:30b, qwen3.5:9b, qwen3.5:4b, lfm2:24b"
agent_hint: 4090-claude
children:
- id: n4090.ollama.running
task: "Ollama service running on :11434"
action:
type: shell
command: "curl -s http://localhost:11434/api/tags | python -c \"import json,sys; names=[m['name'] for m in json.load(sys.stdin)['models']]; required={'qwen3-embedding:8b','qwen3-vl:8b','qwen3-coder:30b','qwen3.5:9b','qwen3.5:4b','lfm2:24b'}; missing=required-set(names); print('ok' if not missing else 'MISSING:'+','.join(sorted(missing)))\""
expect: "ok (all 6 profile-expected models present)"
agent_hint: 4090-claude

- id: n4090.ollama.embedding
task: "qwen3-embedding:8b resident (always-resident)"
action:
type: shell
command: "curl -s http://localhost:11434/api/tags | python -c \"import json,sys; names=[m['name'] for m in json.load(sys.stdin)['models']]; print('ok' if 'qwen3-embedding:8b' in names else 'MISSING')\""
expect: "ok"
context: >
Always-resident embedding model (4.7GB VRAM).
If missing: ollama pull qwen3-embedding:8b
agent_hint: 4090-claude

- id: n4090.ollama.coder
task: "qwen3-coder:30b available (coding fallback)"
action:
type: shell
command: "curl -s http://localhost:11434/api/tags | python -c \"import json,sys; names=[m['name'] for m in json.load(sys.stdin)['models']]; print('ok' if 'qwen3-coder:30b' in names else 'MISSING')\""
expect: "ok"
context: >
Primary local coding fallback. ~18GB on disk — partial CPU offload.
If missing: ollama pull qwen3-coder:30b (~18GB, 10+ min)
agent_hint: 4090-claude

- id: n4090.ollama.stale-check
task: "No pre-2025 stale models on disk"
action:
type: manual
instruction: >
Run: ollama list
Verify NONE of these appear: gemma2, gemma3, llama3.2,
deepseek-r1, deepseek-coder-v2, phi4, qwen2.5, nomic-embed-text,
embeddinggemma, llama3.2-vision, jina-embeddings-v2-base-code, functiongemma
expect: "Only profile-expected models present"
context: >
Stale models consume ~67GB disk. Cleanup:
ollama rm nomic-embed-text embeddinggemma gemma3:latest gemma3:12b
gemma2:latest llama3.2:latest llama3.2-vision qwen2.5:7b qwen2.5vl:7b
deepseek-r1:latest deepseek-coder-v2:latest phi4:latest
jina-embeddings-v2-base-code functiongemma
agent_hint: 4090-claude

# =========================================================================
# Phase 5: NATS Announcement
# =========================================================================
Expand Down
Loading