Skip to content

Dashboard trial on a fresh cluster: delta metric on save ops, RL sampler start, demo app, report (stacks on #383) - #387

Closed
droot wants to merge 10 commits into
openrl-dev:mainfrom
droot:feat/dashboard-trial-use5
Closed

droot wants to merge 10 commits into
openrl-dev:mainfrom
droot:feat/dashboard-trial-use5

Conversation

@droot

@droot droot commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator

Draft, for review. This branch stacks on #383 (the five commits of dashboard/main, rebased onto main at 0644063) and adds what came out of trying that PR on a fresh GKE cluster (open-rl-dra-use5, us-east5, 8 x H100, DRA). The write-up is in docs/briefs/pr383-dashboard-trial/findings.md; notes.md next to it is the step-by-step log with every number and screenshot.

Commits on top of #383:

  • Record a sparse delta's density and size on the save op. The FFT trainer already computes how much of the model a sparse delta changed and returns density_pct from the save, but the command record keeps only result["metrics"], so the figure never reached the inspection API (finding 13 in the report). The worker now keeps last_save_metrics (delta/density_pct, delta/changed_elements, delta/total_elements, delta/layers, time/delta_collect, time/delta_write; empty after a full checkpoint), the processor attaches them to save results, and the API server drops them from the client's save responses, which the SDK's save types do not carry. /runs/{id}/steps and the dashboard's trainer charts show them with no change on the dashboard side. Two unit tests. Verified on the cluster: a three-step Qwen3-0.6B run reported 11.6 %, 7.8 % and 6.0 % of 596 M elements per step.
  • e2e: RL scenarios ask the API server to start the sampler with the trainer. openrl.recipe=rl is what makes the API server launch the sampler alongside the trainer instead of on the first sample request; the harness never set it, so every RL scenario paid the sampler's start on its first step (about 20 s on an idle H100). Scenarios whose name carries rl or textsql now send it in TINKER_TAGS.
  • Demo app and the use5 overlay (k8s/deploy/gke-use5/). A small in-cluster FastAPI app on the API server image, code from a ConfigMap, that starts and stops sweeps of RL client Jobs from a page and shows the fleet from Run telemetry and the dashboard #383's inspection API: Sweep (spec editor, start, stop, stop-all), Fleet (the keynote mock's scene, live), Timeline (one occupancy trace per accelerator or per job, other-jobs overlay, drag to select a window, hover details), Weights (the sparse delta per step). The overlay also carries what the trial needed around Run telemetry and the dashboard #383: a dedicated dashboard service account for Workload Identity, the DCGM exporter and three PodMonitorings (exporter, scheduler's openrl_gpu_held, sampler pods), spread placement for the scheduler. It is specific to one cluster and one registry; it is here so the review can see it, not to merge as is.

What the report says about #383, in one paragraph: the mechanism works as described (placements stamped, records written, every route answers, the UI renders); the items that need attention are goodput charging the server's dispatch wait to "client", a negative since_last_step_s from the cached snapshot, the client-directory depth missing the repo's own e2e layout, nothing scraping openrl_gpu_held, no DCGM exporter in the bundle the dashboard ships with (and GKE's managed one skipping DRA pools), GKE IAM undocumented, node inventory only from DCGM, a trailing empty step, duty on a shared GPU shown per lane, a run whose client died on a 400 still reading as healthy, workers sanitising NaN to 0 before telemetry sees it, placement records per run on a shared runtime and 30 s behind, and the delta density above. Two placement observations about OpenRL itself (binpack co-locating trainer and sampler with idle GPUs around; a shared runtime's halves placed independently, so a trainer can hold a GPU idle while its sampler waits) are in the report as well.

@droot
droot force-pushed the feat/dashboard-trial-use5 branch from ed434f5 to d4d7d58 Compare October 29, 2026 19:24
ShubyM and others added 8 commits October 29, 2026 18:17
The FFT trainer already measures how many elements a sparse delta changed
and what share of the model that is, and returns density_pct from the
save, but the command record keeps only result["metrics"], so the figure
never reached the inspection API. The worker now keeps last_save_metrics
(delta/density_pct, delta/changed_elements, delta/total_elements,
delta/layers, time/delta_collect, time/delta_write; empty after a full
checkpoint), the processor attaches them to save results, and the API
server drops them from the client's save responses, which the SDK's save
types do not carry. The steps route and the dashboard's trainer charts
pick them up with no further change.
…ainer

openrl.recipe=rl is what makes the API server launch the sampler alongside
the trainer instead of on the first sample request; the harness never set
it, so every RL scenario paid the sampler's start on its first step
(about 20 s on an idle H100). Scenarios whose name carries rl or textsql
now send it in TINKER_TAGS, next to the fine-tuning type.
…on a fresh cluster

k8s/deploy/gke-use5: the FFT bundle plus openrl-dev#383's dashboard for
open-rl-dra-use5 (us-east5, 8 x H100, DRA), with what the trial needed
around it: a dedicated dashboard service account for Workload Identity,
the DCGM exporter and PodMonitorings for the exporter, the scheduler's
openrl_gpu_held and the sampler pods, spread placement, and a demo app.
The demo app is a small in-cluster FastAPI service on the API server
image, code from a ConfigMap, that starts and stops sweeps of RL client
Jobs from a page and shows the fleet from the inspection API: Sweep,
Fleet, Timeline (occupancy traces per accelerator or job, other-jobs
overlay, drag-to-select, hover details) and Weights (the sparse delta
per step). It is specific to one cluster and registry.

docs/briefs/pr383-dashboard-trial: the findings report for the team and
the step-by-step log with screenshots.
@droot
droot force-pushed the feat/dashboard-trial-use5 branch from d4d7d58 to 886489f Compare October 30, 2026 01:37
droot added 2 commits October 29, 2026 18:51
fleet.activity unioned every op span into a lane's occupancy intervals.
An FFT trainer that is not exclusive runs with CPU offload, and its saves
run without a time-slicer turn, so those saves were painted as GPU time,
inside another worker's real hold on the same claim. The slicer's log
shows the claim held by one worker through the whole span.

A lane that recorded turns is occupied only during them; its ops still
show. A lane without turns (no slicer, or a shared runtime's run lane)
keeps the ops as the stand-in.
@droot droot closed this Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants