feat: support multiple comma-separated run IDs for unofficial runs#236
Merged
feat: support multiple comma-separated run IDs for unofficial runs#236
Conversation
Accept `?unofficialrun=123,456,789` on the dashboard URL to merge benchmark and evaluation data from multiple GitHub Actions runs into a single view. Each run's benchmarks are tagged with their originating run_url for per-point traceability, and eval config ids are offset per-run to avoid collisions in the merged set. A NON-OFFICIAL banner is rendered per run. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
When multiple unofficial runs are loaded, overlay points/rooflines for the same GPU were rendered in identical colors, making it impossible to tell runs apart. Derive a per-run hue rotation from the run's position in the loaded set and apply it via CSS filter — run 0 unchanged, each subsequent run shifted by 55°. Roofline grouping now includes runIndex so each run gets its own Pareto front. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
BarChartD3's X-mark overlay points and their error-bar groups now use the same per-run hue rotation as the inference scatter overlay, so runs loaded via a comma-separated unofficialrun= list are visually separable on the evaluation tab too. Extracts the shared filter and runIndex helpers into lib/overlay-run-style.ts to avoid duplication. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Benchmark artifacts for DeepSeek-V4-Pro runs (e.g. run 24884703163) emit `infmax_model_prefix: "dsv4pro"` while the canonical DB key is `dsv4`. Without an alias the prefix resolver fell through all three strategies (direct match, alias table, precision-suffix strip) and every row was dropped as `unmappedModel`, so unofficial-run queries for these runs returned an empty benchmark set. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Three stacked fixes so multiple unofficial runs don't all look the same: 1. Include overlay hw keys in the vendor-color active set so overlay strokes get a real hue instead of the muted-foreground fallback — hue-rotate on gray is a no-op, which was the main reason runs appeared identical. 2. Strengthen the per-run CSS filter: saturate(2.2) hue-rotate brightness(1.1), and widen the hue step from 55° to 80° for more separation. 3. Use a different stroke-dasharray per run index on overlay rooflines so runs stay distinguishable even when the filter can't produce a shift. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The CSS-filter approach made the legend and chart diverge: the legend rendered each overlay hwKey's vendor color (red for MI355X), while the chart stroke got the same base color *plus* a hue-rotate filter that shifted it to an unrelated hue. Since the legend's colored dot is a direct backgroundColor style, there was no clean way to apply the same filter to it. Switch to an explicit OKLch palette indexed by run order — both the overlay stroke and the legend swatch read from the same palette, so they match exactly. Restructure the overlay legend section to show one entry per loaded run (branch name) rather than per-hardware, since N runs × M hardware keys can't collapse to a single color per hw. Hardware identity for overlay points is still visible in the point label and tooltip; the X-mark shape and legend branch labels carry the run identity. Roofline dash-pattern per run is kept as a secondary (colorblind-friendly) encoding. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…h per-run dismiss
…setState Previously wrote to an outer variable from inside setUnofficialChartData's updater and read it synchronously on the next line. React 18 invokes updaters during render, not at the call site, so the read always saw the initial null — parseAvailableModelsAndSequences(null) returned [] and the model/sequence picker lost its options every time a run was dismissed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/api/unofficial-runto accept a comma-separated list of runIds (?runId=123,456,789). Data from all runs is fetched in order, with benchmarks and evaluations merged into a single flat response.run_urlfor per-point traceability (previously alwaysnull).config_ids are offset per-run so synthetic ids from different runs don't collide in the merged set.normalizeEvalArtifactRowsnow returns{ rows, maxConfigId }and accepts aconfigIdOffset.runInfo→runInfos: UnofficialRunInfo[](one entry per run).UnofficialRunProviderstores the array asunofficialRunInfos;unofficialRunInfois kept as a convenience alias (first run) so existing chart/overlay label consumers don't need to change.URL format
Test plan
pnpm typecheck— passes (all packages)pnpm lint/pnpm fmt— cleanpnpm test:unit— 1682 passedrun_urltagging on benchmarks, andconfigIdOffsetbehaviour innormalizeEvalArtifactRows🤖 Generated with Claude Code