Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
375ac24
HiCache sizing fixes (ratio vs size), NCCL/image updates, disable pre…
ichbinblau Jul 23, 2026
816d2a9
Update DPA config, add RDMA/GPU pre-flight gates to job.slurm, and fi…
ichbinblau Jul 23, 2026
acb2027
Add perf-changelog.yaml entry for dsv4-fp4-mi355x-sglang-disagg-agent…
ichbinblau Jul 23, 2026
ae2021b
remove disable_cuda_graph: false setting from decode
ichbinblau Jul 23, 2026
c96e5af
add env PREFILL_DP_ATTN and DECODE_DP_ATTN
ichbinblau Jul 23, 2026
1a57669
fix(dsv4): forward PREFILL_EP/DECODE_EP/*_DP_ATTN into agentic server…
ichbinblau Jul 27, 2026
fb4d803
feat(agentic): add multi-node agentic (SWE-bench) eval dispatch support
ichbinblau Jul 27, 2026
55c8f14
Mark dsv4-fp4-mi355x-sglang-disagg-agentic-hicache changelog entry ev…
ichbinblau Jul 27, 2026
b5c0f2a
Fix multinode agentic eval-only CI: forward Modal creds and stage eva…
ichbinblau Jul 28, 2026
fe2e508
Harden multinode agentic Modal credential setup.
ichbinblau Jul 28, 2026
eff307f
Switch multinode agentic eval to GSM8K lm-eval with correct metadata.
ichbinblau Jul 28, 2026
ff606ab
Harden multinode agentic eval metadata and GPU pre-flight for DEP8 CI.
ichbinblau Jul 28, 2026
ad0b35c
Add EP1 GSM8K eval changelog entry alongside DEP8 c128 eval.
ichbinblau Jul 28, 2026
64616b7
Revert "Add EP1 GSM8K eval changelog entry alongside DEP8 c128 eval."
ichbinblau Jul 28, 2026
644ac62
include node mia1-p01-g10 and mia1-p01-g16
ichbinblau Jul 28, 2026
33e7b1b
exclude mia1-p01-g10
ichbinblau Jul 28, 2026
44370d3
add con=1 in config
ichbinblau Jul 28, 2026
c01db05
remove con=64
ichbinblau Jul 29, 2026
c601780
remove SGLANG_AITER_MLA_PERSIST
ichbinblau Jul 29, 2026
5a94ff1
fix(amd): extend GPU drain poll, trim node excludes, pin aiperf
ichbinblau Jul 30, 2026
501fede
fix(agentic): use explicit Python 3.11 for isolated aiperf venv
ichbinblau Jul 30, 2026
ae9d518
fix(amd): disable aiter MLA persist kernel for DSv4, widen GPU drain …
ichbinblau Jul 31, 2026
f10c206
fix(amd): disable HSA scratch reclaim for DSv4 to resolve OOR
ichbinblau Aug 3, 2026
da67400
Merge branch 'main' into amd/agentx-v1.0-th-hicon-dpa
ichbinblau Aug 4, 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 @@ -157,6 +157,7 @@ jobs:
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 @@ -236,15 +237,17 @@ jobs:
}
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"
echo "agentic-eval-config=$AGENTIC_EVAL"
echo "multi-node-agentic-config=$MULTI_AGENTIC"
echo "multi-node-agentic-eval-config=$MULTI_AGENTIC_EVAL"
echo "single-node-config=$SINGLE"
echo "multi-node-config=$MULTI"
echo "eval-config=$EVALS"
Expand Down Expand Up @@ -496,6 +499,65 @@ jobs:
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:
needs: get-jobs
if: ${{ needs.get-jobs.outputs.single-node-config != '[]' }}
Expand Down Expand Up @@ -581,8 +643,8 @@ jobs:
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

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 @@ -853,7 +853,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 @@ -883,12 +955,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