2.0 KiB
SPEC-inventory: Inventar, Modell-Katalog, Placement
Paket: knaster.inventory. CLI: knaster inventory collect, knaster placement plan.
1. Node-Profil
name: pve-ada
cpu: {model: "...", cores: 8, threads: 16}
memory_gb: 64
disks: [{name: nvme0n1, size_gb: 256, rotational: false}]
gpus:
- {index: 0, name: "NVIDIA RTX 4000 Ada Generation", memory_gb: 20, compute_cap: 8.9, driver: "..."}
Datenquellen: nvidia-smi --query-gpu=index,name,memory.total,compute_cap,driver_version --format=csv,noheader,nounits, /proc/meminfo, /proc/cpuinfo bzw. lscpu, lsblk -J -b -d -o NAME,SIZE,ROTA. Die Parser sind reine Funktionen auf dem jeweiligen Text und testbar. collect ruft die Befehle lokal auf.
2. Katalog (catalog/models.yaml, catalog/roles.yaml)
Ein Modell hat kind (llm, embedding, reranker), vram_gb (Gewichte plus Mindest-KV-Cache), min_cc, engines, context, lora.
Eine Rolle hat needs (engine, min_vram_gb, min_cc, max_cc?, gpu: true|false), prefer (z. B. smallest_fitting), count und slots.
3. Placement (plan(nodes, roles, models) -> PlacementPlan)
Deterministisch:
- Alle GPUs aller Nodes zu einer Liste
(node, gpu)zusammenfassen. - Rollen nach
priority(aufsteigend) abarbeiten. Für jede Rolle werdencountGPUs gesucht, dieneedserfüllen und noch frei sind.prefer: largestwählt die GPU mit dem meisten VRAM (für LLM-Rollen).prefer: smallest_fittingwählt die kleinste passende GPU (für Embedding und Rerank). So bleiben große Karten frei.
- Rollen mit
gpu: falsebzw.cpu_fallback: truewerden ohne passende GPU den CPU-Nodes zugewiesen, sortiert nach RAM. - Pro zugewiesener Rolle werden die Katalogmodelle gelistet, die passen (Engine, VRAM, CC).
- Ergebnis:
assignments[{role, node, gpu_index?, models_fitting[]}]undunplaced[{role, reason}].
Der Plan ist der Input für platform/proxmox (welche VM-Rolle auf welchem Host mit welchem Resource Mapping) und für die Registry (welche Slots existieren).