Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
6d64c0a
HiCache sizing fixes (ratio vs size), NCCL/image updates, disable pre…
ichbinblau Jul 23, 2026
cef101d
Update DPA config, add RDMA/GPU pre-flight gates to job.slurm, and fi…
ichbinblau Jul 23, 2026
c7a5d9d
Add perf-changelog.yaml entry for dsv4-fp4-mi355x-sglang-disagg-agent…
ichbinblau Jul 23, 2026
58570ff
remove disable_cuda_graph: false setting from decode
ichbinblau Jul 23, 2026
7bf9be0
add env PREFILL_DP_ATTN and DECODE_DP_ATTN
ichbinblau Jul 23, 2026
48e703c
fix(dsv4): forward PREFILL_EP/DECODE_EP/*_DP_ATTN into agentic server…
ichbinblau Jul 27, 2026
5752932
feat(agentic): add multi-node agentic (SWE-bench) eval dispatch support
ichbinblau Jul 27, 2026
b1fd7ea
Mark dsv4-fp4-mi355x-sglang-disagg-agentic-hicache changelog entry ev…
ichbinblau Jul 27, 2026
79ee7b6
Fix multinode agentic eval-only CI: forward Modal creds and stage eva…
ichbinblau Jul 28, 2026
546b342
Harden multinode agentic Modal credential setup.
ichbinblau Jul 28, 2026
0251f65
Switch multinode agentic eval to GSM8K lm-eval with correct metadata.
ichbinblau Jul 28, 2026
2d51b6a
Harden multinode agentic eval metadata and GPU pre-flight for DEP8 CI.
ichbinblau Jul 28, 2026
6253ce9
Add EP1 GSM8K eval changelog entry alongside DEP8 c128 eval.
ichbinblau Jul 28, 2026
2393662
Revert "Add EP1 GSM8K eval changelog entry alongside DEP8 c128 eval."
ichbinblau Jul 28, 2026
b131cb9
include node mia1-p01-g10 and mia1-p01-g16
ichbinblau Jul 28, 2026
3e7bb76
exclude mia1-p01-g10
ichbinblau Jul 28, 2026
4aa0713
add con=1 in config
ichbinblau Jul 28, 2026
2b395cb
remove con=64
ichbinblau Jul 29, 2026
3b30737
remove SGLANG_AITER_MLA_PERSIST
ichbinblau Jul 29, 2026
2ad6af3
fix(dsv4): use native EAGLE MTP flags without draft-model-path for Ag…
ichbinblau Jul 21, 2026
3e2992b
add dsv4 disagg mtp config.
ichbinblau Jul 23, 2026
51909c4
Add perf-changelog.yaml entry for dsv4-fp4-mi355x-sglang-disagg-agent…
ichbinblau Jul 23, 2026
47f7150
extend gpu sanity check wait timeout
ichbinblau Jul 24, 2026
e2c1e38
fix(dsv4): simulate MTP acceptance at the golden AL for agentic runs
ichbinblau Jul 26, 2026
3f47b7d
fix(dsv4): wire golden AL for MTP draft lengths 1 and 2
ichbinblau Jul 27, 2026
30f7595
fix(dsv4): disable synthetic MTP during eval runs
ichbinblau Jul 29, 2026
abcddb0
Merge branch 'main' into amd/agentx-v1.0-th-hicon-mtp
ichbinblau Jul 29, 2026
4ec1774
remove dsv4-fp4-mi355x-sglang-disagg-agentic-hicache from perf-changelog
ichbinblau Jul 29, 2026
7d23a57
fix(amd): exclude mia1-p01-g16 from default SLURM node list
ichbinblau Jul 29, 2026
909afbe
Merge branch 'main' into amd/agentx-v1.0-th-hicon-mtp
ichbinblau Jul 30, 2026
6255541
fix(amd): extend GPU drain poll and trim default node excludes
ichbinblau Jul 30, 2026
8787b7a
fix(agentic): use explicit Python 3.11 for isolated aiperf venv
ichbinblau Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .github/workflows/benchmark-multinode-tmpl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,16 @@ on:
type: string
required: false
default: ""
eval-limit:
description: "Eval instance count: empty/full = whole split (default); N = first-N smoke slice"
required: false
type: string
default: ""
swebench-gen-mode:
description: "SWE-bench generation mode (single-shot | agentic). Empty = agentic (single-shot is an explicit debugging escape hatch)."
required: false
type: string
default: ""
# Agentic-coding inputs. Fixed-seq-len jobs leave these empty.
scenario-type:
description: "Scenario type (fixed-seq-len or agentic-coding)"
Expand Down Expand Up @@ -213,6 +223,12 @@ env:
RUN_EVAL: ${{ inputs.run-eval }}
EVAL_ONLY: ${{ inputs.eval-only }}
EVAL_CONC: ${{ inputs.eval-conc }}
EVAL_LIMIT: ${{ inputs.eval-limit }}
SWEBENCH_GEN_MODE: ${{ inputs.swebench-gen-mode }}
# GPU/multi-node runners lack Docker for SWE-bench scoring.
SWEBENCH_USE_MODAL: 'true'
MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }}
MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
# Agentic-coding env. Fixed-seq-len jobs leave these empty.
SCENARIO_TYPE: ${{ inputs.scenario-type }}
SCENARIO_SUBDIR: ${{ inputs.scenario-type == 'agentic-coding' && 'agentic/' || 'fixed_seq_len/' }}
Expand Down Expand Up @@ -422,6 +438,10 @@ jobs:
meta_env.json
results*.json
sample*.jsonl
agent_preds.json
predictions.jsonl
swebench_report_*.json
*.traj*
if-no-files-found: ${{ inputs.eval-only && 'error' || 'ignore' }}

- name: Verify eval scores
Expand All @@ -439,6 +459,7 @@ jobs:
rm -f meta_env.json || true
rm -f results*.json || true
rm -f sample*.jsonl || true
rm -f agent_preds.json predictions.jsonl swebench_report_*.json *.traj* || true

- name: Slurm cleanup (post-run)
if: always()
Expand Down
70 changes: 66 additions & 4 deletions .github/workflows/e2e-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
agentic-config: ${{ steps.get-jobs.outputs.agentic-config }}
agentic-eval-config: ${{ steps.get-jobs.outputs.agentic-eval-config }}
multi-node-agentic-config: ${{ steps.get-jobs.outputs.multi-node-agentic-config }}
multi-node-agentic-eval-config: ${{ steps.get-jobs.outputs.multi-node-agentic-eval-config }}
steps:
- name: Checkout code (ref)
if: ${{ inputs.ref && inputs.ref != '' }}
Expand Down Expand Up @@ -124,14 +125,16 @@
}
AGENTIC=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' not in x and not x.get('run-eval', False)]))" | score_matrix agentic)
AGENTIC_EVAL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' not in x and x.get('run-eval', False)]))" | score_matrix agentic-eval)
MULTI_AGENTIC=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' in x]))" | score_matrix multi-agentic)
MULTI_AGENTIC=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' in x and not x.get('run-eval', False)]))" | score_matrix multi-agentic)
MULTI_AGENTIC_EVAL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if x.get('scenario-type') == 'agentic-coding' and 'prefill' in x and x.get('run-eval', False)]))" | score_matrix multi-agentic-eval)
SINGLE=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' not in x and x.get('scenario-type') != 'agentic-coding' and not x.get('eval-only', False)]))" | score_matrix single)
MULTI=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' in x and x.get('scenario-type') != 'agentic-coding' and not x.get('eval-only', False)]))" | score_matrix multi)
EVALS=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' not in x and x.get('scenario-type') != 'agentic-coding' and x.get('run-eval', False)]))" | score_matrix eval)
MULTI_EVAL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' in x and x.get('run-eval', False)]))" | score_matrix multi-eval)
MULTI_EVAL=$(echo "$CONFIG_JSON" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps([x for x in d if 'prefill' in x and x.get('scenario-type') != 'agentic-coding' and x.get('run-eval', False)]))" | score_matrix multi-eval)
echo "agentic-config=$AGENTIC" >> $GITHUB_OUTPUT
echo "agentic-eval-config=$AGENTIC_EVAL" >> $GITHUB_OUTPUT
echo "multi-node-agentic-config=$MULTI_AGENTIC" >> $GITHUB_OUTPUT
echo "multi-node-agentic-eval-config=$MULTI_AGENTIC_EVAL" >> $GITHUB_OUTPUT
echo "single-node-config=$SINGLE" >> $GITHUB_OUTPUT
echo "multi-node-config=$MULTI" >> $GITHUB_OUTPUT
echo "eval-config=$EVALS" >> $GITHUB_OUTPUT
Expand Down Expand Up @@ -382,7 +385,66 @@
scenario-type: agentic-coding
ref: ${{ inputs.ref }}

test-sweep-multi-node-agentic-evals:
needs: get-jobs
if: ${{ needs.get-jobs.outputs.multi-node-agentic-eval-config != '[]' }}
uses: ./.github/workflows/benchmark-multinode-tmpl.yml
name: multi-node agentic eval /
strategy:
fail-fast: false
matrix:
config: ${{ fromJson(needs.get-jobs.outputs.multi-node-agentic-eval-config) }}
secrets: inherit
with:
exp-name: ${{ matrix.config.exp-name }}
isl: '0'
osl: '0'
max-model-len: '0'
runner: ${{ matrix.config.runner }}
priority: ${{ matrix.config.priority }}
queue-token: ${{ matrix.config['queue-token'] }}
image: ${{ matrix.config.image }}
model: ${{ matrix.config.model }}
model-prefix: ${{ matrix.config.model-prefix }}
framework: ${{ matrix.config.framework }}
precision: ${{ matrix.config.precision }}
router: ${{ matrix.config.router && toJson(matrix.config.router) || '' }}
kv-p2p-transfer: ${{ matrix.config['kv-p2p-transfer'] || '' }}
conc-list: ${{ toJson(matrix.config.conc) }}
spec-decoding: ${{ matrix.config.spec-decoding }}
disagg: ${{ matrix.config.disagg }}
prefill-hardware: ${{ matrix.config.prefill.hardware }}
decode-hardware: ${{ matrix.config.decode.hardware }}
prefill-num-worker: ${{ matrix.config.prefill.num-worker }}
prefill-tp: ${{ matrix.config.prefill.tp }}
prefill-pp: ${{ matrix.config.prefill.pp }}
prefill-dcp-size: ${{ matrix.config.prefill.dcp-size }}
prefill-pcp-size: ${{ matrix.config.prefill.pcp-size }}
prefill-ep: ${{ matrix.config.prefill.ep }}
prefill-dp-attn: ${{ matrix.config.prefill.dp-attn }}
prefill-additional-settings: ${{ toJson(matrix.config.prefill.additional-settings) }}
decode-num-worker: ${{ matrix.config.decode.num-worker }}
decode-tp: ${{ matrix.config.decode.tp }}
decode-pp: ${{ matrix.config.decode.pp }}
decode-dcp-size: ${{ matrix.config.decode.dcp-size }}
decode-pcp-size: ${{ matrix.config.decode.pcp-size }}
decode-ep: ${{ matrix.config.decode.ep }}
decode-dp-attn: ${{ matrix.config.decode.dp-attn }}
decode-additional-settings: ${{ toJson(matrix.config.decode.additional-settings) }}
conc: ${{ matrix.config['eval-conc'] }}
kv-offloading: ${{ matrix.config.kv-offloading }}
kv-offload-backend: ${{ matrix.config['kv-offload-backend'].name }}
kv-offload-backend-metadata: ${{ matrix.config['kv-offload-backend'] && toJson(matrix.config['kv-offload-backend']) || '' }}
duration: ${{ inputs.duration-override != '' && inputs.duration-override || matrix.config.duration }}
run-eval: true
eval-only: true
eval-conc: ${{ matrix.config['eval-conc'] }}
eval-limit: ${{ inputs.eval-limit }}
swebench-gen-mode: ${{ inputs.swebench-gen-mode }}
scenario-type: agentic-coding
ref: ${{ inputs.ref }}

test-sweep-single-node:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
needs: get-jobs
if: ${{ needs.get-jobs.outputs.single-node-config != '[]' }}
uses: ./.github/workflows/benchmark-tmpl.yml
Expand Down Expand Up @@ -467,12 +529,12 @@
result-prefix: "bmk"

collect-evals:
needs: [test-sweep-evals, test-sweep-multi-node-evals, test-sweep-agentic-evals]
if: ${{ always() && (needs.test-sweep-evals.result != 'skipped' || needs.test-sweep-multi-node-evals.result != 'skipped' || needs.test-sweep-agentic-evals.result != 'skipped') }}
needs: [test-sweep-evals, test-sweep-multi-node-evals, test-sweep-agentic-evals, test-sweep-multi-node-agentic-evals]
if: ${{ always() && (needs.test-sweep-evals.result != 'skipped' || needs.test-sweep-multi-node-evals.result != 'skipped' || needs.test-sweep-agentic-evals.result != 'skipped' || needs.test-sweep-multi-node-agentic-evals.result != 'skipped') }}
uses: ./.github/workflows/collect-evals.yml
secrets: inherit

calc-success-rate:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
needs: [collect-results, collect-evals]
if: ${{ always() }}
runs-on: ubuntu-latest
Expand Down
76 changes: 74 additions & 2 deletions .github/workflows/run-sweep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,79 @@
eval-only: true
eval-conc: ${{ matrix.config['eval-all-concs'] && join(matrix.config.conc, ' ') || matrix.config['eval-conc'] }}

# Multi-node agentic (SWE-bench) eval rows carry the agentic input shape,
# so they are dispatched with sweep-multi-node-agentic's inputs rather
# than sweep-multi-node-evals' fixed-seq-len inputs (isl/osl/max-model-len,
# which agentic rows don't have). SWE-bench doesn't support batched
# concurrencies (unlike lm-eval), so eval-conc is always a single value,
# never the joined-list form sweep-multi-node-evals uses.
sweep-multi-node-agentic-evals:
needs: [setup, canary-select, canary-sweep]
if: >-
${{
!cancelled() &&
needs.setup.result == 'success' &&
needs.setup.outputs.reuse-enabled != 'true' &&
(needs.canary-sweep.result == 'success' || needs.canary-sweep.result == 'skipped') &&
toJson(fromJson(needs.setup.outputs.search-space-config).multinode_agentic_evals) != '[]' &&
toJson(fromJson(needs.setup.outputs.search-space-config).multinode_agentic_evals) != 'null'
}}
uses: ./.github/workflows/benchmark-multinode-tmpl.yml
name: multi-node agentic eval /
strategy:
fail-fast: ${{ contains(github.event.pull_request.labels.*.name, 'full-sweep-fail-fast') || contains(github.event.pull_request.labels.*.name, 'full-sweep-fail-fast-no-canary') }}
matrix:
config: ${{ fromJson(needs.setup.outputs.search-space-config).multinode_agentic_evals }}
secrets: inherit
with:
exp-name: ${{ matrix.config.exp-name }}
isl: '0'
osl: '0'
max-model-len: '0'
runner: ${{ matrix.config.runner }}
priority: ${{ matrix.config.priority }}
queue-token: ${{ matrix.config['queue-token'] }}
skip-queue-pr: ${{ matrix.config['skip-queue-pr'] || '' }}
image: ${{ matrix.config.image }}
model: ${{ matrix.config.model }}
model-prefix: ${{ matrix.config.model-prefix }}
framework: ${{ matrix.config.framework }}
precision: ${{ matrix.config.precision }}
router: ${{ matrix.config.router && toJson(matrix.config.router) || '' }}
kv-p2p-transfer: ${{ matrix.config['kv-p2p-transfer'] || '' }}
conc-list: ${{ toJson(matrix.config.conc) }}
spec-decoding: ${{ matrix.config.spec-decoding }}
disagg: ${{ matrix.config.disagg }}
prefill-hardware: ${{ matrix.config.prefill.hardware }}
decode-hardware: ${{ matrix.config.decode.hardware }}
prefill-num-worker: ${{ matrix.config.prefill.num-worker }}
prefill-tp: ${{ matrix.config.prefill.tp }}
prefill-pp: ${{ matrix.config.prefill.pp }}
prefill-dcp-size: ${{ matrix.config.prefill.dcp-size }}
prefill-pcp-size: ${{ matrix.config.prefill.pcp-size }}
prefill-ep: ${{ matrix.config.prefill.ep }}
prefill-dp-attn: ${{ matrix.config.prefill.dp-attn }}
prefill-additional-settings: ${{ toJson(matrix.config.prefill.additional-settings) }}
decode-num-worker: ${{ matrix.config.decode.num-worker }}
decode-tp: ${{ matrix.config.decode.tp }}
decode-pp: ${{ matrix.config.decode.pp }}
decode-dcp-size: ${{ matrix.config.decode.dcp-size }}
decode-pcp-size: ${{ matrix.config.decode.pcp-size }}
decode-ep: ${{ matrix.config.decode.ep }}
decode-dp-attn: ${{ matrix.config.decode.dp-attn }}
decode-additional-settings: ${{ toJson(matrix.config.decode.additional-settings) }}
conc: ${{ matrix.config['eval-conc'] }}
kv-offloading: ${{ matrix.config.kv-offloading }}
kv-offload-backend: ${{ matrix.config['kv-offload-backend'].name }}
kv-offload-backend-metadata: ${{ matrix.config['kv-offload-backend'] && toJson(matrix.config['kv-offload-backend']) || '' }}
total-cpu-dram-gb: ${{ matrix.config['total-cpu-dram-gb'] }}
duration: ${{ matrix.config.duration }}
run-eval: true
eval-only: true
eval-conc: ${{ matrix.config['eval-conc'] }}
scenario-type: agentic-coding

collect-results:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
needs:
[
canary-sweep,
Expand Down Expand Up @@ -882,12 +954,12 @@
result-prefix: "bmk"

collect-evals:
needs: [sweep-evals, sweep-agentic-evals, sweep-multi-node-evals, setup]
if: ${{ always() && needs.setup.result != 'skipped' && (needs.sweep-evals.result != 'skipped' || needs.sweep-agentic-evals.result != 'skipped' || needs.sweep-multi-node-evals.result != 'skipped') }}
needs: [sweep-evals, sweep-agentic-evals, sweep-multi-node-evals, sweep-multi-node-agentic-evals, setup]
if: ${{ always() && needs.setup.result != 'skipped' && (needs.sweep-evals.result != 'skipped' || needs.sweep-agentic-evals.result != 'skipped' || needs.sweep-multi-node-evals.result != 'skipped' || needs.sweep-multi-node-agentic-evals.result != 'skipped') }}
uses: ./.github/workflows/collect-evals.yml
secrets: inherit

upload-changelog-metadata:

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {}
needs: [setup, collect-results]
if: ${{ always() && needs.setup.result == 'success' }}
runs-on: ubuntu-latest
Expand Down
Loading
Loading