sglang tp_dp_matrix: run SGLang server/client in Docker on H200

- config.env: switch to /data/models/DeepSeek-V4-Flash, USE_DOCKER=1,
  CONTEXT_LENGTH=1M, CONCURRENCY_SAMPLES=2, add DATASET_PATH.
- start_sglang_docker.sh: add --ipc host --shm-size 16g for NCCL.
- start_sglang_dp.sh: use --model-path for Docker CLI.
- run_bench.sh: mount dataset into client container and pass --dataset-path
to avoid HF download on offline nodes.
This commit is contained in:
yy-fighting 2026-07-10 02:17:00 +00:00
parent db419e17b8
commit 7852dd2040
4 changed files with 24 additions and 13 deletions

View File

@ -1,4 +1,4 @@
# TP×DP matrix experiment for DeepSeek-V4-Flash on H200 (8 GPUs) using SGLang Docker. # TP×DP matrix experiment for DeepSeek-V4-Flash on H200 (8 GPUs) using SGLang.
# Tests SGLang with three parallel configurations: # Tests SGLang with three parallel configurations:
# TP=2, DP=4 -> 2 GPUs per replica, 4 replicas # TP=2, DP=4 -> 2 GPUs per replica, 4 replicas
# TP=4, DP=2 -> 4 GPUs per replica, 2 replicas # TP=4, DP=2 -> 4 GPUs per replica, 2 replicas
@ -6,7 +6,7 @@
EXPERIMENT="dsv4_h200_sglang_tp_dp_matrix" EXPERIMENT="dsv4_h200_sglang_tp_dp_matrix"
MODEL_NAME="DeepSeek-V4-Flash" MODEL_NAME="DeepSeek-V4-Flash"
MODEL_PATH="/data3/hf_models/DeepSeek-V4-Flash" MODEL_PATH="/data/models/DeepSeek-V4-Flash"
SERVED_MODEL_NAME="deepseek-v4-flash" SERVED_MODEL_NAME="deepseek-v4-flash"
SGLANG_PORT="${SGLANG_PORT:-30031}" SGLANG_PORT="${SGLANG_PORT:-30031}"
@ -16,9 +16,7 @@ SGLANG_PORT="${SGLANG_PORT:-30031}"
# does not exist on the host. # does not exist on the host.
VENV_CLIENT="${VENV_CLIENT:-/data/user1/yy/envs/sglang}" VENV_CLIENT="${VENV_CLIENT:-/data/user1/yy/envs/sglang}"
# When USE_DOCKER_CLIENT=1, the benchmark client (sglang.bench_serving) is run # Run the benchmark client natively (0) or inside Docker (1).
# inside the same SGLang Docker image used for the server. This avoids requiring
# a native sglang installation on the host.
USE_DOCKER_CLIENT="${USE_DOCKER_CLIENT:-1}" USE_DOCKER_CLIENT="${USE_DOCKER_CLIENT:-1}"
export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0,1,2,3,4,5,6,7}" export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:-0,1,2,3,4,5,6,7}"
@ -35,22 +33,28 @@ declare -a PARALLEL_CONFIGS=(
) )
# SGLang server settings # SGLang server settings
CONTEXT_LENGTH="${CONTEXT_LENGTH:-65536}" CONTEXT_LENGTH="${CONTEXT_LENGTH:-1048576}"
MAX_RUNNING_REQUESTS="${MAX_RUNNING_REQUESTS:-64}" MAX_RUNNING_REQUESTS="${MAX_RUNNING_REQUESTS:-128}"
MEM_FRACTION_STATIC="${MEM_FRACTION_STATIC:-0.88}" MEM_FRACTION_STATIC="${MEM_FRACTION_STATIC:-0.88}"
MOE_RUNNER_BACKEND="${MOE_RUNNER_BACKEND:-marlin}" MOE_RUNNER_BACKEND="${MOE_RUNNER_BACKEND:-marlin}"
# Docker deployment switch. SGLang is launched via Docker using the image below. # Deployment switch. 0 = native sglang venv, 1 = Docker.
USE_DOCKER="${USE_DOCKER:-1}" USE_DOCKER="${USE_DOCKER:-1}"
DOCKER_IMAGE="${DOCKER_IMAGE:-lmsysorg/sglang:latest}" DOCKER_IMAGE="${DOCKER_IMAGE:-lmsysorg/sglang:latest}"
# Dataset used by sglang.bench_serving --dataset-name random.
# The random sampler needs a ShareGPT-style JSON file locally; it falls back to
# downloading from HuggingFace, which usually fails on offline H200 nodes.
DATASET_PATH="${DATASET_PATH:-/data/user1/yy/datasets/ShareGPT_V4.3_unfiltered_cleaned_split.json}"
# Matrix and concurrency rules are defined in matrix.json by default. # Matrix and concurrency rules are defined in matrix.json by default.
MATRIX_FILE="${MATRIX_FILE:-${SCRIPT_DIR:-.}/matrix.json}" MATRIX_FILE="${MATRIX_FILE:-${SCRIPT_DIR:-.}/matrix.json}"
MATRIX_MODE="${MATRIX_MODE:-Y}" MATRIX_MODE="${MATRIX_MODE:-Y}"
# Sampling density for concurrency. 0 means use the default heuristic in # Sampling density for concurrency.
# generate_scenarios.py (6-8 points, or all integers when range is small). # 0 = use the default heuristic in generate_scenarios.py (6-8 points).
CONCURRENCY_SAMPLES="${CONCURRENCY_SAMPLES:-0}" # 2 = only test the low and high endpoints.
export CONCURRENCY_SAMPLES="${CONCURRENCY_SAMPLES:-2}"
# Per-scenario timeout to avoid hangs (seconds). # Per-scenario timeout to avoid hangs (seconds).
SCENARIO_TIMEOUT_S="${SCENARIO_TIMEOUT_S:-1800}" SCENARIO_TIMEOUT_S="${SCENARIO_TIMEOUT_S:-1800}"

