mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-12 07:09:59 +00:00
feat(producer): lower parallel-DE router floor to 700 frames + power-state telemetry
HF_DE_PARALLEL_MIN_FRAMES default 2000 -> 700, re-calibrated by a controlled
crossover sweep (fixed content-per-frame, three synthetic profiles x
{350..3000f} x {single,par2,par3} x 3 reps, resolved worker counts and capture
modes verified per run): par3 beats single at EVERY size in every profile —
+17-21% at 700f rising to +28-34% at 3000f. That includes a
24-sub-composition profile built specifically to reproduce the 'workers
re-pay init' failure the original 2000 floor guarded against (92k tweens,
~2.5s pollSubCompositionTimelines per worker): workers initialize
concurrently, so duplicated init costs CPU, not wall-clock, and the comp
still parallelizes +19% at 700f. Below ~700f the win thins toward +10%
while paying three hardware-GPU browsers, so a floor remains. par2 loses to
par3 in every cell of every profile — the router's existing 3-worker pin is
confirmed, not changed. Harness:
plans/drawelement-fast-capture/de-crossover-bench.sh (docs repo).
Also adds on_battery / low_power_mode to render_complete and render_error.
The DE fleet is macOS laptops, and bench sweeps on an M4 Pro caught the SAME
render flipping between ~9.6 and ~17.2 ms/frame power-management regimes
with no existing telemetry signal to segment by — the router soak reading
this change needs that dimension to interpret perf on the machines users
actually render on. Sampled per event (volatile), pmset-based, darwin-only,
null-safe on failure.
Router stays default-off behind HF_DE_PARALLEL_ROUTER; this tunes what it
will do when the soak clears it to flip.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
97ec7db5cc
commit
3da31e399b
@@ -1305,9 +1305,14 @@ export function resolveInversionRetryPlan(args: {
|
||||
* but the decision itself stays gated behind its own flag pending the
|
||||
* telemetry soak (revert rate, de_verify_min_db distribution) on real wild
|
||||
* traffic — there is currently none, since nothing routes here by default.
|
||||
* Takes priority over the single-worker inversion when both would fire (a
|
||||
* higher minFrames than HF_DE_SINGLE_MIN_FRAMES is the intended shape: this
|
||||
* only picks up the long tail the inversion's own benchmark didn't cover).
|
||||
* Takes priority over the single-worker inversion when both would fire.
|
||||
* Re-calibrated 2026-07-27: a controlled crossover sweep (three content
|
||||
* profiles including a genuinely init-expensive 24-sub-composition comp;
|
||||
* worker counts and capture modes verified per run) found par3 > single at
|
||||
* every size from 350f up in every profile — workers init concurrently, so
|
||||
* per-worker init duplication costs CPU, not wall-clock. minFrames therefore
|
||||
* dropped below the inversion's threshold (700 vs 900): where both fire,
|
||||
* parallel wins over the inversion's single-worker pick (+17–21% at 700f).
|
||||
*/
|
||||
export function shouldPreferParallelDrawElement(args: {
|
||||
workerCount: number;
|
||||
@@ -2310,18 +2315,27 @@ async function executeRenderPipeline(input: {
|
||||
process.env.HF_DE_PARALLEL_STREAM === "true",
|
||||
});
|
||||
// DE parallel-router eligibility — see shouldPreferParallelDrawElement.
|
||||
// Default-off (HF_DE_PARALLEL_ROUTER); HF_DE_PARALLEL_MIN_FRAMES defaults
|
||||
// higher than the single-worker inversion's threshold since it targets
|
||||
// the long tail the inversion's own benchmark didn't cover.
|
||||
// Default-off (HF_DE_PARALLEL_ROUTER); HF_DE_PARALLEL_MIN_FRAMES default
|
||||
// 700, re-calibrated 2026-07-27 from the original safe-high 2000. A
|
||||
// controlled frame-count sweep (fixed content-per-frame, three synthetic
|
||||
// profiles × {350..3000f} × {single,par2,par3} × 3 reps, worker counts +
|
||||
// capture modes verified per run) showed par3 beating single at EVERY
|
||||
// size in every profile — +17–21% at 700f rising to +28–34% at 3000f —
|
||||
// including a 24-sub-composition profile built to reproduce the
|
||||
// "workers re-pay init" failure (92k tweens, ~2.5s
|
||||
// pollSubCompositionTimelines per worker): workers init CONCURRENTLY, so
|
||||
// duplicated init costs CPU, not wall-clock. Below ~700f the win thins
|
||||
// toward ~+10% while still paying 3 hardware-GPU browsers, so the floor
|
||||
// stays. Harness: plans/drawelement-fast-capture/de-crossover-bench.sh.
|
||||
const deParallelRouterEnabled = process.env.HF_DE_PARALLEL_ROUTER === "true";
|
||||
const deParallelMinFramesRaw = process.env.HF_DE_PARALLEL_MIN_FRAMES;
|
||||
const deParallelMinFramesNum =
|
||||
deParallelMinFramesRaw === undefined || deParallelMinFramesRaw.trim() === ""
|
||||
? 2000
|
||||
? 700
|
||||
: Number(deParallelMinFramesRaw);
|
||||
const deParallelMinFrames = Number.isFinite(deParallelMinFramesNum)
|
||||
? deParallelMinFramesNum
|
||||
: 2000;
|
||||
: 700;
|
||||
// RAM floor default 24 GB: the wild black-slab report was a 16 GB
|
||||
// machine; every clean routed cohort in telemetry so far is >=24 GB.
|
||||
// HF_DE_PARALLEL_MIN_MEM_MB overrides (0 disables the guard).
|
||||
|
||||
Reference in New Issue
Block a user