{{define "node"}}
{{t (print "dash.state." .Node.State)}} {{with .Node.OS}} · {{.}}{{end}}{{with .Node.MgmtAddr}} · {{.}}{{end}} {{with .Node.AgentVersion}} · llmgw {{.}}{{end}} · {{if .Node.LastSeenAgo}}{{t "node.last_seen" .Node.LastSeenAgo}}{{else}}{{t "node.never_seen"}}{{end}} · {{t "dash.nodes.logs"}}
{{if .OnAdminListener}}{{else}}{{template "nav" .Nav}}{{end}}{{.}}
{{end}}{{end}} {{if .Unhealthy}}{{join .Unhealthy}}
{{end}} {{with .Load}}{{if .GPUs}}| GPU | {{t "node.gpu.busy"}} | {{t "node.gpu.memory_used"}} | {{t "node.gpu.temp"}} | {{t "node.gpu.memory_temp"}} | {{t "node.gpu.power"}} | {{t "node.gpu.clock"}} | {{t "node.gpu.models"}} | {{t "node.gpu.held_back"}} |
|---|---|---|---|---|---|---|---|---|
| {{.Index}} | {{/* From the last sample; a dash where the driver or an older agent did not say, rather than a zero nobody measured. */}}{{if and .MemoryTotalMB (ge .UtilPercent 0.0)}}{{template "minibar" pctbar .UtilPercent}}{{num .UtilPercent 0}}%{{if ge .MemUtilPercent 0.0}} {{t "node.gpu.memory_util" (num .MemUtilPercent 0)}}{{end}}{{else}}—{{end}} | {{if .MemoryTotalMB}}{{template "minibar" pctbar (percent .MemoryUsedMB .MemoryTotalMB)}}{{num (gib .MemoryUsedMB) 1}} {{t "node.of_gb" (num (gib .MemoryTotalMB) 0)}}{{else}}—{{end}} | {{if .TempC}}{{num .TempC 0}} °C{{else}}—{{end}} | {{if .MemoryTempC}}{{num .MemoryTempC 0}} °C{{else}}—{{end}} | {{if and .PowerW .PowerLimitW}}{{template "minibar" pctbar (percent .PowerW .PowerLimitW)}}{{num .PowerW 0}} W {{t "node.of" (num .PowerLimitW 0)}}{{else if .PowerW}}{{num .PowerW 0}} W{{else}}—{{end}} | {{if .SMClockMHz}}{{num .SMClockMHz 0}} MHz{{else}}—{{end}} | {{/* The driver's reasons and the wear are named as the driver and the inventory name them, in English. */}}{{with index $.GPUModels .Index}}{{join .}}{{else}}—{{end}} | {{if .Throttle}}{{join .Throttle}}{{else}}{{t "node.gpu.nothing"}}{{end}}{{if gt .ECCUncorrected 0.0}} {{t "node.gpu.ecc" (num .ECCUncorrected 0)}}{{end}}{{with .Wear}}{{with .Problems}} {{join .}}{{end}}{{if gt .PCIeReplays 0}} {{t "node.gpu.pcie" (count .PCIeReplays)}}{{end}}{{end}} |
{{if .Node.Fabrics}}{{t "node.fabric.on" (join .Node.Fabrics)}} · {{t "node.fabric.map"}}{{else}}{{t "node.fabric.none"}}{{end}}
{{if .Node.IBPorts}}| {{t "node.ib.adapter"}} | {{t "dash.col.state"}} | {{t "node.ib.rate"}} | {{t "node.fabric"}} | {{t "node.ib.physically"}} | {{t "node.ib.errors"}} | {{t "node.ib.sent"}} | {{t "node.ib.received"}} |
|---|---|---|---|---|---|---|---|
{{.HCA}}/{{.Port}}{{if eq .LinkLayer "Ethernet"}} RoCE{{end}} |
{{/* The port's state and its counters are the adapter's own words. */}}
{{.State}}{{with .PhysState}} {{.}}{{end}} | {{if .RateGbps}}{{t "fabric.gbps" .RateGbps}}{{else}}—{{end}} | {{or .Fabric "—"}} | {{if .Physical}}{{.Physical}}{{else if .SMError}}{{t "node.unknown"}}{{else}}—{{end}} | {{if .Errors}}{{range $k, $v := .Errors}}{{$k}} {{$v}} {{end}}{{else}}{{t "node.none"}}{{end}} | {{if .TxBytes}}{{bytes (u64 .TxBytes)}}{{else}}—{{end}} | {{if .RxBytes}}{{bytes (u64 .RxBytes)}}{{else}}—{{end}} |
{{t "node.ib.note"}}
{{end}} {{end}} {{if .Node.GPUs}}{{with .Node.NVLinkDomain}}{{th "node.nvl.domain" .}} {{else}}{{t "node.nvl.ends_here"}}{{end}} {{if or .Node.NVLinkDomain .Node.IMEX}} · IMEX {{if eq .Node.IMEX "active"}}{{t "node.imex.active"}}, {{tn "node.imex.channels" .Node.IMEXChannels}}{{else}}{{with .Node.IMEX}}{{.}}{{else}}{{t "node.imex.not_installed"}}{{end}}{{end}}{{end}}
| {{range .Node.GPUs}} | {{.Index}} | {{end}}||
|---|---|---|---|
| GPU {{$a.Index}} | {{range $b := $.Node.GPUs}}{{if eq $a.Index $b.Index}}{{else if hasInt $a.NVLinkPeers $b.Index}} | NV | {{else}}· | {{end}}{{end}}
| GPU | {{t "node.gpu.name"}} | {{t "node.gpu.compute"}} | {{t "node.gpu.numa"}} | {{t "node.gpu.nearest"}} | {{t "node.gpu.multinode"}} |
|---|---|---|---|---|---|
| {{.Index}} | {{.Name}} | {{.ComputeCapability}} | {{.NUMA}} | {{if .NearestNIC}}{{.NearestNIC}} {{.NICPath}}{{else}}—{{end}} |
{{/* The bandwidth and fabric state are the driver's words. */}}
{{if .Domain}}{{t "node.gpu.joined"}}{{if and .Bandwidth (ne .Bandwidth "Full")}} {{t "node.gpu.bandwidth" .Bandwidth}}{{end}}{{else if .FabricState}}{{.FabricState}}{{else}}—{{end}} |
{{t "node.nvl.note"}}
{{end}}| {{t "dash.col.model"}} | {{t "dash.col.replica"}} | {{t "dash.col.state"}} | GPU | CPU | {{t "node.memory"}} |
|---|---|---|---|---|---|
| {{.Model}} | {{.Replica}} |
{{t (print "dash.state." .State)}} | {{if .GPUs}}{{range $i, $g := .GPUs}}{{if $i}}, {{end}}{{$g}}{{end}}{{else}}—{{end}} | {{template "minibar" pctbar .CPUShare}}{{t "node.cores_f" (num .CPUCores 1)}} | {{if .MemoryBytes}}{{bytes .MemoryBytes}}{{else}}—{{end}} |
{{t "node.no_engines"}}
{{end}}{{if .EngineVersions}}{{t "node.engines" (join .EngineVersions)}}{{else if .Node.Engines}}{{t "node.engines" (join .Node.Engines)}}{{else}}{{t "node.engines_none"}}{{end}}{{if .Node.Models}} · {{t "node.model_files" (len .Node.Models)}}{{end}}.
{{t "dash.no_history" .Err}}
{{else}}{{th "node.no_store"}}
{{end}}