Skip to content

Commit 16f04c4

Browse files
authored
Merge branch 'main' into gptoss-trt-docker
2 parents dba3ca9 + 09df1ba commit 16f04c4

8 files changed

Lines changed: 144 additions & 24 deletions

File tree

.github/configs/nvidia-master.yaml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,34 +167,38 @@ dsr1-fp8-h200-trt:
167167
- { tp: 8, ep: 8, dp-attn: true, conc-start: 64, conc-end: 64 }
168168

169169
gptoss-fp4-b200-trt:
170-
image: nvcr.io#nvidia/tensorrt-llm/release:1.2.0rc0.post1
170+
image: nvcr.io#nvidia/tensorrt-llm/release:1.2.0rc2
171171
model: openai/gpt-oss-120b
172172
model-prefix: gptoss
173173
runner: b200-trt
174174
precision: fp4
175175
framework: trt
176-
# For all sequence lengths, if CONC >= 256, then EP=TP and DP_ATTN=true
176+
# Enable DP_ATTENTION for conc >= 32
177177
seq-len-configs:
178178
- isl: 1024
179179
osl: 1024
180180
search-space:
181+
- { tp: 2, dp-attn: true, conc-start: 32, conc-end: 128 }
182+
- { tp: 4, dp-attn: true, conc-start: 32, conc-end: 64 }
181183
- { tp: 1, conc-start: 64, conc-end: 128 }
182-
- { tp: 2, conc-start: 4, conc-end: 128 }
183-
- { tp: 4, conc-start: 4, conc-end: 128 }
184+
- { tp: 2, conc-start: 4, conc-end: 32 }
185+
- { tp: 4, conc-start: 4, conc-end: 64 }
184186
- { tp: 8, conc-start: 4, conc-end: 8 }
185187
- isl: 1024
186188
osl: 8192
187189
search-space:
188190
- { tp: 1, conc-start: 64, conc-end: 128 }
191+
- { tp: 2, dp-attn: true, conc-start: 64, conc-end: 128 }
189192
- { tp: 2, conc-start: 4, conc-end: 128 }
190193
- { tp: 4, conc-start: 4, conc-end: 128 }
191194
- { tp: 8, conc-start: 4, conc-end: 16 }
192195
- isl: 8192
193196
osl: 1024
194197
search-space:
195198
- { tp: 1, conc-start: 64, conc-end: 128 }
199+
- { tp: 2, dp-attn: true, conc-start: 64, conc-end: 128 }
196200
- { tp: 2, conc-start: 4, conc-end: 128 }
197-
- { tp: 4, conc-start: 4, conc-end: 128 }
201+
- { tp: 4, conc-start: 4, conc-end: 32 }
198202
- { tp: 8, conc-start: 4, conc-end: 8 }
199203

200204
gptoss-fp4-b200-vllm:

.github/configs/runners.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ b200:
2424
- 'b200-nvd_1'
2525
- 'b200-nvd_2'
2626
- 'b200-nvd_3'
27+
- 'b200-dgxc_1'
28+
- 'b200-dgxc_2'
2729
mi300x:
2830
- 'mi300x-amd_0'
2931
- 'mi300x-amd_1'

.github/workflows/label-validation.yml

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@ concurrency:
66
cancel-in-progress: true
77

88
on:
9-
pull_request:
10-
types: [labeled, synchronize]
9+
pull_request_target:
10+
types: labeled
1111

1212
jobs:
1313
get-jobs:
1414
runs-on: ubuntu-latest
15+
environment: fork-pr-validation
1516
outputs:
1617
search-space-config: ${{ steps.get-jobs.outputs.search-space-config }}
1718
steps:
1819
- name: Checkout code
1920
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
21+
with:
22+
ref: ${{ github.event.pull_request.head.sha }}
2023