View File

@ -123,6 +123,7 @@ run_bench_serving() {
docker run --rm \ docker run --rm \
--network host \ --network host \
-v "${MODEL_PATH}:${MODEL_PATH}:ro" \ -v "${MODEL_PATH}:${MODEL_PATH}:ro" \
-v "${DATASET_PATH}:${DATASET_PATH}:ro" \
-v "${RESULT_BASE}:${RESULT_BASE}" \ -v "${RESULT_BASE}:${RESULT_BASE}" \
-e PYTHONUNBUFFERED=1 \ -e PYTHONUNBUFFERED=1 \
"${DOCKER_IMAGE}" \ "${DOCKER_IMAGE}" \
@ -142,6 +143,7 @@ run_warmup() {
--host 127.0.0.1 \ --host 127.0.0.1 \
--port "$SGLANG_PORT" \ --port "$SGLANG_PORT" \
--dataset-name random \ --dataset-name random \
--dataset-path "$DATASET_PATH" \
--random-input-len "$input_len" \ --random-input-len "$input_len" \
--random-output-len "$output_len" \ --random-output-len "$output_len" \
--num-prompts 1 \ --num-prompts 1 \
@ -419,6 +421,7 @@ run_parallel_config() {
--host 127.0.0.1 \ --host 127.0.0.1 \
--port "$SGLANG_PORT" \ --port "$SGLANG_PORT" \
--dataset-name random \ --dataset-name random \
--dataset-path "$DATASET_PATH" \
--random-input-len "$isl" \ --random-input-len "$isl" \
--random-output-len "$dsl" \ --random-output-len "$dsl" \
--num-prompts "$num" \ --num-prompts "$num" \

View File

@ -28,7 +28,8 @@ rm -f "$PID_FILE"
docker rm -f "$NAME" >/dev/null 2>&1 || true docker rm -f "$NAME" >/dev/null 2>&1 || true
SERVER_ARGS=( SERVER_ARGS=(
serve "$MODEL_PATH" serve
--model-path "$MODEL_PATH"
--trust-remote-code --trust-remote-code
--tp-size "$TP" --tp-size "$TP"
--moe-runner-backend "$MOE_RUNNER_BACKEND" --moe-runner-backend "$MOE_RUNNER_BACKEND"
@ -61,6 +62,8 @@ echo "Log: $LOG"
nohup docker run --rm \ nohup docker run --rm \
--name "$NAME" \ --name "$NAME" \
--gpus all \ --gpus all \
--ipc host \
--shm-size 16g \
--entrypoint sglang \ --entrypoint sglang \
-p "${PORT}:${PORT}" \ -p "${PORT}:${PORT}" \
-v "${MODEL_PATH}:${MODEL_PATH}:ro" \ -v "${MODEL_PATH}:${MODEL_PATH}:ro" \

View File

@ -33,7 +33,8 @@ PID_FILE="${RUNTIME_BASE}/${EXPERIMENT}_sglang_tp${TP}_dp${DP}.pid"
rm -f "$PID_FILE" rm -f "$PID_FILE"
SERVER_ARGS=( SERVER_ARGS=(
sglang serve "$MODEL_PATH" sglang serve
--model-path "$MODEL_PATH"
--trust-remote-code --trust-remote-code
--tp-size "$TP" --tp-size "$TP"
--moe-runner-backend "$MOE_RUNNER_BACKEND" --moe-runner-backend "$MOE_RUNNER_BACKEND"