-
Notifications
You must be signed in to change notification settings - Fork 293
[AMD] Add Qwen3.5 FP8 MI355X SGLang disaggregated benchmark #1570
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
0fb9c48
a5944df
8a9baff
99fc3fb
224d444
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -367,6 +367,70 @@ qwen3.5-fp8-mi355x-atom-mtp: | |
| - { tp: 4, ep: 1, conc-start: 4, conc-end: 256, spec-decoding: mtp } | ||
| - { tp: 8, ep: 1, conc-start: 4, conc-end: 256, spec-decoding: mtp } | ||
|
|
||
| qwen3.5-fp8-mi355x-sglang-disagg: | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Chang, we will need to rework this PR to keep the git commit history |
||
| image: lmsysorg/sglang-rocm:v0.5.11-rocm700-mi35x-20260511 | ||
| model: Qwen/Qwen3.5-397B-A17B-FP8 | ||
| model-prefix: qwen3.5 | ||
| runner: mi355x-disagg | ||
| precision: fp8 | ||
| framework: sglang-disagg | ||
| multinode: true | ||
| disagg: true | ||
| scenarios: | ||
| fixed-seq-len: | ||
| - isl: 1024 | ||
| osl: 1024 | ||
| search-space: | ||
| # Matches qwen3.5-fp8-mi355x-sglang TP8/EP1 low-concurrency sweep | ||
| - spec-decoding: "none" | ||
| conc-list: [ 8, 16, 32, 64, 128, 256, 512 ] | ||
| prefill: | ||
| num-worker: 1 | ||
| tp: 8 | ||
| ep: 1 | ||
| dp-attn: false | ||
| additional-settings: | ||
| - "PREFILL_NODES=1" | ||
| decode: | ||
| num-worker: 1 | ||
| tp: 8 | ||
| ep: 1 | ||
| dp-attn: false | ||
| additional-settings: | ||
| - "DECODE_NODES=1" | ||
| - "DECODE_MTP_SIZE=0" | ||
|
|
||
| - isl: 8192 | ||
| osl: 1024 | ||
| search-space: | ||
| # 1P+1D TP8/EP1 low-concurrency sweep. | ||
| # dp-attn intentionally false (matches the 1k1k row): with | ||
| # --enable-dp-attention + --moe-a2a-backend mori, sglang auto-promotes | ||
| # moe_ep_size=tp_size=8, but is_deepep_class_backend() excludes MoRI, | ||
| # so num_shared_slots stays at the global value (1) and the | ||
| # (num_experts - num_shared_slots) % moe_ep_size assertion in | ||
| # fused_moe_triton/layer.py fires for Qwen3.5 (512 routed + 1 shared). | ||
| # Track upstream sglang for a fix; flip back to dp-attn=true once | ||
| # MoRI is added to is_deepep_class_backend() or shared-slot | ||
| # accounting is reconciled. | ||
| - spec-decoding: "none" | ||
| conc-list: [ 8, 16, 32, 64, 128, 256, 512 ] | ||
| prefill: | ||
| num-worker: 1 | ||
| tp: 8 | ||
| ep: 1 | ||
|
ChangLiu0709 marked this conversation as resolved.
|
||
| dp-attn: false | ||
| additional-settings: | ||
| - "PREFILL_NODES=1" | ||
| decode: | ||
| num-worker: 1 | ||
| tp: 8 | ||
| ep: 1 | ||
| dp-attn: false | ||
| additional-settings: | ||
| - "DECODE_NODES=1" | ||
| - "DECODE_MTP_SIZE=0" | ||
|
|
||
| qwen3.5-fp4-mi355x-sglang: | ||
| image: lmsysorg/sglang:v0.5.12-rocm720-mi35x | ||
| model: amd/Qwen3.5-397B-A17B-MXFP4 | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,84 @@ | ||
| #!/usr/bin/env bash | ||
|
|
||
| source "$(dirname "$0")/../benchmark_lib.sh" | ||
|
|
||
| check_env_vars \ | ||
| CONC_LIST \ | ||
| ISL \ | ||
| OSL \ | ||
| IMAGE \ | ||
| SPEC_DECODING \ | ||
| MODEL_PATH \ | ||
| PREFILL_NUM_WORKERS \ | ||
| PREFILL_TP \ | ||
| PREFILL_EP \ | ||
| PREFILL_DP_ATTN \ | ||
| DECODE_NUM_WORKERS \ | ||
| DECODE_TP \ | ||
| DECODE_EP \ | ||
| DECODE_DP_ATTN \ | ||
| PREFILL_NODES \ | ||
| DECODE_NODES \ | ||
| RANDOM_RANGE_RATIO \ | ||
| FRAMEWORK | ||
|
|
||
| if [[ -n "$SLURM_JOB_ID" ]]; then | ||
| echo "JOB $SLURM_JOB_ID running on $SLURMD_NODENAME" | ||
| fi | ||
|
|
||
| set -x | ||
|
|
||
| # Use upstreamed multi_node scripts (no external clone needed) | ||
| cd "$GITHUB_WORKSPACE/benchmarks/multi_node/amd_utils" || exit 1 | ||
|
|
||
| # Set up SGL launch script-specific environment variables | ||
| export TIME_LIMIT="08:00:00" | ||
| export MODEL_PATH=$MODEL_PATH | ||
| export MODEL_NAME=$MODEL_NAME | ||
| export CONTAINER_IMAGE=$IMAGE | ||
|
|
||
| if [[ "${PREFILL_EP:-1}" -eq 1 ]]; then | ||
| export PREFILL_ENABLE_EP=false | ||
| else | ||
| export PREFILL_ENABLE_EP=true | ||
| fi | ||
|
|
||
| if [[ "$PREFILL_DP_ATTN" == "true" ]]; then | ||
| export PREFILL_ENABLE_DP=true | ||
| else | ||
| export PREFILL_ENABLE_DP=false | ||
| fi | ||
|
|
||
| if [[ "${DECODE_EP:-1}" -eq 1 ]]; then | ||
| export DECODE_ENABLE_EP=false | ||
| else | ||
| export DECODE_ENABLE_EP=true | ||
| fi | ||
|
|
||
| if [[ "$DECODE_DP_ATTN" == "true" ]]; then | ||
| export DECODE_ENABLE_DP=true | ||
| else | ||
| export DECODE_ENABLE_DP=false | ||
| fi | ||
|
|
||
| # Launch jobs based on ISL/OSL | ||
| # Replace ' ' in CONC_LIST with 'x' such that the concurrency list is represented | ||
| # by a list of numbers delimited by 'x'. This is because of how the underlying launch script | ||
| # expects the concurrencies. | ||
| JOB_ID=$(bash ./submit.sh $PREFILL_NODES \ | ||
| $PREFILL_NUM_WORKERS \ | ||
| $DECODE_NODES \ | ||
| $DECODE_NUM_WORKERS \ | ||
| $ISL $OSL "${CONC_LIST// /x}" inf \ | ||
| ${PREFILL_ENABLE_EP} ${PREFILL_ENABLE_DP} \ | ||
| ${DECODE_ENABLE_EP} ${DECODE_ENABLE_DP} \ | ||
| ${PREFILL_TP} ${DECODE_TP} \ | ||
| ${RANDOM_RANGE_RATIO} \ | ||
| ${NODE_LIST:-}) | ||
|
|
||
| if [[ $? -ne 0 ]]; then | ||
| echo "Failed to submit job" >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| echo "$JOB_ID" | ||
|
cursor[bot] marked this conversation as resolved.
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3171,3 +3171,13 @@ | |
| description: | ||
| - "Validates measured-power aggregation pipeline (PR #1558) on both NVIDIA (H200) and AMD (MI355X) hardware — different SMI tools (nvidia-smi vs amd-smi), different CSV schemas (power.draw [W] vs socket_power), same aggregator. No config change. Entry intentionally kept past merge so run-sweep produces canonical agg JSONs with avg_power_w + joules_per_output_token on main for both vendors, seeding the dashboard's day-zero data." | ||
| pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1558 | ||
|
|
||
| - config-keys: | ||
| - qwen3.5-fp8-mi355x-sglang-disagg | ||
| description: | ||
| - "Add Qwen3.5-397B-A17B-FP8 MI355X SGLang disaggregated prefill-decode benchmark" | ||
| - "Image: lmsysorg/sglang-rocm:v0.5.11-rocm700-mi35x-20260511" | ||
| - "1P+1D TP8/EP1 smoke sweep for 1k1k and 8k1k (conc 8-512); MoRI transfer backend" | ||
| - "Add models.yaml server flags and multinode launch script qwen3.5_fp8_mi355x_sglang-disagg.sh" | ||
| - "8k1k row uses dp-attn=false (matches 1k1k): with --enable-dp-attention + --moe-a2a-backend mori, sglang auto-promotes moe_ep_size=tp_size=8, but is_deepep_class_backend() excludes MoRI, so num_shared_slots stays at the global value (1) and the (num_experts - num_shared_slots) % moe_ep_size assertion in fused_moe_triton/layer.py fires for Qwen3.5 (512 routed + 1 shared). Track upstream sglang; flip back to dp-attn=true once MoRI is added to is_deepep_class_backend() or shared-slot accounting is reconciled." | ||
| pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/1570 | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changelog entry indentation inconsistent with existing entriesMedium Severity The new Reviewed by Cursor Bugbot for commit 224d444. Configure here. |
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -54,6 +54,7 @@ if [[ "$IS_MULTINODE" == "true" ]]; then | |||||||||||||||||
| # Ensure root-owned files are cleaned up even on early exit to prevent | ||||||||||||||||||
| # EACCES errors when the next GH Actions job checks out on this runner. | ||||||||||||||||||
| # Always preserve slurm logs as CI artifacts for debugging. | ||||||||||||||||||
| # KEEP_LOGS=1 disables the trap entirely (local-debug knob). | ||||||||||||||||||
| cleanup_and_save_logs() { | ||||||||||||||||||
| if [[ -n "${GITHUB_ACTIONS:-}" && -n "${JOB_ID:-}" ]]; then | ||||||||||||||||||
| local art_dir="$GITHUB_WORKSPACE/benchmark_artifacts" | ||||||||||||||||||
|
|
@@ -69,7 +70,11 @@ if [[ "$IS_MULTINODE" == "true" ]]; then | |||||||||||||||||
| fi | ||||||||||||||||||
| sudo rm -rf "$BENCHMARK_LOGS_DIR" 2>/dev/null || true | ||||||||||||||||||
| } | ||||||||||||||||||
| trap cleanup_and_save_logs EXIT | ||||||||||||||||||
| if [[ "${KEEP_LOGS:-0}" == "1" ]]; then | ||||||||||||||||||
| trap '' EXIT | ||||||||||||||||||
| else | ||||||||||||||||||
| trap cleanup_and_save_logs EXIT | ||||||||||||||||||
| fi | ||||||||||||||||||
|
Comment on lines
+73
to
+77
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔴 The new Extended reasoning...What the bug isThe PR documents if [[ "${KEEP_LOGS:-0}" == "1" ]]; then
trap '' EXIT
else
trap 'sudo rm -rf "$BENCHMARK_LOGS_DIR" 2>/dev/null || true' EXIT
fiThat correctly preserves logs when the script exits early (e.g. before slurm finishes). But the script ALSO has two inline
Neither is gated on Step-by-step proofWalk through the local-debug case:
User looks under Why existing code doesn't prevent itThe trap disarmament only matters for paths where control exits before reaching line 178 (e.g. the The GH Actions branch at lines 170-175 partially masks the issue in CI: when ImpactDocumented user-facing feature ( FixGate both inline rms on if [[ "${KEEP_LOGS:-0}" != "1" ]]; then
sudo rm -rf "$BENCHMARK_LOGS_DIR/logs" 2>/dev/null || true
fi…and similarly at line 178. (Or factor into a helper.) The line-167 rm is arguably also safe to skip on
cursor[bot] marked this conversation as resolved.
Comment on lines
+73
to
+77
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔴 BLOCKING: Why it matters: The feature's stated purpose (retain logs under Fix: Gate line 191 on
Suggested change
|
||||||||||||||||||
|
|
||||||||||||||||||
| SCRIPT_NAME="${EXP_NAME%%_*}_${PRECISION}_mi355x_${FRAMEWORK}.sh" | ||||||||||||||||||
| if [[ "$FRAMEWORK" == "sglang-disagg" ]] || [[ "$FRAMEWORK" == "vllm-disagg" ]]; then | ||||||||||||||||||
|
|
||||||||||||||||||


Uh oh!
There was an error while loading. Please reload this page.