2124
- id: get-jobs
2225
shell: python
@@ -80,12 +83,15 @@ jobs:
8083
8184
validate:
8285
needs: get-jobs
83-
if: ${{ needs.get-jobs.outputs.search-space-config != '[]' }}
86+
if: ${{ always() && needs.get-jobs.result == 'success' && needs.get-jobs.outputs.search-space-config != '[]' }}
8487
uses: ./.github/workflows/benchmark-tmpl.yml
8588
strategy:
8689
fail-fast: false
8790
matrix:
88-
config: ${{ fromJson(needs.get-jobs.outputs.search-space-config) }}
91+
# The '|| '[]'' fallback is required because GitHub evaluates the matrix expression
92+
# before the 'if' condition. Without it, fromJson() throws a parse error when the
93+
# output is empty/undefined (e.g., when get-jobs is pending approval or was skipped).
94+
config: ${{ fromJson(needs.get-jobs.outputs.search-space-config || '[]') }}
8995
secrets: inherit
9096
name: validate ${{ matrix.config.runner }}
9197
with:
@@ -104,14 +110,14 @@ jobs:
104110
conc: ${{ matrix.config.conc }}
105111

106112
collect-results:
107-
needs: validate
108-
if: ${{ always() }}
113+
needs: [get-jobs, validate]
114+
if: ${{ always() && needs.get-jobs.result == 'success' }}
109115
uses: ./.github/workflows/collect-results.yml
110116
secrets: inherit
111117

112118
calc-success-rate:
113-
needs: collect-results
114-
if: ${{ always() }}
119+
needs: [get-jobs, collect-results]
120+
if: ${{ always() && needs.get-jobs.result == 'success' }}
115121
runs-on: ubuntu-latest
116122

117123
env:

.github/workflows/test-matrix-logic.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
2121

2222
- name: Set up Python
23-
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
23+
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
2424
with:
2525
python-version: '3.12'
2626

.github/workflows/test-process-result.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
2222

2323
- name: Set up Python
24-
uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
24+
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
2525
with:
2626
python-version: '3.12'
2727

benchmarks/gptoss_fp4_b200_trt_slurm.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ echo "MOE_BACKEND set to '$MOE_BACKEND'"
3131

3232
EXTRA_CONFIG_FILE="gptoss-fp4.yml"
3333
export TRTLLM_ENABLE_PDL=1
34-
export NCCL_GRAPH_REGISTER=0
3534

3635
cat > $EXTRA_CONFIG_FILE << EOF
3736
cuda_graph_config:
@@ -50,6 +49,9 @@ moe_config:
5049
EOF
5150

5251
if [[ "$DP_ATTENTION" == "true" ]]; then
52+
export TRTLLM_MOE_ALLTOALL_BACKEND="mnnvlthroughput"
53+
export TRTLLM_FORCE_ALLTOALL_METHOD="MNNVL"
54+
export TRTLLM_MOE_A2A_WORKSPACE_MB="2048"
5355
cat << EOF >> $EXTRA_CONFIG_FILE
5456
attention_dp_config:
5557
enable_balance: true

