Strata dashboard plasmoid v1.2: barre a soglie e velocita decode/prefill
- card GPU con barre progressive: VRAM (informativa), utilizzo 60/85 %, temperatura 75/85 C, potenza su budget 350 W (ambra 70 %, rosso 90 %) - velocita del motore: DEC (generazione) e PRE (prefill) in tok/s, live durante la generazione, ultima richiesta da fermo (badge LIVE/ULTIMA); semantica inversa: verde sopra la nominale, ambra fra 50 % e nominale - card servizio + controllo unificata con switch load/unload nativo e stato che si chiude sulla fase osservata - MetricBar condiviso con levelColor()/speedColor() e soglie in testa al QML - README: requisiti, campi del control plane, tabella soglie, limiti del box - avatar pixel-art 512x512 in assets/repository-avatar.png
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# KDE Strata Dashboard Plasmoid
|
||||
|
||||
Plasmoide per **KDE Plasma 6** che mostra lo stato del servizio di inferenza **Strata**
|
||||
(Qwen3.8-Flash-Next IQ2_XS servito su NVIDIA L40S) leggendo il control plane HTTP del
|
||||
servizio. Non parla mai direttamente con il motore: lo `8082` di Strata ascolta solo su
|
||||
`127.0.0.1` della macchina che lo ospita, quindi tutte le letture passano dal control plane.
|
||||
|
||||
## Cosa mostra
|
||||
|
||||
- **fase** del servizio con badge colorato: caricato / generazione / caricamento /
|
||||
scaricato / fermo / non raggiungibile;
|
||||
- **VRAM** usata e totale (barra indaco, informativa: il modello occupa quasi tutta la GPU);
|
||||
- **utilizzo, temperatura e potenza** della GPU come **barre progressive** che si riempiono
|
||||
in proporzione al valore e cambiano colore alle soglie;
|
||||
- **velocità del motore**: `DEC` (generazione, tok/s) e `PRE` (prefill, tok/s), live durante
|
||||
la generazione e riferite all'ultima richiesta quando il motore è fermo (badge
|
||||
`LIVE` / `ULTIMA`);
|
||||
- **modello**: alias, tipo di KV, contesto, concorrenza, disponibilità vision;
|
||||
- **switch carica/scarica** nativo (`POST /load`, `POST /unload?wait=0`) con stato
|
||||
`PENDING` che si chiude sulla fase osservata, non su un timer.
|
||||
|
||||
## Requisiti
|
||||
|
||||
- KDE Plasma 6;
|
||||
- `curl` e `bash`;
|
||||
- chiave del control plane in `~/.config/strata-control/control.key` (0600);
|
||||
- control plane raggiungibile su `STRATACTL_API` (default `http://172.30.150.224:18090`).
|
||||
|
||||
## Installazione
|
||||
|
||||
```bash
|
||||
kpackagetool6 -t Plasma/Applet -i .
|
||||
```
|
||||
|
||||
Per aggiornare un'installazione esistente:
|
||||
|
||||
```bash
|
||||
kpackagetool6 -t Plasma/Applet -u .
|
||||
```
|
||||
|
||||
Aggiungi poi **Strata** al desktop o a un pannello dalle impostazioni dei widget Plasma.
|
||||
|
||||
## Backend
|
||||
|
||||
- `contents/scripts/status.sh`: `GET $STRATACTL_API/status` con header `X-API-Key`, stampa il
|
||||
JSON su stdout (il widget lo legge con `P5Support.DataSource`, intervallo 4 s).
|
||||
- `contents/scripts/action.sh load|unload`: `POST` in background con `setsid` ed exit
|
||||
immediato, così il polling del widget non resta bloccato durante le operazioni lunghe.
|
||||
|
||||
Campi usati dal widget:
|
||||
|
||||
| Campo di `/status` | Uso |
|
||||
| --- | --- |
|
||||
| `phase`, `service.*` | badge di fase, tooltip |
|
||||
| `model.live.tok_s`, `model.live.prefill_tok_s_mean` | barre DEC/PRE live |
|
||||
| `model.last_timings.predicted_per_second`, `.prompt_per_second` | DEC/PRE dell'ultima richiesta |
|
||||
| `model.alias`, `kv`, `ctx`, `concurrency`, `vision` | card servizio |
|
||||
| `gpu.mem_used_mib/mem_total_mib/mem_pct`, `util_pct`, `temp_c`, `power_w`, `name` | card GPU |
|
||||
|
||||
Il control plane deve inoltrare `model.live` e `model.last_timings`: la versione del
|
||||
2026-10-25 legge `live` da `/metrics` (cache 3 s) e passa `last_timings` da `/v1/status`.
|
||||
Senza quei campi le barre DEC/PRE restano grigie.
|
||||
|
||||
## Soglie e scale
|
||||
|
||||
Tutte in testa a `contents/ui/main.qml`, facili da ritoccare:
|
||||
|
||||
| Grandezza | Fondo scala | Ambra | Rosso |
|
||||
| --- | --- | --- | --- |
|
||||
| Utilizzo GPU | 100 % | 60 % | 85 % |
|
||||
| Temperatura GPU | 100 °C | 75 °C | 85 °C |
|
||||
| Potenza GPU | 350 W (TDP L40S) | 70 % del budget | 90 % del budget |
|
||||
| Decode (generazione) | 120 tok/s | < 40 tok/s (nominale) | < 20 tok/s |
|
||||
| Prefill | 5000 tok/s | < 3000 tok/s (nominale) | < 1500 tok/s |
|
||||
|
||||
Per le due velocità la semantica è **inversa** rispetto ai carichi: alto è bene, quindi
|
||||
verde sopra la nominale, ambra fra il 50 % e la nominale, rosso sotto. Grigio = valore non
|
||||
disponibile (motore scarico, sensore assente).
|
||||
|
||||
## Note
|
||||
|
||||
- Avatar del repository in `assets/repository-avatar.png`, immagine pixel-art generata con
|
||||
Antigravity (modello immagine Gemini).
|
||||
- Il widget occupa un box desktop da 324x308 pixel logici: card e spaziature sono tarate su
|
||||
quella altezza. Se il containment lo rimpicciolisce il footer `SYNC` viene tagliato.
|
||||
|
||||
## Licenza
|
||||
|
||||
MIT. Vedi [LICENSE](LICENSE).
|
||||
Reference in New Issue
Block a user