Conversation
5d73da5 to
437f06c
Compare
|
The commit compaction bot stopped. The pull request is still a draft. Maintainers: see the lucebox_bots run log. |
|
The commit compaction bot stopped. Pushing to Maintainers: see the lucebox_bots run log. |
|
Folded 2 commits into 2 (same final code; the tree hash was checked before pushing).
Previous head: |
437f06c to
7ae026f
Compare
7ae026f to
1121a5e
Compare
|
Folded 3 commits into 2 (same final code; the tree hash was checked before pushing).
Previous head: |
1121a5e to
4eff4ad
Compare
There was a problem hiding this comment.
All reported issues were addressed across 12 files
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
A concurrency group keeps one waiting job by default, so when a second PR's GPU job arrives GitHub cancels the first PR's waiting job. Add `queue: max` (up to 100 waiting, first in first out) to the per-device groups of gpu-tests, gpu-tests-amd and speed-profile. Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Add a model-backed e2e job that runs when a maintainer adds the `e2e` label to a PR, and nightly on main. It builds luce_server for one GPU, loads the model, sends a fixed prompt suite with greedy decoding, and compares with the last good run on main. Qwen3.8-27B (with its dflash2 draft) runs on the R9700 and DS4 on the Strix Halo. Jobs go to any idle runner labelled `lucebox-e2e`, so a busy lucebox3 hands the job to the next machine. Every e2e machine has the same GPUs, ROCm and models, so they share one baseline: baseline runs on main upload their result as the artifact model-e2e-baseline-<model>-<device>, and find_baseline.py gives each job the newest one, accepting only scheduled or dispatched runs on this repository's main. Adding a machine is: models in /opt/models or ~/models (found by name), check_host.sh, and a runner with the labels it prints. The KFD health probe moves to .github/ci/kfd_health.sh so both ROCm jobs share it. The job fails on a crash, hang, GPU error in the kernel log, a server that will not load or stop, a failed request, a suite that runs out of time, or two or more checks that passed on the baseline and now fail. Changed text, a single regressed check, slower decode and a baseline from another ROCm only warn. A missing model or draft skips a PR and fails a baseline run. gpu_wait.sh sees every user's GPU processes through the kernel's KFD process list, or passwordless `sudo fuser`, and waits up to 4 minutes for them before skipping; when it cannot see them a PR skips and a baseline run fails. New kernel log lines are found by timestamp, so ring-buffer rollover cannot hide a fault. A clean pass is remembered by tree, configuration, model files, ROCm and baseline digest. Jobs are capped at 35 minutes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
1c9f715 to
9bc0f99
Compare
Keep lucebox3 as the only e2e machine for now, and drop what existed only to spread jobs over several machines: the `lucebox-e2e` runner label and the dispatch `host` input, the rocminfo HIP-index lookup, the machine .env / repository variable / model search cascade (config.sh), and the per-machine setup check (check_host.sh). Each model's GPU, HIP index, model files and server flags now sit in one table in select_models.py, and the job reads them from its matrix, with the models under vars.LUCEBOX_MODELS_DIR (default /opt/models) like the rest of CI. gpu_wait.sh reads only the kernel's KFD process list, which any user can read, and fails when it cannot; the `sudo fuser` fallback and the `unavailable` state are gone. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
What
A new Model e2e workflow (
.github/workflows/model-e2e.yml) runs a real model on lucebox3 and checks whether a change crashes it or changes its behaviour.Each job builds
luce_serverfor its GPU, loads the model, sends 16 fixed prompts with greedy decoding (.github/ci/e2e/prompts.json), stops the server, and compares with the last good run onmain(the baseline). The prompts cover arithmetic, lists, code, JSON, translation, unicode, multi-turn, a tool call, a 2.5K-token needle, streaming, thinking, a longer story, and a repeated request.When it runs
e2elabel, likecompact-commitsin ci(commits): check conventional commit style and dispatch the compaction bot #755. It runs the models the PR touches (select_models.py), or both when the PR touches neither DS4, Qwen nor shared server code. To test new pushes, remove the label and add it again.update_baselineis ticked on main.lucebox3 only
runs-on: [self-hosted, lucebox3], next togpu-tests-amd. The runner runs one job at a time, so e2e jobs never share the GPUs with each other or withgpu-tests-amd. Spreading jobs over more luceboxes can come later.select_models.pyholds each model's GPU, HIP index (R9700 = 0, Strix Halo = 1, as ingpu-tests-amd), model files and server flags. The job reads them from its matrix. Models live invars.LUCEBOX_MODELS_DIR, default/opt/models.model-e2e-baseline-<model>-<device>(kept 90 days).find_baseline.pygives each job the newest one, counting only scheduled or dispatchedmodel-e2eruns on this repo'smain, so PR code can't replace it. Results record the ROCm version, and the report warns when the baseline ran on a different one./sys/class/kfd/kfd/proc, readable by any user; it's whatrocm-smi --showpidsuses) and fails if it can't.Staying bounded
Queue fix (separate commit)
By default a concurrency group keeps only one waiting job, so a second PR's waiting GPU job cancelled the first one's.
queue: max(GitHub, May 2026) keeps up to 100 waiting, first in first out, ongpu-tests,gpu-tests-amdandspeed-profile. actionlint doesn't know the key yet, but GitHub's docs confirm it at job level withcancel-in-progress: false.Measured on lucebox5 (same R9700 + Strix Halo hardware)
gpu_wait.shreports busy when another process holds/dev/kfd.find_baseline.pyran against the live API; the artifact download itself can only run once a baseline exists onmain.Before enabling
/opt/modelson lucebox3 (or setLUCEBOX_MODELS_DIR):Qwen3.8-27B-UD-IQ4_XS.gguf,qwen38-dflash2-q8_0.gguf,DeepSeek-V4-Flash-0731-ROCMFPX-MIX-STRIX.gguf.sudo dmesgorkernel.dmesg_restrict=0. Without it every run warns that GPU errors weren't checked.mainwithupdate_baselineticked to create the first baseline (or wait for the nightly run).e2elabel.🤖 Generated with Claude Code