runners/launch_b200-dgxc.sh

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/bash
2+
3+
HF_HUB_CACHE_MOUNT="/raid/hf_hub_cache/"
4+
FRAMEWORK_SUFFIX=$([[ "$FRAMEWORK" == "trt" ]] && printf '_trt' || printf '')
5+
PORT=8888
6+
7+
# Create unique cache directory based on model parameters
8+
MODEL_NAME=$(basename "$MODEL")
9+
10+
server_name="bmk-server"
11+
12+
nvidia-smi
13+
14+
# GPUs must be idle
15+
if nvidia-smi --query-compute-apps=pid --format=csv,noheader | grep -q '[0-9]'; then
16+
echo "[ERROR] GPU busy from previous run"; nvidia-smi; exit 1
17+
fi
18+
19+
set -x
20+
# Use --init flag to run an init process (PID 1) inside container for better signal handling and zombie process cleanup
21+
# Ref: https://www.paolomainardi.com/posts/docker-run-init/
22+
23+
# NCCL_GRAPH_REGISTER tries to automatically enable user buffer registration with CUDA Graphs.
24+
# Disabling it can reduce perf but will improve CI stability. i.e. we won't see vLLM/Sglang crashes.
25+
# Ref: https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-graph-register
26+
27+
if [[ "$MODEL" == "nvidia/DeepSeek-R1-0528-FP4" || "$MODEL" == "deepseek-ai/DeepSeek-R1-0528" ]]; then
28+
if [[ "$OSL" == "8192" ]]; then
29+
export NUM_PROMPTS=$(( CONC * 20 ))
30+
else
31+
export NUM_PROMPTS=$(( CONC * 50 ))
32+
fi
33+
else
34+
export NUM_PROMPTS=$(( CONC * 10 ))
35+
fi
36+
37+
docker run --rm --init --network host --name $server_name \
38+
--runtime nvidia --gpus all --ipc host --privileged --shm-size=16g --ulimit memlock=-1 --ulimit stack=67108864 \
39+
-v $HF_HUB_CACHE_MOUNT:$HF_HUB_CACHE \
40+
-v $GITHUB_WORKSPACE:/workspace/ -w /workspace/ \
41+
-e HF_TOKEN -e HF_HUB_CACHE -e MODEL -e TP -e CONC -e MAX_MODEL_LEN -e ISL -e OSL -e PORT=$PORT -e EP_SIZE -e DP_ATTENTION \
42+
-e NCCL_GRAPH_REGISTER=0 \
43+
-e TORCH_CUDA_ARCH_LIST="10.0" -e CUDA_DEVICE_ORDER=PCI_BUS_ID -e CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" \
44+
-e PYTHONPYCACHEPREFIX=/tmp/pycache/ -e RESULT_FILENAME -e RANDOM_RANGE_RATIO -e NUM_PROMPTS \
45+
--entrypoint=/bin/bash \
46+
$(echo "$IMAGE" | sed 's/#/\//') \
47+
benchmarks/"${EXP_NAME%%_*}_${PRECISION}_b200${FRAMEWORK_SUFFIX}_docker.sh"
48+
49+
# Try graceful first
50+
docker stop -t 90 "$server_name" || true
51+
# Wait until it's really dead
52+
docker wait "$server_name" >/dev/null 2>&1 || true
53+
# Force remove if anything lingers
54+
docker rm -f "$server_name" >/dev/null 2>&1 || true
55+
56+
# Give a moment for GPU processes to fully terminate
57+
sleep 2
58+
# Verify GPUs are now idle; if not, print diag and (optionally) reset
59+
if nvidia-smi --query-compute-apps=pid --format=csv,noheader | grep -q '[0-9]'; then
60+
echo "[WARN] After stop, GPU still busy:"; nvidia-smi
61+
# Last resort if driver allows and GPUs appear idle otherwise:
62+
#nvidia-smi --gpu-reset -i 0,1,2,3,4,5,6,7 2>/dev/null || true
63+
fi
64+
65+
nvidia-smi

runners/launch_gb200-nv.sh

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,17 @@ export SLURM_PARTITION="batch"
88
export SLURM_ACCOUNT="benchmark"
99
export SLURM_JOB_NAME="benchmark-dynamo.job"
1010

11+
# For SGLang - we are working on updating the 8k1k configs
12+
# For now we add conditionals to this script to use newer code for the 1k1k configs
13+
1114
### FRAMEWORK_DIFF_IF_STATEMENT #1 - difference in setting up envvars
1215
if [[ $FRAMEWORK == "dynamo-sglang" ]]; then
13-
export IMAGE="/mnt/lustre01/artifacts/containers/dynamo-sglang.sqsh"
16+
# Set IMAGE based on ISL/OSL
17+
if [ "$ISL" = "1024" ] && [ "$OSL" = "1024" ]; then
18+
export IMAGE="/mnt/lustre01/artifacts/containers/lmsysorg+sglang+v0.5.5.post2.sqsh"
19+
else
20+
export IMAGE="/mnt/lustre01/artifacts/containers/dynamo-sglang.sqsh"
21+
fi
1422
export MODEL_PATH="/mnt/lustre01/models/deepseek-r1-0528"
1523
export CONFIG_DIR="/mnt/lustre01/artifacts/sglang-configs/1k1k"
1624
else
@@ -157,13 +165,24 @@ if [[ $FRAMEWORK == "dynamo-trtllm" ]]; then
157165

158166
else # if statement at the top - search for "FRAMEWORK_DIFF_IF_STATEMENT #2"
159167
# Set up Dynamo repository path
168+
set -x
160169
DYNAMO_PATH="/mnt/lustre01/users/sa-shared/benchmarks/dynamo"
161-
SGL_SLURM_JOBS_PATH="$DYNAMO_PATH/components/backends/sglang/slurm_jobs"
170+
if [ "$ISL" = "1024" ] && [ "$OSL" = "1024" ]; then
171+
SGL_SLURM_JOBS_PATH="$DYNAMO_PATH/examples/backends/sglang/slurm_jobs"
172+
else
173+
SGL_SLURM_JOBS_PATH="$DYNAMO_PATH/components/backends/sglang/slurm_jobs"
174+
fi
162175

