Repository navigation
Validate DeepSeek-V4 sliding-window cache sources on B200 #2931
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 9 commits
fc39b18
4dc76df
2fe58b4
e231441
463e74e
2145636
0e33aff
fd2239f
b2f7170
b10b1a6
ec54dee
b1a3acd
6a822f9
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 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -28,6 +28,9 @@ elif [[ $MODEL_PREFIX == "dsv4" && $PRECISION == "fp4" && $MODEL == "deepseek-ai | |||||||||||||
| elif [[ $MODEL_PREFIX == "dsv4" && $PRECISION == "fp4" ]]; then | ||||||||||||||
| # Node-local weights are not visible on the runner/login node. | ||||||||||||||
| export MODEL_PATH="/scratch/models/DeepSeek-V4-Pro-NVFP4" | ||||||||||||||
| if [[ "$FRAMEWORK" == "vllm" ]]; then | ||||||||||||||
| export MODEL_PATH="/scratch/models/DeepSeek-V4-Pro" | ||||||||||||||
| fi | ||||||||||||||
|
Comment on lines
+31
to
+33
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: This checkpoint swap is not scoped to the agentic validation recipe — it changes the weights for every dsv4-fp4 vLLM job on this launcher, including the existing production Why it matters: Fix: Scope the override to the agentic recipe.
Suggested change
(Alternatively, keep the unscoped change and add a |
||||||||||||||
| export SRT_SLURM_MODEL_PREFIX="deepseek-v4-pro" | ||||||||||||||
| elif [[ $MODEL_PREFIX == "qwen3.5" && $PRECISION == "bf16" ]]; then | ||||||||||||||
| export MODEL_PATH="/scratch/models/Qwen3.5-397B-A17B" | ||||||||||||||
|
|
@@ -531,8 +534,33 @@ else | |||||||||||||
| export GPU_COUNT="${GPU_COUNT:-${TP:?TP must be set}}" | ||||||||||||||
|
|
||||||||||||||
| SALLOC_TIME_LIMIT="${SALLOC_TIME_LIMIT:-480}" | ||||||||||||||
| salloc --partition=$SLURM_PARTITION --account=$SLURM_ACCOUNT --gres=gpu:$GPU_COUNT --exclusive --mem=0 --time="$SALLOC_TIME_LIMIT" --no-shell --job-name="$RUNNER_NAME" | ||||||||||||||
| salloc --partition=$SLURM_PARTITION --account=$SLURM_ACCOUNT --gres=gpu:$GPU_COUNT --exclusive --mem=0 --time="$SALLOC_TIME_LIMIT" --no-shell --job-name="$RUNNER_NAME" || exit 1 | ||||||||||||||
| JOB_ID=$(squeue --name="$RUNNER_NAME" -u "$USER" -h -o %A | head -n1) | ||||||||||||||
| [[ "$JOB_ID" =~ ^[0-9]+$ ]] || { echo "Could not resolve Slurm allocation" >&2; exit 1; } | ||||||||||||||
|
|
||||||||||||||
| NVME_HOST_DIR="" | ||||||||||||||
| cleanup_offload_cache() { | ||||||||||||||
| local rc=$? | ||||||||||||||
| if [[ -n "$NVME_HOST_DIR" ]]; then | ||||||||||||||
| timeout --kill-after=10s 60s srun --jobid="$JOB_ID" \ | ||||||||||||||
| rm -rf -- "$NVME_HOST_DIR" || { | ||||||||||||||
| echo "NVMe cleanup failed: $NVME_HOST_DIR on job $JOB_ID" >&2 | ||||||||||||||
| rc=1 | ||||||||||||||
| } | ||||||||||||||
| fi | ||||||||||||||
| scancel "$JOB_ID" || true | ||||||||||||||
| exit "$rc" | ||||||||||||||
|
Comment on lines
+543
to
+552
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. 🟡 WARNING: Cleanup depends on the allocation still being alive. If the job dies before the EXIT trap's Fix: Keep the per-job delete, but before creating the new directory, sweep stale siblings whose owning job no longer exists (preserves the "never touch a live job's files" property): if [[ "${KV_OFFLOADING:-none}" == *nvme* ]]; then
NVME_HOST_DIR="/scratch/inferencex-kv-$JOB_ID"
srun --jobid="$JOB_ID" bash -c '
for d in /scratch/inferencex-kv-*; do
[[ -d "$d" ]] || continue
jid="${d##*-}"
squeue -h -j "$jid" > /dev/null 2>&1 || rm -rf -- "$d"
done
' || true
srun --jobid="$JOB_ID" mkdir -m 700 "$NVME_HOST_DIR" || exit 1 |
||||||||||||||
| } | ||||||||||||||
|
Comment on lines
+542
to
+553
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. 🟡 (optional) The new EXIT-trap cleanup_offload_cache() overwrites rc=1 whenever the bounded NVMe rm -rf fails/times out, so a benchmark that already succeeded (rc=0) gets reported as a failed CI step just because scratch cleanup hit a transient Slurm/filesystem hiccup. Fix: isolate cleanup failures from the run's own exit status — log the cleanup failure but exit with the original $? captured before cleanup, only setting a nonzero code if the run itself failed. Extended reasoning...Main bench srun (line 585-591) finishes with rc=0 -> script falls off the end -> EXIT trap fires, local rc=$? captures 0 first. If the subsequent Verification: normal. In the new EXIT trap at runners/launch_b200-nscale-compat.sh (added this diff), |
||||||||||||||
| trap cleanup_offload_cache EXIT | ||||||||||||||
| trap 'exit 130' INT | ||||||||||||||
| trap 'exit 143' TERM | ||||||||||||||
| EXTRA_MOUNTS="" | ||||||||||||||
| if [[ "${KV_OFFLOADING:-none}" == *nvme* ]]; then | ||||||||||||||
| NVME_HOST_DIR="/scratch/inferencex-kv-$JOB_ID" | ||||||||||||||
| srun --jobid="$JOB_ID" mkdir -m 700 "$NVME_HOST_DIR" || exit 1 | ||||||||||||||
| export NVME_OFFLOAD_DIR=/kv-offload | ||||||||||||||
| EXTRA_MOUNTS=",$NVME_HOST_DIR:$NVME_OFFLOAD_DIR" | ||||||||||||||
| fi | ||||||||||||||
|
|
||||||||||||||
| # Point the bench script at the resolved MODEL_PATH instead of | ||||||||||||||
| # pulling from the HF hub cache. Bench scripts skip `hf download` when | ||||||||||||||
|
|
@@ -550,13 +578,13 @@ else | |||||||||||||
| echo 'Squash file already exists and is valid, skipping import' | ||||||||||||||
| else | ||||||||||||||
| rm -f \"$SQUASH_FILE\" | ||||||||||||||
| enroot import -o \"$SQUASH_FILE\" docker://$IMAGE | ||||||||||||||
| enroot import -o \"$SQUASH_FILE\" docker://${IMAGE/@/:} | ||||||||||||||
| fi | ||||||||||||||
| " | ||||||||||||||
| " || exit 1 | ||||||||||||||
|
|
||||||||||||||
| srun --jobid=$JOB_ID \ | ||||||||||||||
| --container-image=$SQUASH_FILE \ | ||||||||||||||
| --container-mounts=$GITHUB_WORKSPACE:$CONTAINER_MOUNT_DIR,$MODEL_PATH:$MODEL_PATH,$AIPERF_MMAP_CACHE_HOST_PATH:/aiperf_mmap_cache \ | ||||||||||||||
| --container-mounts=$GITHUB_WORKSPACE:$CONTAINER_MOUNT_DIR,$MODEL_PATH:$MODEL_PATH,$AIPERF_MMAP_CACHE_HOST_PATH:/aiperf_mmap_cache$EXTRA_MOUNTS \ | ||||||||||||||
| --no-container-mount-home \ | ||||||||||||||
| --container-workdir=$CONTAINER_MOUNT_DIR \ | ||||||||||||||
| --no-container-entrypoint --export=ALL,PORT=8888,AIPERF_DATASET_MMAP_CACHE_DIR=/aiperf_mmap_cache \ | ||||||||||||||
|
|
||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📊 Line Count Report