Repository navigation
CI gpu-scheduling: interleaved best-of-3 timings; assert session reuse, not a chunk-spread race - #65
Merged
Merged
Conversation
… instead of a chunk-spread race The two develop failures of multi-GPU scheduling (runs 37220358649 and 37226241965) were not the timing assertions, which passed with their usual margins (ladder 0.78-0.79x against 0.95, 10 s single file 1.06x against 1.10), nor card contention (the x2 pod holds both devbox cards through the device plugin; per-card jobs queued meanwhile ran on the A310). They were the reuse step's 'every card took a chunk' check on the 70 s H.264 rung: that encode is decode-bound, the A750 finishes each chunk before the next is decoded, and the speed gate rightly kept the A380 out in 2 of 6 runs, finishing faster (7.7 s against 8.1-8.7 s). - The reuse step now asserts what it is for: every card that encoded built one session and reused it for each further chunk, nothing failed to reset, and at least one session was reused. - Every timing assertion compares within the run, best of three interleaved rounds with the plan order rotated per round: speed_aware_timings.py now also times the encode-bound archive ladders (0.85x), and the single-shot 0.95x / 0.85x checks in the ladder and busy steps become correctness-only. One job per card: best of three. Every round, each plan's spread and the paired ratios go to the step summary and speed_aware_timings.json. - Limits unchanged (0.95, 1.10, 0.85, 1.15): six develop runs measured 0.78-0.79, 1.06-1.07, 0.66-0.71 and 0.96-1.00.
…evice plugin already serialise it
The group kept one pending scheduling job and cancelled the others
('a higher priority waiting request for safewords-runners-gpu-x2 exists'):
develop run 37240219796 (#63) lost its scheduling job that way.
Collaborator
Author
|
Second commit: the job-level concurrency group is removed. It kept only one pending scheduling job and cancelled the rest ("Canceling since a higher priority waiting request for safewords-runners-gpu-x2 exists"). That is how develop run 37240219796 (#63) and my dispatch 37240853718 lost their scheduling jobs. The one-runner x2 set plus the device plugin already serialize the job: without the group, four dispatches queued and ran one after another, and none was cancelled. Verification: workflow_dispatch runs on this branch. All passed. Values are best-of-3 ratios, with the per-round paired ratios in brackets.
|
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.
Cause of the develop failures
multi-GPU schedulingfailed on develop in runs 37220358649 (#52's merge) and 37226241965 (#55's merge). Neither failure was the timing assertions, and neither was card contention:gpu.intel.com/i915: 2on devbox (allocatable: exactly 2). The Intel device plugin runs with its default-shared-dev-num 1. Every other GPU runner set (safewords-runners-gpu,transcdr-intel-gpu) requests i915, and no other pod on devbox mounts/dev/dri. All of this was checked on the live cluster. In practice, when run 37229429851's four per-card jobs were queued during 37228352673's x2 job, all four ran on vulpes-zerda's A310. The one time windows overlapped (37222955807's vp9 job, 18:25-18:27), that job was also on the A310.FAIL: reuse-h264.log: no chunk was encoded on card(s) ['0']: {'1': 4}. The reuse step runs a 70 s H.264 rung as four chunks. That encode is decode-bound: the A750 finishes each chunk before the next one is decoded. So the speed gate (Speed-aware multi-GPU scheduling: decode pulled by speed, tail gate, fastest card for single-device work #52) keeps the A380 out whenever the A750 is free first, which is correct. It happened in 2 of 6 runs, and those runs were faster: 7.7 s, against 8.1-8.7 s when the A380 took a chunk. The assertion was racing the scheduler. It was not a regression.Fix
multi_gpu_check.py reuse). Every card that encoded built exactly one session and reused it for each further chunk. No reset failed, was unsupported or was evicted. At least one session was reused. The previous step only printed these counters. The spread of chunks across cards is still asserted by the ladder and archive steps, where it is stable.speed_aware_timings.py). It now also times the archive ladders. The single-shot 0.95x and 0.85x checks in the first two steps become correctness-only (pinned / all cards busy / chunks / decode). For one job per card, each card's best of 3 together is compared with its best of 3 alone.speed_aware_timings.jsonin the logs artifact.