163176
# Always clone and setup Dynamo
164177
echo "Cloning Dynamo repository..."
165178
rm -rf "$DYNAMO_PATH"
166-
git clone --branch update-result-file-name https://github.com/Elnifio/dynamo.git $DYNAMO_PATH
179+
if [ "$ISL" = "1024" ] && [ "$OSL" = "1024" ]; then
180+
# TODO: before merge this will be a different branch off of main
181+
git clone --branch ishan/sa-1.1-sgl-dsr1-fp8 https://github.com/ai-dynamo/dynamo.git $DYNAMO_PATH
182+
else
183+
git clone --branch update-result-file-name https://github.com/Elnifio/dynamo.git $DYNAMO_PATH
184+
fi
185+
167186
cd "$DYNAMO_PATH"
168187

169188
# Navigate to corresponding directory
@@ -179,15 +198,32 @@ else # if statement at the top - search for "FRAMEWORK_DIFF_IF_STATEMENT #2"
179198

180199
# Launch jobs based on ISL/OSL
181200
if [ "$ISL" = "1024" ] && [ "$OSL" = "1024" ]; then
182-
concurrency_list="1024x2048x4096x4608x4864x4992x5120x5376x5632x6144x8192"
183-
bash ./submit_disagg.sh 6 3 12 1 8 $ISL $OSL $concurrency_list inf
201+
NUMBER_OF_EXPERIMENTS=3
202+
203+
top_of_curve_concurrency_list="4096"
204+
middle_of_curve_concurrency_list="1024x2048x4096"
205+
bottom_of_curve_concurrency_list="2x4x8x16x64x128"
206+
207+
# Top of curve (2 prefill workers each at DEP8 and 1 decode worker at DEP32)
208+
bash ./submit_disagg.sh 4 2 8 1 9 $ISL $OSL $top_of_curve_concurrency_list inf
209+
210+
# Bottom of curve (1 prefill worker at DEP4 and 4 decode workers at DEP4)
211+
bash ./submit_disagg.sh 1 1 4 4 9 $ISL $OSL $bottom_of_curve_concurrency_list inf 1p_4d
212+
213+
# Middle of curve (3 prefill workers each at DEP8 and 1 decode worker at DEP48)
214+
bash ./submit_disagg.sh 6 3 12 1 9 $ISL $OSL $middle_of_curve_concurrency_list inf
215+
184216
elif [ "$ISL" = "8192" ] && [ "$OSL" = "1024" ]; then
217+
NUMBER_OF_EXPERIMENTS=1
218+
185219
concurrency_list="128x256x384x448x512x576x1024x2048x4096"
186220
bash ./submit_disagg.sh 12 6 6 1 8 $ISL $OSL $concurrency_list inf
187221
else
188222
echo "Unsupported ISL/OSL combination: $ISL/$OSL"
189223
exit 1
190224
fi
225+
226+
set +x
191227
fi
192228

193229
# Wait for all jobs to complete
@@ -259,9 +295,14 @@ if [[ $FRAMEWORK == "dynamo-trtllm" ]]; then
259295
done
260296

261297
else # search for "FRAMEWORK_DIFF_IF_STATEMENT #3" for this if-statement
262-
# Find the latest log directory
263-
# we do "tail -1" here since only the latest job will yield the result
264-
LOGS_DIR=$(find logs/*/vllm_isl_${ISL}_osl_${OSL} -type d | sort -V | tail -1)
298+
# Find the latest log directory that contains the data
299+
cat > collect_latest_results.py <<'PY'
300+
import os, sys
301+
isl, osl, nexp = [int(x) for x in sys.argv[1:]]
302+
for path in sorted([f"logs/{name}/vllm_isl_{isl}_osl_{osl}" for name in os.listdir("logs/") if os.path.isdir(f"logs/{name}/vllm_isl_{isl}_osl_{osl}")], key=os.path.getmtime, reverse=True)[:nexp]:
303+
print(path)
304+
PY
305+
LOGS_DIR=$(python3 collect_latest_results.py $ISL $OSL $NUMBER_OF_EXPERIMENTS)
265306
if [ -z "$LOGS_DIR" ]; then
266307
echo "No logs directory found for ISL=${ISL}, OSL=${OSL}"
267308
exit 1

0 commit comments

Comments
 (0)