171 lines
4.9 KiB
Bash
Executable File
171 lines
4.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Real Ali workload sweep for KVC pd-hybrid.
|
|
#
|
|
# This script expects a prebuilt sample trace and replays it exactly for every
|
|
# mechanism. It intentionally keeps pool polling disabled for performance runs.
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "$REPO_ROOT"
|
|
|
|
MODEL=${MODEL:-/home/admin/cpfs/wjh/models/Qwen/Qwen3-Coder-30B-A3B-Instruct}
|
|
TRACE=${TRACE:-outputs/real-ali-kvc-iter/samples-balanced/ali-kvc-fit-smallappend.jsonl}
|
|
OUT_ROOT=${OUT_ROOT:-outputs/real-ali-kvc-iter/runs}
|
|
TIME_SCALE=${TIME_SCALE:-1}
|
|
CONCURRENCY=${CONCURRENCY:-32}
|
|
REQUEST_TIMEOUT_S=${REQUEST_TIMEOUT_S:-300}
|
|
STACK_TIMEOUT_S=${STACK_TIMEOUT_S:-1200}
|
|
RUNS=${RUNS:-"dp kvc_bp"}
|
|
EXTRA_SERVER_ARGS=${EXTRA_SERVER_ARGS:-}
|
|
PREFILL_EXTRA_SERVER_ARGS=${PREFILL_EXTRA_SERVER_ARGS:-}
|
|
DECODE_EXTRA_SERVER_ARGS=${DECODE_EXTRA_SERVER_ARGS:-}
|
|
KVC_SEED_MIN_TURN_ID=${KVC_SEED_MIN_TURN_ID:-1}
|
|
KVC_SEED_ONLY_MULTITURN=${KVC_SEED_ONLY_MULTITURN:-0}
|
|
|
|
mkdir -p "$OUT_ROOT"
|
|
LOG="$OUT_ROOT/sweep.log"
|
|
|
|
log() {
|
|
echo "[$(date '+%F %T')] $*" | tee -a "$LOG"
|
|
}
|
|
|
|
common_args=(
|
|
--trace "$TRACE"
|
|
--model-path "$MODEL"
|
|
--output-root "$OUT_ROOT"
|
|
--use-trace-as-sample
|
|
--time-scale "$TIME_SCALE"
|
|
--concurrency-limit "$CONCURRENCY"
|
|
--timeout-s "$STACK_TIMEOUT_S"
|
|
--request-timeout-s "$REQUEST_TIMEOUT_S"
|
|
)
|
|
if [[ -n "$EXTRA_SERVER_ARGS" ]]; then
|
|
common_args+=(--extra-server-args "$EXTRA_SERVER_ARGS")
|
|
fi
|
|
if [[ -n "$PREFILL_EXTRA_SERVER_ARGS" ]]; then
|
|
common_args+=(--prefill-extra-server-args "$PREFILL_EXTRA_SERVER_ARGS")
|
|
fi
|
|
if [[ -n "$DECODE_EXTRA_SERVER_ARGS" ]]; then
|
|
common_args+=(--decode-extra-server-args "$DECODE_EXTRA_SERVER_ARGS")
|
|
fi
|
|
|
|
kvc_args=(
|
|
"${common_args[@]}"
|
|
--mechanism kvcache-centric
|
|
--policy kv-aware
|
|
--prefill-workers 2
|
|
--decode-workers 6
|
|
--prefill-tp-size 1
|
|
--decode-tp-size 1
|
|
--prefill-gpu-ids 0,1
|
|
--decode-gpu-ids 2,3,4,5,6,7
|
|
--transfer-backend mooncake
|
|
--gpu-budget 8
|
|
--kvcache-admission-mode worker
|
|
--kvcache-seed-min-turn-id "$KVC_SEED_MIN_TURN_ID"
|
|
--kvcache-seed-max-inflight-decode -1
|
|
--kvcache-prefill-backup-policy release-after-transfer
|
|
--kvcache-prefill-priority-eviction
|
|
)
|
|
if [[ "$KVC_SEED_ONLY_MULTITURN" == "1" ]]; then
|
|
kvc_args+=(--kvcache-seed-only-multiturn-sessions)
|
|
fi
|
|
|
|
run_dp() {
|
|
log "=== DP cache-aware baseline: 8 direct workers ==="
|
|
uv run agentic-pd-hybrid benchmark-live \
|
|
"${common_args[@]}" \
|
|
--mechanism pd-colo \
|
|
--policy kv-aware \
|
|
--prefill-workers 0 \
|
|
--decode-workers 0 \
|
|
--direct-workers 8 \
|
|
--direct-tp-size 1 \
|
|
--direct-gpu-ids 0,1,2,3,4,5,6,7 \
|
|
--gpu-budget 8
|
|
}
|
|
|
|
run_pd_disagg() {
|
|
log "=== PD-disaggregation baseline: 2P6D ==="
|
|
uv run agentic-pd-hybrid benchmark-live \
|
|
"${common_args[@]}" \
|
|
--mechanism pd-disaggregation \
|
|
--policy kv-aware \
|
|
--prefill-workers 2 \
|
|
--decode-workers 6 \
|
|
--prefill-tp-size 1 \
|
|
--decode-tp-size 1 \
|
|
--prefill-gpu-ids 0,1 \
|
|
--decode-gpu-ids 2,3,4,5,6,7 \
|
|
--transfer-backend mooncake \
|
|
--gpu-budget 8
|
|
}
|
|
|
|
run_pd_sticky() {
|
|
log "=== PD-disaggregation sticky baseline: 2P6D ==="
|
|
uv run agentic-pd-hybrid benchmark-live \
|
|
"${common_args[@]}" \
|
|
--mechanism pd-disaggregation \
|
|
--policy sticky \
|
|
--prefill-workers 2 \
|
|
--decode-workers 6 \
|
|
--prefill-tp-size 1 \
|
|
--decode-tp-size 1 \
|
|
--prefill-gpu-ids 0,1 \
|
|
--decode-gpu-ids 2,3,4,5,6,7 \
|
|
--transfer-backend mooncake \
|
|
--gpu-budget 8
|
|
}
|
|
|
|
run_kvc() {
|
|
log "=== KVC baseline: 2P6D worker admission, no backpressure ==="
|
|
uv run agentic-pd-hybrid benchmark-live "${kvc_args[@]}"
|
|
}
|
|
|
|
run_kvc_bp() {
|
|
log "=== KVC candidate: 2P6D worker admission + backpressure ==="
|
|
uv run agentic-pd-hybrid benchmark-live \
|
|
"${kvc_args[@]}" \
|
|
--enable-backpressure \
|
|
--backpressure-max-pause-s 2.0
|
|
}
|
|
|
|
summarize_latest() {
|
|
log "=== Latest summaries ==="
|
|
find "$OUT_ROOT" -maxdepth 2 -name 'request-metrics.jsonl.summary.json' -print \
|
|
| sort \
|
|
| while read -r summary; do
|
|
python - "$summary" <<'PY'
|
|
import json, sys
|
|
p=sys.argv[1]
|
|
d=json.load(open(p))
|
|
lat=d.get("latency_stats_s") or {}
|
|
tt=d.get("ttft_stats_s") or {}
|
|
em=d.get("execution_modes") or {}
|
|
print(p)
|
|
print(" reqs", d.get("request_count"), "errors", d.get("error_count"), "trunc", d.get("truncated_request_count"))
|
|
print(" lat mean/p50/p90/p99", lat.get("mean"), lat.get("p50"), lat.get("p90"), lat.get("p99"))
|
|
print(" ttft mean/p50/p90", tt.get("mean"), tt.get("p50"), tt.get("p90"))
|
|
print(" modes", em)
|
|
PY
|
|
done | tee -a "$LOG"
|
|
}
|
|
|
|
log "Trace: $TRACE"
|
|
log "Model: $MODEL"
|
|
log "Runs: $RUNS | time-scale=$TIME_SCALE concurrency=$CONCURRENCY | kvc-seed-min-turn-id=$KVC_SEED_MIN_TURN_ID | kvc-seed-only-multiturn=$KVC_SEED_ONLY_MULTITURN"
|
|
|
|
for run in $RUNS; do
|
|
case "$run" in
|
|
dp) run_dp ;;
|
|
pd) run_pd_disagg ;;
|
|
pd_sticky) run_pd_sticky ;;
|
|
kvc) run_kvc ;;
|
|
kvc_bp) run_kvc_bp ;;
|
|
*) log "Unknown run name: $run"; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
summarize_latest
|
|
log "DONE"
|