Skip to content

Commit 6805de0

Browse files
committed
fix(agentic): require GB200 validated checkpoints
Signed-off-by: Cam Quilici <cjquilici@gmail.com>
1 parent c53253c commit 6805de0

3 files changed

Lines changed: 89 additions & 15 deletions

File tree

‎.github/workflows/benchmark-multinode-tmpl.yml‎

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,48 @@ jobs:
247247
fi
248248
# Existence is not enough: process_agentic_result.py writes the
249249
# aggregate even when aiperf recorded zero valid requests. Require
250-
# successful requests in every concurrency result.
250+
# successful requests and the success marker staged only after
251+
# replay/result validation in every concurrency result.
251252
for result_file in "${agentic_results[@]}"; do
252253
echo "Found agentic result file: $result_file"
253-
ok=$(python3 -c "import json,sys; d=json.load(open(sys.argv[1])); print(int(bool(d.get('num_requests_successful'))))" "$result_file" 2>/dev/null || echo 0)
254+
conc=$(sed -n 's/.*_conc\([0-9][0-9]*\)\.json$/\1/p' <<< "$result_file")
255+
marker_file="agentic_checkpoints/${RESULT_FILENAME}_conc${conc}.success.json"
256+
checkpoint_file="agentic_checkpoints/${RESULT_FILENAME}_conc${conc}.json"
257+
if [ -z "$conc" ] || [ ! -f "$marker_file" ] || [ ! -f "$checkpoint_file" ]; then
258+
echo "Run failed: $result_file is missing validated AgentX checkpoint marker $marker_file." >&2
259+
exit 1
260+
fi
261+
ok=$(python3 - "$result_file" "$checkpoint_file" "$marker_file" "$RESULT_FILENAME" "$conc" <<'PY' 2>/dev/null || echo 0
262+
import json
263+
import sys
264+
265+
result_file, checkpoint_file, marker_file, base_result_filename, concurrency_raw = sys.argv[1:]
266+
concurrency = int(concurrency_raw)
267+
with open(result_file) as handle:
268+
result = json.load(handle)
269+
with open(checkpoint_file) as handle:
270+
checkpoint = json.load(handle)
271+
with open(marker_file) as handle:
272+
marker = json.load(handle)
273+
expected_marker = {
274+
"schema_version": 1,
275+
"base_result_filename": base_result_filename,
276+
"result_filename": f"{base_result_filename}_conc{concurrency}.json",
277+
"concurrency": concurrency,
278+
}
279+
print(
280+
int(
281+
marker == expected_marker
282+
and int(result.get("conc", -1)) == concurrency
283+
and int(checkpoint.get("conc", -1)) == concurrency
284+
and int(result.get("num_requests_successful", 0)) > 0
285+
and int(checkpoint.get("num_requests_successful", 0)) > 0
286+
)
287+
)
288+
PY
289+
)
254290
if [ "$ok" != "1" ]; then
255-
echo "Run failed: $result_file has zero successful requests." >&2
291+
echo "Run failed: $result_file does not match a validated AgentX checkpoint." >&2
256292
exit 1
257293
fi
258294
done

‎experimental/dsv4_agentx_gb200_autoresearch/experiment-ledger.jsonl‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
{"timestamp":"2026-06-26T15:29:00Z","kind":"runtime_sync","inferencex_sha":"ba2049d8308a3c605c8303628d68e7e963198aae","aiperf_sha":"24be4b4b0eff13c0a17692ef2eed1e938c94a6e8","included_commit":"999adab351f127837b9e17659ba5c6d9fd791156","rationale":"Canonical combined AIPerf cancellation-drain and pending-flush fixes plus exact benchmark exit-code propagation."}
44
{"timestamp":"2026-07-01T06:03:58Z","kind":"search_space_update","inferencex_base_sha":"3d636030a11ea02d71d2e9a49fd039a5229e9169","aiperf_sha":"0595c16aa7e7a7d853d01a932dcd06ced3d8b94d","removed_configs":["dsv4-fp4-gb200-dynamo-vllm-agentic-3p2d-tep8-tp8-autoresearch"],"added_configs":["dsv4-fp4-gb200-dynamo-vllm-agentic-1p1d-dep8-tp8-lowlat-autoresearch","dsv4-fp4-gb200-dynamo-vllm-agentic-1p2d-dep8-tp8-lowlat-autoresearch","dsv4-fp4-gb200-dynamo-vllm-agentic-2p1d-dep8-dep8-bt16k-autoresearch"],"rationale":"User requested removing worthless TEP configs, adding low-concurrency DEP8 prefill plus TP8 decode low-latency candidates, and testing larger 16k prefill batches to push high-throughput frontier without the observed c192-to-c224 TTFT cliff.","local_validation":"generate_sweep_configs full-sweep produced 12 agentic GB200 configs, all duration=3600, no max-model-len, no TEP/3p2d strings, no duplicate exp-name values."}
55
{"timestamp":"2026-07-01T08:36:00Z","kind":"failure_diagnosis","workflow_run_id":28500373166,"workflow_attempt":1,"github_job_id":84476045718,"slurm_job_id":20417,"config":"dsv4_p2x8_d1x8_conc176x192","point":"conc176","inferencex_sha":"9a6feea4273b3d5dbaca65f49d44c03f9bc2039d","aiperf_sha":"0595c16aa7e7a7d853d01a932dcd06ced3d8b94d","observed":"AIPerf aborted during accelerated warmup before profiling with replay_rc=1, Benchmark aborted: warmup_failure, no valid profile export, and mass ServerDisconnectedError after profile cancel.","root_cause":"Server-side prefill EngineCore died; frontend reported EngineDeadError and prefill logs showed crash in fused_moe_trtllm_sm100 under the experimental 16384 max-num-batched-tokens recipe.","decision":"Cap the experimental high-throughput recipe back to 8192 max-num-batched-tokens while preserving the materialized CONFIG_FILE path so the failed matrix job can be rerun on the same workflow."}
6+
{"timestamp":"2026-07-01T15:56:00Z","kind":"false_green_diagnosis","workflow_run_id":28500373166,"workflow_attempt":1,"github_job_id":84476045810,"slurm_job_id":20423,"config":"dsv4_p2x8_d1x8_conc144x160","point":"conc160","inferencex_sha":"c53253c5434fdb70f05f61a4fd2fb1ac32e8ec1f","aiperf_sha":"0595c16aa7e7a7d853d01a932dcd06ced3d8b94d","observed":"GHA job concluded success even though conc160 AIPerf emitted ProfileAborted(failed_request_threshold), profiling lasted only 25.35s, profile_export_aiperf.json was absent, and checkpoint artifact contained only the conc144 success marker. The bmk artifact nevertheless uploaded a partial conc160 aggregate.","root_cause":"GB200 host launcher treated presence of per-concurrency JSON files with num_requests_successful>0 as sufficient, cancelled server workers, and never required the AgentX success markers that are written only after AIPerf replay/result validation succeeds.","decision":"Require validated per-concurrency AgentX checkpoint JSON plus .success.json marker before early Slurm cancellation and before GB200 launcher success; mirror the same marker check in benchmark-multinode-tmpl for future runs."}

