Repository navigation
ci(k3-agentic): Kimi-K3 AgentX 1M P/D cells, one per concurrency on its best measured prefill - #2787
wanzhenchn wants to merge 17 commits into
Conversation
5f93661 to
66fc5a3
Compare
valarLip
left a comment
There was a problem hiding this comment.
Thanks — I reviewed HEAD 66fc5a30a (base zwan/k3-pp); the related unit tests (118) pass locally, and I expanded the new cells with pd_matrix.py to check the merged env/args per cell.
The two points that matter most:
- The C1
-monocell can't arm mono at this head — Kimi-K3'sconfig_refusalrefuses any KV connector, and a P/D decode always has one, so non-mono numbers would be published under the mono name (models_atomesh.yaml:1279). - The async gzip thread is non-daemon and never joined, so shutdown can kill it mid-compression; the root cause of the stall is gzip's default
compresslevel=9(model_runner.py:1307).
Also: three new env vars are only implemented on #2786, with nothing enforcing the merge order (:1309). The rest are docs/comments, parsing, tests and CI cost.
Checked and fine: the */ glob, the exception paths after the _on_trace_ready split, the merged YAML (max_num_seqs, CPU memory tiers, OPUS, PP layer split totalling 93), and the bash under set -e.
66fc5a3 to
a4d277e
Compare
|
Thanks for the careful review. All 11 points are addressed on the new head a4d277e, force-pushed on the same base, and the description is updated. One validation is still open: a PP8 profile run with the new gzip level (point 2) is waiting for a free node pair. 1. 2. Async gzip thread never joined: fixed by removing the thread. I agree the root cause is the gzip level. 3. Doc's completion rule: moot. The doc row went with the flag. With gzip back inside 4. 5. Three env vars implemented only on #2786: gated. A cell's
6. "PP engines (the prefill) ignore it" sits in
The C1–C4 prefills park nothing, and the PP8 prefills ignore the setting, since 7. Gzip failure logged as an export failure; stale 8. ReplaySSM note says "off again from CONC 32": the note was stale. ReplaySSM defaults to on whenever drafts run ( 9. No tests for the model_runner path: added for what remains. With the async path gone,
The new launcher checks have tests in 10. Copy-pasted
11. Nine new cells roughly double Kimi-K3's nightly: they now replace the old ones. The nine cells replace the 13 older 1P1D cells at the same concurrencies (edc2f1b): TP8 DSpark7 C1/2/4, DSpark3 C16, no-draft C32–C88, and the TP8×DCP8-prefill DSpark4 C48–C88.
273 tests pass across |
valar-cop
left a comment
There was a problem hiding this comment.
not ready yet..
any perf number for the C16 prefill cell? gsm8k at C88 with opus? and the PP8 profile run on this head?
valar-cop
left a comment
There was a problem hiding this comment.
some changes needed
any perf number? gsm8k for C1 and C88? and the C16/PP8 runs are still pending?
|
Thanks. Your review is on a4d277e; since then 324361a trimmed Kimi-K3's nightly to the nine AgentX cells and moved the profile cell to the nightly PP8 C72. Seven points are addressed in three commits on top (e184df3, 8f2484c, and 17242ca, now the head; no force-push). Two are answered below without a change. For your three questions: the PP8 profile run is going, and C16 and C88 GSM8K will run when node pairs free up.
On #2709 + #2786 + this PR, the C1 run (40634392873) logged
Envs only on #2786: gated by merge order, enforced at launch. Each cell's Kernel-shape exclusion in the YAML: comment added (17242ca). The comment now says to drop the exclusion once aiter's FP8 GEMM serves K 128. aiter has no tuned FP8 config for that GEMM (N 12288, K 128), and its untuned FP8 GEMM needs K above 192. A fallback for that shape is an aiter change, so until then the exclusion stays, scoped to the PP8 prefill only. OPUS not in the name: added (17242ca). C72, C88 and the profile cell now end in
C88's 176 vs "neighbouring band": comment made precise (17242ca). 176 is 2 × 88, not C72's band. The recipe sets max-num-seqs to 2 × CONC at every point (144 at C72), and C88 follows that rule. "Takes the neighbouring band" did read as if max_num_seqs came along, so the comment now says CONC 32 and 88 take the settings of the recipe point below them, CONC 16 and 72, except max_num_seqs. Your three questions:
272 tests pass across |
17242ca to
a1c7dc4
Compare
|
Thanks. This PR now changes no ATOM code: I force-pushed to drop the two commits that touched ATOM change in a CI PR, and 20% vs 25%: moved to #2786 (1671386dc). It is #2786's item 7 now. The comment there gives one figure, the measured one: on a PP8 stage trace, level 3 is ~6x faster for a file ~25% larger (1.3 s vs 8.4 s on 265 MB). Hard-coded 8 devices: fixed in the launcher (a1c7dc4). A role's default A worker with no rank dir holds the wait open: fixed (a1c7dc4). The wait no longer assumes a pending rank per worker. The ranks are the
Explicit
Log string from #2786: it is main's, and a changed line fails the cell. Mono exclusions in the cell: kept. They are a property of the mono deployment, not of the model: the other Kimi-K3 cells quantize those five layers. InferenceX#4307 does the same, putting them in its CONC 1 point's Your three questions:
278 tests pass across |
a1c7dc4 to
514f4fa
Compare
valar-cop
left a comment
There was a problem hiding this comment.
not ready yet..
any perf number? gsm8k at C1/C88? and the new tests are not run by this pr's ci
ci green.
514f4fa to
7961a19
Compare
valar-cop
left a comment
There was a problem hiding this comment.
some changes needed, mostly doc/comment fixes and two coverage questions..
any e2e run of the nine cells at this head? gsm8k at C1/C88? C16 on the split?
ci green.
|
Thanks. The three inline points are fixed in 7961a19aa, the new head. Its parent commits are unchanged: #2709's head moved to 0c3b9f1, which changes only its last commit's date, and this branch was rebased onto it ( A single exclusion pattern became one-character patterns: fixed. Non-object JSON died later on an unrelated unbound variable: fixed. If Mono in The new tests and this PR's CI. Pre Checkin, which runs Your other questions:
|
7961a19 to
2c1ad68
Compare
|
Thanks. Two points are fixed in 2c1ad68a4, the new head, now on #2709's 687a3ba ( Profiler comment over The recipe says OPUS but never sets it: fixed. Its decode block now exports Dropping the agg 1M, 1P2D and 2P1D cells: intended. They were added to check that CI's agg path and those topologies worked and performed as expected. This nightly now covers only P/D, on the InferenceX AgentX recipe points. Kimi-K3 aggregated serving is still covered nightly by ATOM's own benchmark ( C72 OPUS gate margin. The gate compares
The low runs are not OPUS's alone. The same cell without OPUS, on the same image, gave 0.9522 and 0.9530 (40525157531, 40292434362), and also 0.9409 and 0.9416 (40184716007, 40351829339). Over these seven runs the mean is 0.9465, against a single-run stderr of about ±0.0062. So at 0.94, roughly one run in seven would fail with no regression behind it. I've kept the model's 0.94 for this cell rather than give it its own lower threshold. Your other questions:
I'll post the results here. |
valar-cop
left a comment
There was a problem hiding this comment.
some changes needed, the guards are not fail-loud yet..
any e2e run of the nine cells at this head? gsm8k flexible-extract number?
ci green.
valar-cop
left a comment
There was a problem hiding this comment.
a few small things..
e2e of the nine cells at this head incl C16? gsm8k at C1? pp8 C72 profile on this head?
ci green.
All nine are in the description's Validation table, C16 included (41266734501, 5,318.5 tok/s/GPU, −0.3% against the pre-split sweep). They ran on
Not at this head: since 08a84e6 this PR has followed #2709 onto #2365's head (6bb16af, which brings |
…ts best measured prefill Nine Kimi-K3 AgentX 1M P/D cells, each on the prefill measured fastest at its concurrency, with the ATOM settings each is measured with (requires_atom_env), the server log lines each must or must not show (expect_log, reject_log), and per-role online quant configs. Co-authored-by: Cursor <cursoragent@cursor.com>
f014a1b to
c194cac
Compare
#2786 dropped both settings until the unified entrypoint, so the Kimi-K3 cells no longer set them or require them. ATOM_KV_POLL_FRESH_WAIT_MS stays. Co-authored-by: Cursor <cursoragent@cursor.com>
#2786 no longer carries the fresh KV completion poll: on the AgentX 1M trace it left TTFT P50 and throughput flat. The Kimi-K3 P/D cells drop the setting and its requires_atom_env entry; the C1-C16 cells no longer require any setting, and the PP8 cells still require the MLA staging settings (and C88 the in-flight cap) their prefill sets. Co-authored-by: Cursor <cursoragent@cursor.com>
valarLip
left a comment
There was a problem hiding this comment.
⚠️ Action required before merge (4)
- Hold the merge until the stack and #2786 land. This PR targets
zwan/k3-pp-perf(#3070 → #3069 → #3068, all still open), and the C1 mono cell'sexpect_log/reject_loglines (Kimi-K3 mono decode armed/on/declined the 8-row build) exist only on #2786 (open, targetsmain). Onmaintoday the PP8 cells fail onrequires_atom_envand C1 fails onexpect_log, so the nightly would go red. Merge after all four. - Restore the launcher tests that the split dropped.
tests/test_atomesh_cell_checks.pyandtests/test_atomesh_torch_traces.pyare gone at this head. The PR now adds ~240 lines to.github/scripts/atomesh/pd_server_atom.sh(parse_log_lines,check_expected_logs/check_rejected_logs,check_required_atom_env, the name-basedwait_for_torch_traceswithpp<k>_rank_*, TP×PPHIP_VISIBLE_DEVICES) androle_online_quant_config/role_log_linestopd_submit.sh, but only stubs them out (tests/test_atomesh_v4_workflow.py:110-111,tests/test_atomesh_mooncake_store.py:379). Earlier review replies said tests covered the empty-list failure, the delayedreject_logline, C1's1 + num_speculative_tokenswidth and theenvs.pyprobe; none of those tests is in this diff. Bring them back, or split them into a follow-up PR that lands with this one, so the guards are tested. - Fix the CONC 32/88 comment.
.github/benchmark/models_atomesh.yaml:1012-1014says CONC 32 and 88 "each takes the settings of the recipe point below it, CONC 16 and 72, except max_num_seqs". But C32 runs the PP8 prefill (C16 runs TP8EP8×DCP8), and C88 addsATOM_PP_MAX_INFLIGHT=16, two offload workers andrun_eval: false. Scope the sentence to the decode settings and list the exceptions. - Fix the garbled comment. At
.github/scripts/atomesh/pd_server_atom.sh:242, "sets each role's from its …" is missing its object. Write "sets PREFILL_/DECODE_ONLINE_QUANT_CONFIG from each role's online_quant_extra_exclude_layer".
Re-reviewed at 4ecc15f. Already fixed: C1 mono now gated by #2786 plus expect_log/reject_log; gzip/async-thread and _flag_env items moved to #2786; three unread env vars dropped, merge order now enforced by requires_atom_env; online-quant JSON deduped via online_quant_extra_exclude_layer; old nightly cells retired; ReplaySSM note fixed; trace-dir glob limited to rank names; empty-list and reject-after-NFS-wait handled; C1 GSM8K enabled. CI: lint and unit tests green, Pre Checkin green; the one red "ATOM Test" run was cancelled and superseded.
The split dropped tests/test_atomesh_cell_checks.py and tests/test_atomesh_torch_traces.py while keeping the launcher code they cover: the expect_log/reject_log checks, the required ATOM env probe, the name-based torch-trace wait and the per-role online-quant and log exports. Both pass unchanged on this tree. Scope the CONC 32/88 note to the decode and list how their prefills differ, and give the online-quant comment its missing object. Co-authored-by: Cursor <cursoragent@cursor.com>
A role's online_quant_extra_exclude_layer reaches only its own --online_quant_config, and setting one without a shared config to extend fails the cell. Co-authored-by: Cursor <cursoragent@cursor.com>
|
@valarLip Thanks. Items 2 to 4 are in 49b967c and 0f385d4; item 1 stands as the merge plan.
|
The ATOMesh config job discovers tests/test_atomesh_*.py on a runner without torch, and the restored test_atomesh_cell_checks.py imported torch and the K3 mono dispatch at module scope, so the whole module failed to import. Import them optionally and skip only C1LogLinesAreK3MonoLogsTest, the one class that needs them; Pre Checkin still runs it. Co-authored-by: Cursor <cursoragent@cursor.com>
Motivation
Track Kimi-K3 AgentX 1M P/D performance in CI with one cell per InferenceX concurrency point (C1–C88), each on the prefill topology that measured best at that point, so regressions in the Kimi-K3 PP8 P/D stack (#2709, #3068, #3069, #3070) and in #2786 show up. The decode side follows InferenceX's AgentX recipe (kimik3-fp4-mi355x-atom-agentic-mtp, SemiAnalysisAI/InferenceX#4085 and #4307). They replace all of Kimi-K3's older nightly cells.
Changes
.github/benchmark/models_atomesh.yaml, plus thecase_nameshelp in.github/workflows/atomesh-benchmark.yaml.main's MoRIIO GSM8K cell ([ATOMesh][MoRIIO] Enable Kimi K3 and update the MoRI IO changes to support Kimi KDA state for KV. #2570) took its server args from the retired no-draft C32 cell's anchor. It now spells out the same three:gpu_memory_utilization: 0.90,max_num_seqs: 64andmax_num_batched_tokens: 8192.recipes/mesh/Agentic-Kimi-K3.mdnow names the PP8 cells as its CI cases. They run its decode and state cache behind a PP8 prefill. Its decode exportsAITER_MLA_USE_OPUS=1at C72 and C88, as the-opuscells do. Its online-quant exclude list now keeps the DSpark draft in bf16 ("context_proj","layers", the draft's unprefixed module names), as the cells andrecipes/Kimi-K3.mddo.display_topology. C72, C88 and the profile cell end in-opusand their label in-OPUS. C1's label ends in-MONO, matching its name's-mono.pd_matrix.py,pd_submit.shandpd_server_atom.sh:online_quant_extra_exclude_layer, one pattern or a list, set inserver.common_argsor on a role. It is appended to the model'sonline_quant_configexclude list on that role's command line. The cells no longer copy the JSON, and no role override depends on argparse last-wins.requires_atom_envlists the ATOM settings a cell is measured with. Before starting any server, the launcher loads theatom/utils/envs.pyof the ATOM under test and fails the cell if one of them is undefined. The PP8 cells requireATOM_PD_MLA_STAGING_CHUNK_PAGESandATOM_PD_MLA_STAGING_STREAM_PRIORITY, and C88ATOM_PP_MAX_INFLIGHT, all from perf(kimi-k3): PP8 P/D prefill 4/4 — MLA staging for a DCP consumer, more PP batches in flight #3070. The C1–C16 cells require none.expect_logis set per role, one line or a list. It names lines every server of that role must have logged while starting, and node 0 checks them once every server is healthy, before any request. The C1 decode expects two:Kimi-K3 mono decode armed: its config admits mono. A decode whose config mono refuses serves the plain model.Kimi-K3 mono decode on: a decode step reached mono and its runner was built. While starting, the only such step is the warmup forward before a FULL CUDA graph capture, so the line shows mono was built, not that a served request used it. Under--enforce-eagernothing is captured, the line first comes with a request, and the cell fails.reject_logis set per role, one line or a list. No server of that role may log any of them. Node 0 checks before the first request and again after the last. A line's absence cannot be retried the wayexpect_logretries a line's presence, so the second check first waits out the same NFS window, 60 s by default. The C1 decode rejectsKimi-K3 mono decode offandKimi-K3 mono decode declined the 8-row build. Mono logs these when it was armed but then cannot serve C1's steps: the first if its runner fails to build, the second if the width C1 serves, one request plus seven drafts, gets no build. Its capture also builds 16 rows, which C1 never serves, so that width's line is allowed, as isdeclined a stepfor a step mono does not serve at all, such as a prefill.expect_logorreject_logfails it instead of being skipped.pd_submit.shhands both keys to the launcher as JSON lists, and a key left unset or null checks nothing. Any other value there fails the cell, since a bare string would be checked char by char and an empty list or entry would check nothing.pd_submit.shitself fails a cell that sets an empty list.pd_server_atom.sh). It exposed only TP, so the PP8 prefill had to list its eight GPUs in the cell. PP is parsed from the role's server args, as the packed layout already did. A cell that setsHIP_VISIBLE_DEVICESkeeps its value.wait_for_torch_traces(pd_server_atom.sh) counted onlyrank_*/dirs, but a PP stage writespp<k>_rank_<tp>/. Every PP profile run therefore waited outATOM_PROFILER_TIMEOUT("1/9 rank traces still missing after 1800s") and never finished. It now waits on the trace dirsstop_profilereported, plus their siblings that ModelRunner named for a rank:rank_<tp>ordp<d>_tp<tp>, prefixedpp<k>_under PP. Any other dir is ignored. A rank is done once its dir holds a.gzwhose name was not there when the window opened, and no raw.json. It goes by names because on the shared log mount, mtimes come from clocks that disagree by more than a window lasts: a run compared them with a marker and waited out the timeout on five traces already written (41266652593)..github/,tests/and the recipe. The level-3 trace gzip that shortens a PP export is in perf(kimi-k3): serve mono decode behind a Mooncake P/D decode; gzip torch traces at level 3 (from Kimi-K3 AgentX 1M) #2786 (item 7).Why each setting
Every setting below was A/B'd on the same trace.
ATOM_STATE_CHECKPOINT_DEMAND, a 128 GiB state cap in a 224 GiB per-rank pool, as in InferenceX#4307): C72 +9.9%, C88 +14.1%. Only the prefill has a CPU tier, 128 GiB per rank, at C16 and C32.AITER_MLA_USE_OPUS=1on the decode; this PR adds it to the recipe too).-opusnames the kernel requested. The A/B above is what shows it was taken.exact_match,flexible-extract, the score the 0.94 gate reads, at C72 over three OPUS runs was 0.9553, 0.9409 and 0.9416 (this PR). The same cell without OPUS, on the same image, gave 0.9522, 0.9530, 0.9409 and 0.9416. A single run's stderr is about ±0.0062, so these runs neither show a drop nor rule out one of about 0.7 points.ATOM_PP_MAX_INFLIGHT=16: ~+15% vs 8.ATOM_PD_MLA_STAGING_CHUNK_PAGES: "128", the old default that the runs here used. Priority −1: TTFT P90 13.26 s vs 15.13 s at priority 0.context_proj, which stay bf16 like its checkpoint, which has no FP8 QAT.in_proj,f_b_proj,o_proj, and the shared experts'gate_up_projanddown_proj. Mono does not start with these layers in FP8.f_b_projin bf16. At TP1 that GEMM is unsharded (N 12288, K 128); aiter has no tuned FP8 config for it, and its untuned FP8 GEMM needs K above 192. In FP8 the prefill crashed on its first full chunk (40679836806).ATOM_KV_POLL_FRESH_WAIT_MSbecause on C88 it left TTFT P50 (4.62 → 4.60 s) and throughput (18,052 → 18,073 tok/s/GPU) flat, and droppedATOM_PD_PROMPT_IDS_B64andATOM_PD_EARLY_T0until the unified entrypoint.ATOM_MONO_ENABLE=0on the PP8 cells, as on the recipe's non-mono points.Dependencies and merge order
This PR is the top of the Kimi-K3 PP8 P/D stack. It targets #3070, so the diff shown is its own:
The PP8 cells need all four, and the C1 mono cell needs #2786, which targets
mainon its own. Merge this PR last. On an ATOM without #3070's settings, the PP8 cells fail at launch onrequires_atom_envinstead of publishing numbers without them. If this PR lands before #2786, the C1 cell fails onexpect_log, since its decode does not arm mono. It also fails onexpect_logif its decode arms mono but never turns it on, and onreject_logif mono then turns itself off.Validation
The table in Changes is from a sweep of the pre-split branch on
rocm/atom-dev:nightly_202610241500; its C72 and C88 rows are the OPUS A/B runs on that image (40546704877, 40617525682).All nine cells and the profile cell ran on #2709 + #2786 + this PR (
zwan/k3-agentic-verify) inrocm/atom-dev:nightly_202610301458, the imagemain's nightly resolves to. The verify branch carried #2709 at bd26837 and #2786 at a5f0fc4, and adds only GSM8K on C88. With this PR, C2, C4, C56 and the profile cell ran at 08a84e6, C1, C16, C32, C48 and C72 at 048c838, and C88 at 2840ea1. Between those this PR changed only the profile wait, C1's lastreject_logcheck, how the launcher findsenvs.py, andpd_submit.sh's check for empty lists, andatom/was the same in all three. Since 08a84e6 this PR has merged #2709 seven times. Three follow #2365's head: 6bb16af, which bringsmain99ebf63 and with it #2871; 9cc4609, with #2365's review commits up to 3fc180e; and 8379b0e, which bringsmain825b63b. The fourth, 5c76693, brings #2709 at 9e9f07e: #2365's later heads up to b62bf7a, withmaina8946ff, and #2709's own review fixes. The fifth, 12c280e, brings #2709 at d718458, which follows #2365 ontomainab4ada4 and with it Kimi-K3.1 (#3003). The sixth, 2e7c236, brings #2709 at b82e2d0, which follows #2365 ontomain058c219 and with it Chat token logprobs (#2856). The seventh, d661fb2, brings #2709 at 0ab7e65, which mergesmain64412f1, where #2365 has landed, and with it #2913. This PR's own commits since 08a84e6, 642c78d and 22a7112, change only comments, the recipe's text and the C1 mono log test; b1140ca and 7c75287 cancel out. The cells have not been re-run on that stack. After #2709 was split, this PR's diff was rebuilt as one commit on #3070; the ATOM code under it is #2709's previous head, 4034713, merged withmain0fe9932, plus the stack's review fixes since. tok/s/GPU is computed as InferenceX does, over a 3600 s window, against the pre-split sweep:GSM8K is
exact_match,flexible-extract, the score the 0.94 gate reads. C88's comes from the verify branch only.The cells launch the same servers as the pre-split runs.
pd_matrix.pyandpd_submit.sh. The nine cells are identical, except in the PP8 prefills. Those no longer setHIP_VISIBLE_DEVICES, since the launcher derives the same0,…,7from TP1 × PP8. They also setATOM_PD_MLA_STAGING_CHUNK_PAGESto 128, the value they used to get by default. C1 setsATOM_MONO_ENABLE=1on its decode only, so its prefill and router now get the common0. That prefill never armed mono: its TP8/EP8 servers loggedKimi-K3 mono decode off: expert parallel.--online_quant_configholds the same set of exclusions: 14 on the C1 prefill and 19 on its decode, 15 on the PP8 prefills and 14 on their decodes. The GSM8K runs of C1, C72 and C88 above used them.expect_loglines in the decode's log before the first request, in the benchmark and in the eval. It found neitherreject_logline, either before the first request or after the 60 s wait that follows the last.requires_atom_env, run against each ATOM'senvs.py, fails the PP8 cells onmain's and on perf(kimi-k3): serve mono decode behind a Mooncake P/D decode; gzip torch traces at level 3 (from Kimi-K3 AgentX 1M) #2786's, naming the staging settings, and in C88 the in-flight cap as well. C1 to C16 require nothing. On this stack's it passes every cell.ATOM_PD_PROMPT_IDS_B64on its prefill,ATOM_PD_EARLY_T0on its decode, and both fromrequires_atom_env. On bec310d, this PR's last commit of its own, it differs from a9c19ef's only by the fresh poll: each of the nine cells and the profile cell losesATOM_KV_POLL_FRESH_WAIT_MSfrom its env and fromrequires_atom_env.tests/test_atomesh_*.pygive 240 passed. The head restorestests/test_atomesh_cell_checks.pyandtests/test_atomesh_torch_traces.py, which the split had dropped, and adds a test of the per-role--online_quant_config. They cover the empty-list failure, areject_logline that reaches the log while the launcher waits, C1's1 + num_speculative_tokenswidth, theenvs.pyprobe and the name-based trace wait. The ATOMesh config job runs these tests on a runner without torch, so the one test that needs torch, C1's mono log lines, is skipped there and runs in Pre Checkin.main's ci: remove Atomesh TW weekly schedule #3071 and Add defense-in-depth guards for self-hosted runner jobs #3153 reach two of this PR's files,atomesh-benchmark.yamlandtest_atomesh_v4_workflow.py, in lines this PR does not change. Pre Checkin on 9ab67e3 (perf(kimi-k3): PP8 P/D prefill 4/4 — MLA staging for a DCP consumer, more PP batches in flight #3070's head 01ac6d6 merged in): 13,243 passed, 1,299 skipped, 3 xfailed (43225368625).Torch profile with this PR at 08a84e6 (41276944873, the PP8 C72 profile cell, g08 prefill, g20 decode). The head's profile window is the same.
stop_profilereturned at 06:18:38Z, 38 s afterstart_profile. Node 0 logged "all 16 rank traces on disk" at 06:18:43 and stopped aiperf.torch_traces/prefill-rank-0/pp0_rank_0…pp7_rank_0, 23.9–26.0 MB each. The decode wrote one into each oftorch_traces/decode-rank-1/rank_0…rank_7, 54.7–54.9 MB each. No raw.jsonwas left.