feat(runtime): add heterogeneous one-producer multi-consumer DFlash fanout#707
feat(runtime): add heterogeneous one-producer multi-consumer DFlash fanout#707heiheiha798 wants to merge 48 commits into
Conversation
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
Hi, it's a great work. But the updated content is huge, we will review it for some time. |
|
Thank you for taking a look, and apologies for the unsolicited ping. There is no urgency at all. We really appreciate your time and feedback. |
|
Scope update: I reduced this PR from 64 changed files to 42 to keep the review focused on producer-consumer fanout. The removed files covered the production benchmark supervisor, NVML/timing instrumentation, DFlash/FlexAttention kernel and optimizer work, and obsolete patch migrations. The remaining path now goes through the canonical typed config, launch planner, and training assembly. The narrowed branch was revalidated with 242 focused runtime tests, the 16-test SGLang capture/installer suite, full pre-commit, and a real four-GPU heterogeneous 1P3C run in which all three consumers completed 48/48 samples and 24 optimizer steps. The PR description has been updated to match the current scope and evidence. |
|
CI follow-up is now pushed at cd9ce32. This resolves the local PR Test failures in the recipe topology/count fixtures, the authenticated multi-server capture fixture, and the Mooncake transport architecture. The Mooncake fix restores the single raw-tensor wire path (is_exist/remove/put_from/get_into) and rejects incompatible backends during construction, while preserving the PR lifecycle journal, generations, recapture, leases, and deferred cleanup. Local validation on this head:
Network/model-download modules were intentionally excluded locally. Three unchanged distributed baseline tests (embedding, lm_head, and no_sync) were also excluded because they hang in this local Torch 2.11/CUDA 13 environment; their source and dependency paths have no diff from upstream/main. The upstream workflow remains authoritative for those cases. |
|
Hi @jiapingW, sorry to bother you again. The PR is now finalized at
The two offline multi-GPU SGLang capture cases were intentionally omitted on this RTX host because usable GPU P2P is unavailable. All other tests, including the live network and data-regeneration paths, were exercised locally. Could you please approve the GitHub Actions workflow when convenient? This is only a request for workflow approval; there is no urgency on the code review. Thank you. |
|
CI update: the latest At the point of failure, GPU 0 had 95.33 GiB total memory, while PID After the SGLang child exited on OOM, the existing This is also not isolated to PR #707. The identical runner/PID/allocation fingerprint caused failures in at least five distinct PRs:
An earlier #668 run that was later cancelled had already hit the same OOM at 07:43Z: https://github.com/sgl-project/SpecForge/actions/runs/29722060776. In total, there are five confirmed failed PR runs plus one cancelled run affected by the same stale process. Cleaning or restarting Local CI was already completed and reported for this exact head ( |
|
Local PR Test rerun is complete on current head
The branch remains mergeable. GitHub Actions still needs workflow approval; these are the corresponding local validation results. |
|
Hi @jiapingW, sorry to bother you again, and thank you for your previous help. The conflicts with the latest I reran the workflow locally on this exact head: the main suite passed 959/959 with no failures or errors, and the live SGLang + Mooncake capture gate passed 2/2. The two previously documented offline multi-GPU capture cases remain excluded only because this RTX host has no usable GPU P2P. For context, the previous CI failure was traced to a stale 92.58 GiB GPU allocation on the self-hosted When convenient, could you please approve the workflows? There is no urgency, and we appreciate your time and help. Thank you. |
Summary
windowed_fanoutlaunch planning -> producer and independent consumers -> standard training assembly.Runtime model
Each consumer owns an independent cursor and bounded sliding window. A target capture is reused while any consumer remains interested, reclaimed after all interests and read leases are released, and recaptured with a fresh physical generation if a lagging consumer later needs it again. Ordinary lost-response retries remain idempotent within the same generation.
The registry bounds live references and bytes, persists consumer progress and lifecycle state in SQLite, and recovers interrupted captures without granting stale read leases. Canonical JSON prompts without explicit IDs receive deterministic content-derived IDs; invalid or duplicate explicit IDs fail early.
Scope
After review, this branch was reduced from 64 changed files to 45 relative to
main. It intentionally excludes the benchmark production supervisor, NVML and input-timing instrumentation, DFlash custom kernels, fused CE and optimizer changes, FlexAttention tuning, and obsolete patch migrations. The remaining changes are limited to the fanout runtime, canonical config and launch integration, SGLang capture transport, focused tests, and one heterogeneous example.The large windowed-capture module is split into contracts, queueing, registry, and runtime responsibilities. The SGLang integration now uses one tested base-to-current patch instead of incremental migration patches.
Validation
pre-commit run --all-files: passed.4/64,8/128, and16/256; 48 prompts and 24 optimizer steps per consumer.absentat shutdown.The local four-GPU machine required
NCCL_IB_DISABLE=1andNCCL_NET=Socketto avoid its NCCL network-plugin crash. This machine-specific setting is not included in the branch.The live run validates runtime completion, lifecycle correctness, and numerical finiteness; it is not a convergence claim.