100 lines
4.4 KiB
Bash
100 lines
4.4 KiB
Bash
# TP×DP matrix experiment for DeepSeek-V4-Flash-INT8 on Kunlun P800 (8 XPUs)
|
||
# using SGLang-XPU with the OFFICIAL vendor-recommended launch parameters
|
||
# (extracted from the image's /workspace/ds_v4/w8a8/run_server.sh):
|
||
# --ep-size <TP*DP> (expert parallel; probes whether EP makes TP2/DP4 viable)
|
||
# EAGLE speculative decoding (steps=3, topk=1, draft=4)
|
||
# --chunked-prefill-size 8192 --max-prefill-tokens 16384
|
||
# Tests SGLang with three parallel configurations:
|
||
# TP=2, DP=4 -> 2 XPUs per replica, 4 replicas
|
||
# TP=4, DP=2 -> 4 XPUs per replica, 2 replicas
|
||
# TP=8, DP=1 -> 8 XPUs, no data parallelism (production config)
|
||
|
||
EXPERIMENT="dsv4_p800_sglang_tp_dp_official"
|
||
MODEL_NAME="DeepSeek-V4-Flash-INT8"
|
||
MODEL_PATH="${MODEL_PATH:-/data1/models/DeepSeek-V4-Flash-INT8}"
|
||
SERVED_MODEL_NAME="deepseek-v4-flash-int8"
|
||
|
||
SGLANG_PORT="${SGLANG_PORT:-30014}"
|
||
|
||
# Dedicated container name so this experiment never touches the
|
||
# `sglang-dsv4-flash` container used by the other P800 experiments.
|
||
CONTAINER_NAME="sglang-dsv4-flash-tpdp-official"
|
||
|
||
# Python interpreter inside the P800 SGLang container (used to run the
|
||
# benchmark client via `docker exec`).
|
||
CONTAINER_PYTHON="${CONTAINER_PYTHON:-/root/miniconda/envs/python310_torch25_cuda/bin/python}"
|
||
|
||
export XPU_VISIBLE_DEVICES="${XPU_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}"
|
||
|
||
# Runtime working directory for logs, pid files, and tmp. Defaults to a local
|
||
# directory under this experiment so the benchmark is self-contained.
|
||
RUNTIME_BASE="${RUNTIME_BASE:-${SCRIPT_DIR}/runtime}"
|
||
|
||
# Parallel configurations to test. Format: "TP DP"
|
||
# TP2/DP4 is excluded: --ep-size 8 crashes this vendor image when DP>1
|
||
# (ZeroDivisionError in data_parallel_controller.py), and --ep-size 2 offers
|
||
# no memory relief (~264/2=132 GiB > 96 GiB per XPU), so TP=2 remains
|
||
# infeasible for this INT8 model on P800 regardless of EP.
|
||
# --ep-size is only passed when DP=1 (official production config TP8/EP8).
|
||
# Override with a space-separated list of comma pairs, e.g.
|
||
# PARALLEL_CONFIGS_STR="8,1" to run only TP=8/DP=1.
|
||
if [[ -n "${PARALLEL_CONFIGS_STR:-}" ]]; then
|
||
declare -a PARALLEL_CONFIGS=()
|
||
for pair in $PARALLEL_CONFIGS_STR; do
|
||
PARALLEL_CONFIGS+=("${pair//,/ }")
|
||
done
|
||
else
|
||
declare -a PARALLEL_CONFIGS=(
|
||
"4 2"
|
||
"8 1"
|
||
)
|
||
fi
|
||
|
||
# SGLang server settings, verified for P800 / DeepSeek-V4-Flash-INT8.
|
||
CONTEXT_LENGTH="${CONTEXT_LENGTH:-65536}"
|
||
MEM_FRACTION_STATIC="${MEM_FRACTION_STATIC:-0.8}"
|
||
|
||
# Official w8a8 parameters (from /workspace/ds_v4/w8a8/run_server.sh).
|
||
# EP_SIZE defaults to TP*DP in start_sglang_docker.sh (8 on this machine);
|
||
# override here only for single-config probes.
|
||
EP_SIZE="${EP_SIZE:-}"
|
||
CHUNKED_PREFILL_SIZE="${CHUNKED_PREFILL_SIZE:-8192}"
|
||
MAX_PREFILL_TOKENS="${MAX_PREFILL_TOKENS:-16384}"
|
||
# EAGLE speculative decoding (official defaults: steps=3, topk=1, draft=4).
|
||
SPEC_NUM_STEPS="${SPEC_NUM_STEPS:-3}"
|
||
SPEC_EAGLE_TOPK="${SPEC_EAGLE_TOPK:-1}"
|
||
SPEC_NUM_DRAFT_TOKENS="${SPEC_NUM_DRAFT_TOKENS:-4}"
|
||
|
||
DOCKER_IMAGE="${DOCKER_IMAGE:-iregistry.baidu-int.com/xpu/sglang-p800-pd-disagg-0510:20260511_4202}"
|
||
|
||
# ShareGPT seed dataset for the random workload. DATASET_PATH is the host
|
||
# copy (also used by the adaptive search for capacity checks); it is mounted
|
||
# into the container at CONTAINER_DATASET_PATH, which is what the benchmark
|
||
# client references. Default matches the H20 experiments; the file is
|
||
# gitignored, download it into /data1/yy/sskj/datasets/ first.
|
||
DATASET_PATH="${DATASET_PATH:-/data1/yy/sskj/datasets/ShareGPT_V3_unfiltered_cleaned_split.json}"
|
||
CONTAINER_DATASET_PATH="${CONTAINER_DATASET_PATH:-/workspace/ShareGPT_V3_unfiltered_cleaned_split.json}"
|
||
|
||
# Matrix and concurrency rules are defined in matrix.json by default.
|
||
MATRIX_FILE="${MATRIX_FILE:-${SCRIPT_DIR:-.}/matrix.json}"
|
||
MATRIX_MODE="${MATRIX_MODE:-Y}"
|
||
|
||
# Sampling density for concurrency (kept for parity with the H20 experiment;
|
||
# generate_scenarios.py currently samples the low/high endpoints only).
|
||
export CONCURRENCY_SAMPLES="${CONCURRENCY_SAMPLES:-2}"
|
||
|
||
# Per-scenario timeout to avoid hangs (seconds).
|
||
SCENARIO_TIMEOUT_S="${SCENARIO_TIMEOUT_S:-1800}"
|
||
|
||
# XPU memory sampling interval (seconds).
|
||
GPU_MEM_SAMPLE_INTERVAL_S="${GPU_MEM_SAMPLE_INTERVAL_S:-1}"
|
||
|
||
# Dry-run mode: if 1, only log the server args and scenario plan without
|
||
# starting any server or sending requests.
|
||
DRY_RUN="${DRY_RUN:-0}"
|
||
|
||
# Per-config scenario limit for quick smoke tests. 0 = run all generated
|
||
# scenarios.
|
||
GRID_LIMIT="${GRID_LIMIT:-0}"
|