Fix replay methodology: trace-driven dispatch, no artificial limits
The replayer was artificially limiting concurrency with --max-inflight-sessions (semaphore) and --time-scale (time compression), producing unrealistically low 1 req/GPU load that masked prefill-decode interference. Replayer changes: - Remove session_sem and time_scale entirely - Each request dispatched at its trace timestamp exactly - Sessions still sequential (turn N+1 waits for turn N completion) - If turn completes late, next turn fires immediately Sampler changes: - Add --sample-ratio for GPU-proportional session sampling - Keep --target-requests for backwards compat - No time compression (preserve original arrival pattern) bench.sh: remove --time-scale and --max-inflight-sessions args Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,9 +30,7 @@ POLICY="linear" # linear | lmetric
|
||||
N_INSTANCES=8
|
||||
BASE_PORT=8000
|
||||
PROXY_PORT=9090
|
||||
REQUESTS=200
|
||||
TIME_SCALE=20
|
||||
MAX_SESSIONS=8
|
||||
REQUESTS="" # empty = all requests in trace
|
||||
HEAVY_THRESHOLD=20000
|
||||
NO_OFFLOAD=false
|
||||
OVERLOAD_FACTOR_ARG=""
|
||||
@@ -46,8 +44,6 @@ while [[ $# -gt 0 ]]; do
|
||||
--policy) POLICY="$2"; shift 2 ;;
|
||||
--instances) N_INSTANCES="$2"; shift 2 ;;
|
||||
--requests) REQUESTS="$2"; shift 2 ;;
|
||||
--time-scale) TIME_SCALE="$2"; shift 2 ;;
|
||||
--sessions) MAX_SESSIONS="$2"; shift 2 ;;
|
||||
--heavy-threshold) HEAVY_THRESHOLD="$2"; shift 2 ;;
|
||||
--no-offload) NO_OFFLOAD=true; shift ;;
|
||||
--overload-factor) OVERLOAD_FACTOR_ARG="$2"; shift 2 ;;
|
||||
@@ -58,6 +54,7 @@ done
|
||||
|
||||
if [ -z "$TAG" ]; then
|
||||
echo "Usage: bench.sh --tag NAME --mode {baseline|elastic} [--instances N] [--policy {linear|lmetric}] [--requests N]"
|
||||
echo " Trace QPS is controlled by sample_trace.py --sample-ratio, not by bench.sh."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -76,9 +73,7 @@ cat > "$OUTDIR/config.json" << CONF
|
||||
"policy": "$POLICY",
|
||||
"model": "$MODEL",
|
||||
"n_instances": $N_INSTANCES,
|
||||
"requests": $REQUESTS,
|
||||
"time_scale": $TIME_SCALE,
|
||||
"max_sessions": $MAX_SESSIONS,
|
||||
"requests": "${REQUESTS:-all}",
|
||||
"heavy_threshold": $HEAVY_THRESHOLD,
|
||||
"no_offload": "$NO_OFFLOAD",
|
||||
"overload_factor": "${OVERLOAD_FACTOR_ARG:-2.0}",
|
||||
@@ -245,7 +240,13 @@ launch_proxy() {
|
||||
# ─── Run benchmark ─────────────────────────────────────────────────────────
|
||||
|
||||
run_benchmark() {
|
||||
echo "[bench] Running $REQUESTS requests (time_scale=$TIME_SCALE, sessions=$MAX_SESSIONS)..."
|
||||
local request_args=""
|
||||
if [ -n "$REQUESTS" ]; then
|
||||
request_args="--request-limit $REQUESTS"
|
||||
echo "[bench] Running $REQUESTS requests (trace-driven timing)..."
|
||||
else
|
||||
echo "[bench] Running all requests in trace (trace-driven timing)..."
|
||||
fi
|
||||
|
||||
# Start GPU monitor in background
|
||||
bash "$PROJECT_DIR/scripts/gpu_monitor.sh" "$OUTDIR/gpu_util.csv" 5 &
|
||||
@@ -256,9 +257,7 @@ run_benchmark() {
|
||||
--output "$OUTDIR/metrics.jsonl" \
|
||||
--endpoint "http://localhost:$PROXY_PORT" \
|
||||
--model "$MODEL" \
|
||||
--time-scale "$TIME_SCALE" \
|
||||
--max-inflight-sessions "$MAX_SESSIONS" \
|
||||
--request-limit "$REQUESTS" \
|
||||
$request_args \
|
||||
-v 2>&1 | tee "$OUTDIR/replayer.log"
|
||||
|
||||
# Stop GPU monitor
|
||||
@@ -324,7 +323,7 @@ print('=' * 70)
|
||||
|
||||
echo "================================================================"
|
||||
echo " bench.sh: $TAG"
|
||||
echo " mode=$MODE policy=$POLICY requests=$REQUESTS overload_factor=${OVERLOAD_FACTOR_ARG:-2.0} max_batched_tokens=${MAX_BATCHED_TOKENS:-default}"
|
||||
echo " mode=$MODE policy=$POLICY requests=${REQUESTS:-all} overload_factor=${OVERLOAD_FACTOR_ARG:-2.0}"
|
||||
echo " $(date)"
|
||||
echo "================================================================"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user