‎runners/launch_gb200-nv.sh‎

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -513,19 +513,49 @@ agentic_results_ready() {
513513
return 1
514514
fi
515515

516-
local expected_count
517-
expected_count=$(wc -w <<<"$CONC_LIST" | tr -d ' ')
518-
shopt -s nullglob
519-
local agentic_results=("${RESULT_FILENAME}"_conc*.json)
520-
shopt -u nullglob
521-
if [[ "${#agentic_results[@]}" -ne "$expected_count" ]]; then
522-
return 1
523-
fi
524-
516+
local checkpoint_dir="${AGENTIC_CHECKPOINT_DIR:-${GITHUB_WORKSPACE:-$PWD}/agentic_checkpoints}"
517+
local concurrency
525518
local result_file
526-
local ok
527-
for result_file in "${agentic_results[@]}"; do
528-
ok=$(python3 -c "import json,sys; d=json.load(open(sys.argv[1])); print(int(bool(d.get('num_requests_successful'))))" "$result_file" 2>/dev/null || echo 0)
519+
local checkpoint_result
520+
local marker_file
521+
522+
for concurrency in $CONC_LIST; do
523+
result_file="${RESULT_FILENAME}_conc${concurrency}.json"
524+
checkpoint_result="${checkpoint_dir}/${RESULT_FILENAME}_conc${concurrency}.json"
525+
marker_file="${checkpoint_dir}/${RESULT_FILENAME}_conc${concurrency}.success.json"
526+
if [[ ! -f "$result_file" || ! -f "$checkpoint_result" || ! -f "$marker_file" ]]; then
527+
return 1
528+
fi
529+
local ok
530+
ok=$(python3 - "$result_file" "$checkpoint_result" "$marker_file" "$RESULT_FILENAME" "$concurrency" <<'PY' 2>/dev/null || echo 0
531+
import json
532+
import sys
533+
534+
result_file, checkpoint_result, marker_file, base_result_filename, concurrency_raw = sys.argv[1:]
535+
concurrency = int(concurrency_raw)
536+
with open(result_file) as handle:
537+
result = json.load(handle)
538+
with open(checkpoint_result) as handle:
539+
checkpoint = json.load(handle)
540+
with open(marker_file) as handle:
541+
marker = json.load(handle)
542+
expected_marker = {
543+
"schema_version": 1,
544+
"base_result_filename": base_result_filename,
545+
"result_filename": f"{base_result_filename}_conc{concurrency}.json",
546+
"concurrency": concurrency,
547+
}
548+
print(
549+
int(
550+
marker == expected_marker
551+
and int(result.get("conc", -1)) == concurrency
552+
and int(checkpoint.get("conc", -1)) == concurrency
553+
and int(result.get("num_requests_successful", 0)) > 0
554+
and int(checkpoint.get("num_requests_successful", 0)) > 0
555+
)
556+
)
557+
PY
558+
)
529559
if [[ "$ok" != "1" ]]; then
530560
return 1
531561
fi
@@ -593,6 +623,13 @@ wait $POLL_PID
593623

594624
set -x
595625

626+
if [[ "${BENCHMARK_TYPE:-}" == "agentic-coding" ]]; then
627+
if ! agentic_results_ready; then
628+
echo "ERROR: AgentX run finished without validated success markers for every concurrency in CONC_LIST=$CONC_LIST" >&2
629+
exit 1
630+
fi
631+
fi
632+
596633
echo "Job $JOB_ID completed!"
597634
echo "Collecting results..."
598635

0 commit comments

Comments
 (0)