Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c3eb20c
test(scaling): add deterministic controller simulation baselines
thxCode Oct 27, 2026
648ab8a
feat(scaling): add validated offline capacity prior catalogs
thxCode Oct 27, 2026
b19fcdf
feat(scaling): resolve catalog priors in model deployment scalers
thxCode Oct 27, 2026
7ce6800
test(scaling): evaluate frozen capacity estimation candidates
thxCode Oct 27, 2026
0c21a30
test(scaling): add reproducible capacity comparison rounds
thxCode Oct 27, 2026
858020b
docs(scaling): document offline capacity priors and local evaluation
thxCode Oct 27, 2026
1244335
fix(worker): use observed 140Gi device memory for nvidia-h200 prior i…
thxCode Oct 27, 2026
71bde22
docs(worker): publish H200 scaling capacity-prior qualification bench…
thxCode Oct 27, 2026
d1d029e
docs(scaling): add feedback-sensitivity and capacity-prior trend char…
thxCode Oct 28, 2026
844e842
docs(scaling): add explicit plotColorPalette and color legends to xyc…
thxCode Oct 28, 2026
90d7a59
docs(scaling): add algorithm selection and tuning guidance from H100/…
thxCode Oct 28, 2026
3e3d8bf
feat(worker): define ModelDeploymentScalerCapacityPriorCatalog and su…
thxCode Oct 28, 2026
c547024
docs(scaling): remove hex color codes from xychart-beta x-axis labels
thxCode Oct 28, 2026
77a61e4
docs(scaling): polish capacity prior and benchmark documentation wording
thxCode Oct 28, 2026
a9896df
fixup! test(scaling): add deterministic controller simulation baselines
thxCode Oct 28, 2026
e1b7ae1
fixup! feat(scaling): add validated offline capacity prior catalogs
thxCode Oct 28, 2026
0820c1e
fixup! feat(scaling): resolve catalog priors in model deployment scalers
thxCode Oct 28, 2026
819018d
fixup! test(scaling): add reproducible capacity comparison rounds
thxCode Oct 28, 2026
b724758
fixup! feat(worker): define ModelDeploymentScalerCapacityPriorCatalog…
thxCode Oct 28, 2026
a14c189
fixup! test(scaling): add deterministic controller simulation baselines
thxCode Oct 28, 2026
7f29178
fixup! feat(scaling): add validated offline capacity prior catalogs
thxCode Oct 28, 2026
a1d44b4
fixup! feat(scaling): resolve catalog priors in model deployment scalers
thxCode Oct 28, 2026
1452232
fixup! feat(worker): define ModelDeploymentScalerCapacityPriorCatalog…
thxCode Oct 28, 2026
9536857
fixup! docs(scaling): polish capacity prior and benchmark documentati…
thxCode Oct 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#!/usr/bin/env bash
#
# CASE 5 — ModelDeployment autoscaling benchmark, two waves over 8 GPUs (MUTATING, self-recovering)
# CASE 5: capacity comparison or legacy topology benchmark (mutating).
# Capacity comparison: --capacity-comparison --config FILE --out DIR --validate-only|--execute
# The description below applies to the legacy topology mode.
#
# case-5-autoscaling.sh [OUT_DIR] [--parallel|--serial] [--arm <arm-name>]
#
Expand Down Expand Up @@ -56,6 +58,13 @@
set -uo pipefail

CASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [[ "${1:-}" == "--capacity-comparison" ]]; then
shift
exec bash "${CASE_DIR}/../scripts/autoscaling_rounds.sh" "$@"
fi
if [[ "${1:-}" == "--legacy-topology" ]]; then
shift
fi
SKILL_DIR="$(cd "${CASE_DIR}/.." && pwd)"
REPO="$(cd "${SKILL_DIR}/../../.." && pwd)"
export PATH="${REPO}/.agents/skills/_e2e-lib/scripts/kubectl-shim:${PATH}"
Expand Down Expand Up @@ -174,7 +183,22 @@ arm_kind() {
arm_roles() {
case "$1" in
vllm-epd-predictive)
cat <<'ROLES'
local cap
cap="$(kubectl get instancetype.worker.gpustack.ai -o jsonpath='{.items[?(@.spec.acceleratable==true)].status.accelerator.capacity}' 2>/dev/null | awk '{print $1}')"
if [ "${cap:-8}" -lt 6 ] 2>/dev/null; then
cat <<'ROLES'
- name: encode
minReplicas: 1
maxReplicas: 1
- name: prefill
minReplicas: 1
maxReplicas: 2
- name: decode
minReplicas: 1
maxReplicas: 1
ROLES
else
cat <<'ROLES'
- name: encode
minReplicas: 1
maxReplicas: 2
Expand All @@ -185,6 +209,7 @@ arm_roles() {
minReplicas: 1
maxReplicas: 2
ROLES
fi
;;
*)
cat <<'ROLES'
Expand Down Expand Up @@ -349,7 +374,14 @@ deploy_arm() { # <manifest> <deploy>
# in the file is rewritten on the way in, because kubectl refuses an object whose namespace
# differs from the one it was told to use.
apply_manifest() { # <manifest>
sed "s/^ namespace: gpustack-bench$/ namespace: ${NS}/" "${SKILL_DIR}/manifests/$1" | kubectl apply -f - >/dev/null 2>&1
local inst_type="${BENCH_QUAL_INSTANCE_TYPE:-bench-gpu}"
if ! kubectl get instancetype.worker.gpustack.ai "$inst_type" >/dev/null 2>&1; then
inst_type="$(kubectl get instancetype.worker.gpustack.ai -o jsonpath='{.items[?(@.spec.acceleratable==true)].metadata.name}' 2>/dev/null | awk '{print $1}')"
inst_type="${inst_type:-bench-gpu}"
fi
sed -e "s/^ namespace: gpustack-bench$/ namespace: ${NS}/" \
-e "s/^ instanceType: bench-gpu$/ instanceType: ${inst_type}/" \
"${SKILL_DIR}/manifests/$1" | kubectl apply -f - >/dev/null 2>&1
}

drop_arm() { # <deploy> [scaler]
Expand Down Expand Up @@ -750,7 +782,7 @@ write_summary() {
# above it, because a summary that cannot see a broken case is not a summary of the run.
write_summary_md() {
{
echo "# Autoscaling benchmark"
echo "# Autoscaling benchmark: legacy topology"
echo
echo "Generated at $(date -u +%Y-%m-%dT%H:%M:%SZ), mode ${MODE}."
echo
Expand Down Expand Up @@ -853,7 +885,7 @@ jq -n \
jq -c --arg arm "$arm" '{key: $arm, value: .}' "${OUT_BASE}/${arm}/summary.json" 2>/dev/null
fi
done | jq -s 'from_entries' 2>/dev/null || echo '{}')" \
'{generated_at: $generated_at, mode: $mode, e2e: {case128: $case128, case129: $case129}, arms: $arms}' \
'{comparisonKind: "legacy-topology", generated_at: $generated_at, mode: $mode, e2e: {case128: $case128, case129: $case129}, arms: $arms}' \
> "${OUT_BASE}/comparison.json"

# The summary a reader opens first: one row per arm and phase, and the exit code of each E2E
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
# Hardware qualification for the ModelDeployment scaling chain on the 8x NVIDIA H200 SXM node.
# Modes: --prepare, or --suite {sweep,capacity-arms,sim-sensitivity,builtin-catalog,pd-epd};
# every case is bounded and dumps failure_summary.json when it fails or overruns.
set -euo pipefail
CASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SKILL_DIR="$(cd "${CASE_DIR}/.." && pwd)"
REPO="$(cd "${SKILL_DIR}/../../.." && pwd)"
export PATH="${REPO}/.agents/skills/_e2e-lib/scripts/kubectl-shim:${PATH}"
export BENCH_INCLUSTER=1
exec python3 -B "${SKILL_DIR}/scripts/autoscaling_qualification.py" "$@"
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"schemaVersion": "1",
"context": "REPLACE_WITH_EXPLICIT_CONTEXT",
"namespace": "capacity-comparison",
"namePrefix": "capacity",
"deploymentFile": "qualified-deployment.json",
"scalerFiles": {
"frozen-manual": "qualified-frozen-scaler.json",
"tuned-manual": "qualified-tuned-scaler.json",
"catalog": "qualified-catalog-scaler.json"
},
"catalogFile": "qualified-local-catalog-configmap.json",
"fitRunIDs": ["REPLACE_WITH_OFFLINE_FIT_RUN_ID"],
"evaluationTraceID": "REPLACE_WITH_SEPARATE_EVALUATION_ID",
"clusterQueues": ["REPLACE_WITH_DEDICATED_CLUSTER_QUEUE"],
"repeats": 3,
"order": "alternating",
"seed": 71,
"startCondition": "operator-declared-warm-cache/fresh-pods",
"driver": {
"namespace": "benchmark-driver",
"pod": "bench-driver",
"container": "driver"
},
"workload": {
"model": "REPLACE_WITH_QUALIFIED_MODEL",
"inputTokens": 512,
"outputTokens": 64,
"tokenOffset": 0,
"requestTimeoutSeconds": 60,
"phases": [
{"name": "ramp", "durationSeconds": 60, "concurrency": 4},
{"name": "sustain", "durationSeconds": 120, "concurrency": 8},
{"name": "cooldown", "durationSeconds": 600, "concurrency": 0}
]
},
"sampleIntervalSeconds": 2,
"operationTimeoutSeconds": 30,
"readinessTimeoutSeconds": 600,
"cleanupTimeoutSeconds": 300,
"startupAllowanceSeconds": 120,
"retirementAllowanceSeconds": 120
}
Loading
Loading