# infervisor/plow-smi architecture

> Architecture diagram of the GitHub repository infervisor/plow-smi, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/infervisor/plow-smi
- Repository: https://github.com/infervisor/plow-smi

## Overview

Plow SMI is a heterogeneous GPU observability and control suite: users can inspect hardware in an interactive terminal, expose telemetry to Prometheus, or list and tune supported devices. The shared GPU layer discovers vendor backends and provides telemetry, process data, and control; exporter collection and CLI/TUI presentation are separate product paths. The README and sampled source establish the main boundaries, but several vendor collectors and control implementations were not inspected, so their internal call paths are not expanded.

Main entry points: [`crates/plows-gpu/src/backend`](https://github.com/infervisor/plow-smi/tree/main/crates/plows-gpu/src/backend) (Vendor backends), [`crates/plows-exporter/src/collector/manager.rs`](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/manager.rs) (Collector manager), [`crates/plows-top/src/app.rs`](https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/app.rs) (Monitor state), [`crates/plows-ctl/src/cli.rs`](https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/cli.rs) (Control commands)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_gpu["GPU runtime"]
  node_gpu_api["GPU manager<br/>[loader.rs]"]
  node_gpu_backend["Vendor backends"]
  node_gpu_metrics["GPU telemetry<br/>[metrics.rs]"]
  node_gpu_device["Device identity<br/>[device.rs]"]
  node_gpu_process["GPU processes<br/>[process.rs]"]
  node_gpu_amd["AMD driver access<br/>[mod.rs]"]
  node_gpu_amdprocs["AMD process data<br/>[procs.rs]"]
  node_gpu_nvml["NVML interface<br/>[nvml.rs]"]
  node_gpu_dynlib["Dynamic libraries<br/>[dynlib.rs]"]
end

subgraph group_export["Metrics exporter"]
  node_export_server["HTTP server<br/>[server.rs]"]
  node_export_manager["Collector manager<br/>[manager.rs]"]
  node_export_gpu["GPU collector<br/>[gpu.rs]"]
  node_export_system["System collector<br/>[system.rs]"]
  node_export_tpu["TPU collector<br/>[tpu.rs]"]
  node_export_gpu_metrics["GPU metrics<br/>[gpu_metrics.rs]"]
  node_export_system_metrics["System metrics<br/>[system_metrics.rs]"]
  node_export_registry[("Metric registry<br/>[registry.rs]")]
end

subgraph group_control["Device control"]
  node_ctl_cli["Control commands<br/>[cli.rs]"]
  node_ctl_apply["Profile apply<br/>[apply.rs]"]
  node_ctl_profile["Control profiles<br/>[profile.rs]"]
  node_ctl_outcome["Apply outcomes<br/>[outcome.rs]"]
  node_ctl_vendor["Vendor controls"]
end

subgraph group_top["Interactive monitor"]
  node_top_app["Monitor state<br/>[app.rs]"]
  node_top_gpu["GPU display data<br/>[gpu.rs]"]
  node_top_system["System display data<br/>[system.rs]"]
  node_top_ui["Terminal UI<br/>[ui.rs]"]
end

subgraph group_cli["Unified CLI"]
  node_unified_cli["Unified commands<br/>[main.rs]"]
  node_cli_ctl["Control dispatch<br/>[mod.rs]"]
end

node_user(("Operator"))
node_gpu_driver["Host GPU drivers"]
node_export_user(("Metrics scraper"))
node_control_user(("Control operator"))
node_top_user(("Monitor operator"))
node_cli_user(("CLI operator"))

node_gpu_api -->|"probes"| node_gpu_backend
node_gpu_backend -->|"implements"| node_gpu_metrics
node_gpu_backend -->|"exposes devices"| node_gpu_device
node_gpu_backend -->|"reports processes"| node_gpu_process
node_gpu_backend -->|"uses NVML"| node_gpu_nvml
node_gpu_nvml -->|"loads dynamically"| node_gpu_dynlib
node_gpu_backend -.->|"reads driver"| node_gpu_amd
node_gpu_amdprocs -->|"provides process data"| node_gpu_process
node_gpu_nvml -.->|"queries"| node_gpu_driver
node_gpu_amd -->|"reads kernel interface"| node_gpu_driver
node_user -->|"starts exporter"| node_export_server
node_export_server -->|"registers collectors"| node_export_manager
node_export_manager -->|"collects"| node_export_gpu
node_export_manager -->|"collects"| node_export_system
node_export_manager -->|"collects"| node_export_tpu
node_export_manager -.->|"caches snapshots"| node_export_gpu_metrics
node_export_system -->|"updates"| node_export_system_metrics
node_export_system_metrics -->|"registers metrics"| node_export_registry
node_export_user -->|"scrapes metrics"| node_export_server
node_control_user -->|"requests control"| node_ctl_cli
node_ctl_cli -.->|"runs apply"| node_ctl_apply
node_ctl_apply -->|"reads profile"| node_ctl_profile
node_ctl_apply -->|"produces outcome"| node_ctl_outcome
node_ctl_cli -.->|"dispatches commands"| node_ctl_vendor
node_ctl_vendor -.->|"controls GPUs"| node_gpu_api
node_top_user -->|"uses monitor"| node_top_ui
node_top_ui -->|"renders state"| node_top_app
node_top_app -.->|"updates GPU data"| node_top_gpu
node_top_app -.->|"updates system data"| node_top_system
node_top_app -.->|"reads GPU telemetry"| node_gpu_api
node_cli_user -->|"runs command"| node_unified_cli
node_unified_cli -->|"dispatches ctl"| node_cli_ctl
node_cli_ctl -->|"delegates"| node_ctl_cli
node_unified_cli -->|"starts export"| node_export_server

click node_gpu_api "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/loader.rs"
click node_gpu_backend "https://github.com/infervisor/plow-smi/tree/main/crates/plows-gpu/src/backend"
click node_gpu_metrics "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/metrics.rs"
click node_gpu_device "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/device.rs"
click node_gpu_process "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/process.rs"
click node_gpu_amd "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/amdgpu/mod.rs"
click node_gpu_amdprocs "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/amdgpu/procs.rs"
click node_gpu_nvml "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/ffi/nvml.rs"
click node_gpu_dynlib "https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/ffi/dynlib.rs"
click node_export_server "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/server.rs"
click node_export_manager "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/manager.rs"
click node_export_gpu "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/gpu.rs"
click node_export_system "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/system.rs"
click node_export_tpu "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/tpu.rs"
click node_export_gpu_metrics "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/metrics/gpu_metrics.rs"
click node_export_system_metrics "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/metrics/system_metrics.rs"
click node_export_registry "https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/metrics/registry.rs"
click node_ctl_cli "https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/cli.rs"
click node_ctl_apply "https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/apply.rs"
click node_ctl_profile "https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/profile.rs"
click node_ctl_outcome "https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/outcome.rs"
click node_ctl_vendor "https://github.com/infervisor/plow-smi/tree/main/crates/plows-ctl/src"
click node_top_app "https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/app.rs"
click node_top_gpu "https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/gpu.rs"
click node_top_system "https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/system.rs"
click node_top_ui "https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/ui.rs"
click node_unified_cli "https://github.com/infervisor/plow-smi/blob/main/crates/plows-cli/src/main.rs"
click node_cli_ctl "https://github.com/infervisor/plow-smi/blob/main/crates/plows-cli/src/cmd_ctl/mod.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_gpu_api,node_gpu_backend,node_gpu_metrics,node_gpu_device,node_gpu_process,node_gpu_amd,node_gpu_amdprocs,node_gpu_nvml,node_gpu_dynlib toneBlue
class node_export_server,node_export_manager,node_export_gpu,node_export_system,node_export_tpu,node_export_gpu_metrics,node_export_system_metrics,node_export_registry toneAmber
class node_ctl_cli,node_ctl_apply,node_ctl_profile,node_ctl_outcome,node_ctl_vendor toneMint
class node_top_app,node_top_gpu,node_top_system,node_top_ui toneRose
class node_unified_cli,node_cli_ctl,node_user,node_gpu_driver,node_export_user,node_control_user,node_top_user,node_cli_user toneIndigo
```

## Components

### GPU runtime

- [GPU manager](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/loader.rs): `crates/plows-gpu/src/loader.rs`
- [Vendor backends](https://github.com/infervisor/plow-smi/tree/main/crates/plows-gpu/src/backend): `crates/plows-gpu/src/backend`
- [GPU telemetry](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/metrics.rs): `crates/plows-gpu/src/metrics.rs`
- [Device identity](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/device.rs): `crates/plows-gpu/src/device.rs`
- [GPU processes](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/process.rs): `crates/plows-gpu/src/process.rs`
- [AMD driver access](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/amdgpu/mod.rs): `crates/plows-gpu/src/amdgpu/mod.rs`
- [AMD process data](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/amdgpu/procs.rs): `crates/plows-gpu/src/amdgpu/procs.rs`
- [NVML interface](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/ffi/nvml.rs): `crates/plows-gpu/src/ffi/nvml.rs`
- [Dynamic libraries](https://github.com/infervisor/plow-smi/blob/main/crates/plows-gpu/src/ffi/dynlib.rs): `crates/plows-gpu/src/ffi/dynlib.rs`

### Metrics exporter

- [HTTP server](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/server.rs): `crates/plows-exporter/src/server.rs`
- [Collector manager](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/manager.rs): `crates/plows-exporter/src/collector/manager.rs`
- [GPU collector](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/gpu.rs): `crates/plows-exporter/src/collector/gpu.rs`
- [System collector](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/system.rs): `crates/plows-exporter/src/collector/system.rs`
- [TPU collector](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/collector/tpu.rs): `crates/plows-exporter/src/collector/tpu.rs`
- [GPU metrics](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/metrics/gpu_metrics.rs): `crates/plows-exporter/src/metrics/gpu_metrics.rs`
- [System metrics](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/metrics/system_metrics.rs): `crates/plows-exporter/src/metrics/system_metrics.rs`
- [Metric registry](https://github.com/infervisor/plow-smi/blob/main/crates/plows-exporter/src/metrics/registry.rs): `crates/plows-exporter/src/metrics/registry.rs`

### Device control

- [Control commands](https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/cli.rs): `crates/plows-ctl/src/cli.rs`
- [Profile apply](https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/apply.rs): `crates/plows-ctl/src/apply.rs`
- [Control profiles](https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/profile.rs): `crates/plows-ctl/src/profile.rs`
- [Apply outcomes](https://github.com/infervisor/plow-smi/blob/main/crates/plows-ctl/src/outcome.rs): `crates/plows-ctl/src/outcome.rs`
- [Vendor controls](https://github.com/infervisor/plow-smi/tree/main/crates/plows-ctl/src): `crates/plows-ctl/src`

### Interactive monitor

- [Monitor state](https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/app.rs): `crates/plows-top/src/app.rs`
- [GPU display data](https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/gpu.rs): `crates/plows-top/src/gpu.rs`
- [System display data](https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/system.rs): `crates/plows-top/src/system.rs`
- [Terminal UI](https://github.com/infervisor/plow-smi/blob/main/crates/plows-top/src/ui.rs): `crates/plows-top/src/ui.rs`

### Unified CLI

- [Unified commands](https://github.com/infervisor/plow-smi/blob/main/crates/plows-cli/src/main.rs): `crates/plows-cli/src/main.rs`
- [Control dispatch](https://github.com/infervisor/plow-smi/blob/main/crates/plows-cli/src/cmd_ctl/mod.rs): `crates/plows-cli/src/cmd_ctl/mod.rs`

### Other components

- **Operator**
- **Host GPU drivers**
- **Metrics scraper**
- **Control operator**
- **Monitor operator**
- **CLI operator**

## Connections

- GPU manager → Vendor backends: probes (evidence: `crates/plows-gpu/src/lib.rs`)
- Vendor backends → GPU telemetry: implements (evidence: `crates/plows-gpu/src/backend/nvidia.rs`)
- Vendor backends → Device identity: exposes devices (evidence: `crates/plows-gpu/src/backend/nvidia.rs`)
- Vendor backends → GPU processes: reports processes (evidence: `crates/plows-gpu/src/backend/nvidia.rs`)
- Vendor backends → NVML interface: uses NVML (evidence: `crates/plows-gpu/src/backend/nvidia.rs`)
- NVML interface → Dynamic libraries: loads dynamically (evidence: `crates/plows-gpu/src/ffi/nvml.rs`)
- Vendor backends → AMD driver access: reads driver
- AMD process data → GPU processes: provides process data (evidence: `crates/plows-gpu/src/amdgpu/procs.rs`)
- NVML interface → Host GPU drivers: queries
- AMD driver access → Host GPU drivers: reads kernel interface (evidence: `crates/plows-gpu/src/amdgpu/mod.rs`)
- Operator → HTTP server: starts exporter
- HTTP server → Collector manager: registers collectors (evidence: `crates/plows-exporter/src/server.rs`)
- Collector manager → GPU collector: collects
- Collector manager → System collector: collects (evidence: `crates/plows-exporter/src/server.rs`)
- Collector manager → TPU collector: collects (evidence: `crates/plows-exporter/src/server.rs`)
- Collector manager → GPU metrics: caches snapshots
- System collector → System metrics: updates (evidence: `crates/plows-exporter/src/server.rs`)
- System metrics → Metric registry: registers metrics (evidence: `crates/plows-exporter/src/metrics/system_metrics.rs`)
- Metrics scraper → HTTP server: scrapes metrics
- Control operator → Control commands: requests control
- Control commands → Profile apply: runs apply (evidence: `crates/plows-ctl/src/apply.rs`)
- Profile apply → Control profiles: reads profile (evidence: `crates/plows-ctl/src/apply.rs`)
- Profile apply → Apply outcomes: produces outcome (evidence: `crates/plows-ctl/src/apply.rs`)
- Control commands → Vendor controls: dispatches commands
- Vendor controls → GPU manager: controls GPUs
- Monitor operator → Terminal UI: uses monitor
- Terminal UI → Monitor state: renders state (evidence: `crates/plows-top/src/ui.rs`)
- Monitor state → GPU display data: updates GPU data (evidence: `crates/plows-top/src/app.rs`)
- Monitor state → System display data: updates system data (evidence: `crates/plows-top/src/app.rs`)
- Monitor state → GPU manager: reads GPU telemetry
- CLI operator → Unified commands: runs command
- Unified commands → Control dispatch: dispatches ctl (evidence: `crates/plows-cli/src/main.rs`)
- Control dispatch → Control commands: delegates (evidence: `crates/plows-cli/src/cmd_ctl/mod.rs`)
- Unified commands → HTTP server: starts export
