Skip to content

Commit 10c1a00

Browse files
committed
add remaning fork functionality
1 parent ea08df7 commit 10c1a00

9 files changed

Lines changed: 378 additions & 39 deletions

File tree

conf/experimental/ai_dynamo/test/vllm.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,16 @@ workloads = "aiperf.sh"
7474
concurrency = 2
7575

7676
[cmd_args.aiperf]
77+
health-check-between-phases = true
78+
continue-on-phase-failure = false
7779
[cmd_args.aiperf.args]
7880
concurrency = 2
81+
endpoint-type = "chat"
7982
extra-inputs = '{"min_tokens":10}'
8083
output-tokens-mean = 500
8184
request-count = 50
85+
server-metrics = "auto"
86+
streaming = true
8287
synthetic-input-tokens-mean = 300
8388

8489
[[cmd_args.aiperf_phases]]
@@ -94,6 +99,7 @@ workloads = "aiperf.sh"
9499
[cmd_args.aiperf_phases.args]
95100
concurrency = 4
96101
request-count = 50
102+
streaming = false
97103

98104
[cmd_args.aiperf_accuracy]
99105
entrypoint = "aiperf profile"

conf/experimental/ai_dynamo/test_scenario/vllm_lmcache.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ description = "Self-contained AIDynamo scenario wiring vLLM disaggregated infere
2424
test_template_name = "AIDynamo"
2525
time_limit = "00:10:00"
2626
extra_container_mounts = ["/run/udev:/run/udev"]
27-
dse_excluded_args = ["cmd_args.lmcache.lmcache_worker_ports", "cmd_args.aiperf_phases"]
27+
dse_excluded_args = [
28+
"cmd_args.lmcache.lmcache_worker_ports",
29+
"cmd_args.aiperf_phases",
30+
]
2831

2932
[Tests.cmd_args]
3033
docker_image_url = "nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.1.1"

conf/experimental/ai_dynamo/test_scenario/vllm_slurm.toml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,28 @@ time_limit = "00:10:00"
3636
tensor-parallel-size = 4
3737
pipeline-parallel-size = 1
3838

39+
[[Tests.cmd_args.aiperf_phases]]
40+
name = "round_1"
41+
[Tests.cmd_args.aiperf_phases.args]
42+
concurrency = 2
43+
request-count = 50
44+
server-metrics = "auto"
45+
46+
[[Tests.cmd_args.aiperf_phases]]
47+
name = "round_2"
48+
[Tests.cmd_args.aiperf_phases.args]
49+
concurrency = 4
50+
request-count = 50
51+
3952
[[Tests]]
4053
id = "test.disagg.multinode"
4154
test_name = "vLLM"
4255
time_limit = "00:10:00"
4356

4457
[Tests.cmd_args]
58+
[Tests.cmd_args.dynamo.dcgm_exporter]
59+
enabled = true
60+
4561
[Tests.cmd_args.dynamo.prefill_worker]
4662
num-nodes = 2
4763
[Tests.cmd_args.dynamo.prefill_worker.args]
@@ -53,3 +69,17 @@ time_limit = "00:10:00"
5369
[Tests.cmd_args.dynamo.decode_worker.args]
5470
tensor-parallel-size = 4
5571
pipeline-parallel-size = 1
72+
73+
[[Tests.cmd_args.aiperf_phases]]
74+
name = "round_1"
75+
[Tests.cmd_args.aiperf_phases.args]
76+
concurrency = 4
77+
request-count = 50
78+
server-metrics = "auto"
79+
80+
[[Tests.cmd_args.aiperf_phases]]
81+
name = "round_2"
82+
[Tests.cmd_args.aiperf_phases.args]
83+
concurrency = 8
84+
request-count = 50
85+
server-metrics = "auto"

src/cloudai/workloads/ai_dynamo/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
AIPerf,
2424
AIPerfAccuracy,
2525
AIPerfPhase,
26+
DCGMExporter,
2627
GenAIPerf,
2728
LMCacheController,
2829
WorkerBaseArgs,
@@ -44,6 +45,7 @@
4445
"AIPerf",
4546
"AIPerfAccuracy",
4647
"AIPerfPhase",
48+
"DCGMExporter",
4749
"GenAIPerf",
4850
"LMCacheController",
4951
"WorkerBaseArgs",

src/cloudai/workloads/ai_dynamo/ai_dynamo.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ class WorkerConfig(BaseModel):
140140
)
141141

142142

143+
class DCGMExporter(BaseModel):
144+
"""Optional DCGM exporter launch configuration."""
145+
146+
model_config = ConfigDict(extra="forbid", populate_by_name=True)
147+
148+
enabled: bool = False
149+
image_url: str = Field(
150+
default="nvcr.io/nvidia/k8s/dcgm-exporter:4.5.2-4.8.1-distroless",
151+
serialization_alias="image-url",
152+
validation_alias=AliasChoices("image-url", "image_url"),
153+
)
154+
port: int = 9401
155+
156+
143157
class AIDynamoArgs(BaseModel):
144158
"""Arguments for AI Dynamo setup."""
145159

@@ -205,6 +219,7 @@ def validate_connector(cls, v: str | list[str] | None) -> str | list[str] | None
205219
serialization_alias="nats-port",
206220
validation_alias=AliasChoices("nats-port", "nats_port"),
207221
)
222+
dcgm_exporter: DCGMExporter = Field(default_factory=DCGMExporter)
208223

209224
decode_worker: WorkerConfig = WorkerConfig(
210225
cmd="python3 -m dynamo.vllm",
@@ -269,6 +284,16 @@ class AIPerf(Workload):
269284
serialization_alias="artifact-dir-name",
270285
validation_alias=AliasChoices("artifact-dir-name", "artifact_dir_name"),
271286
)
287+
health_check_between_phases: bool = Field(
288+
default=True,
289+
serialization_alias="health-check-between-phases",
290+
validation_alias=AliasChoices("health-check-between-phases", "health_check_between_phases"),
291+
)
292+
continue_on_phase_failure: bool = Field(
293+
default=False,
294+
serialization_alias="continue-on-phase-failure",
295+
validation_alias=AliasChoices("continue-on-phase-failure", "continue_on_phase_failure"),
296+
)
272297

273298
@property
274299
def installables(self) -> list[Installable]:

src/cloudai/workloads/ai_dynamo/ai_dynamo.sh

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ dynamo_args["worker-error-pattern"]="zmq.error.ZMQError:.Address.already.in.use|
6060
dynamo_args["sgl-http-port"]=9001
6161
dynamo_args["prefill-port"]=30011
6262
dynamo_args["decode-port"]=30021
63+
dynamo_args["dcgm-exporter-enabled"]="False"
64+
dynamo_args["dcgm-exporter-port"]=9401
6365

6466
function log()
6567
{
@@ -892,6 +894,38 @@ _query_frontend() {
892894
curl -s -X POST "${dynamo_args["url"]}/v1/chat/completions" -H "Content-Type: application/json" -d @$RESULTS_DIR/curl_cmd.json
893895
}
894896

897+
_resolve_aiperf_server_metrics_urls() {
898+
local urls="http://${dynamo_args["frontend-node"]}:${dynamo_args["port"]}/metrics"
899+
local base_system_port=${DYN_SYSTEM_PORT:-9090}
900+
local decode_workers_per_node=${decode_config["workers-per-node"]:-1}
901+
local prefill_workers_per_node=${prefill_config["workers-per-node"]:-1}
902+
local IFS_SAVE="$IFS"
903+
local node i
904+
905+
IFS=','
906+
for node in ${prefill_config["node-list"]:-}; do
907+
for i in $(seq 0 $(( prefill_workers_per_node - 1 ))); do
908+
urls="${urls},http://${node}:$((base_system_port + i))/metrics"
909+
done
910+
done
911+
912+
for node in ${decode_config["node-list"]:-}; do
913+
for i in $(seq 0 $(( decode_workers_per_node - 1 ))); do
914+
urls="${urls},http://${node}:$((base_system_port + i))/metrics"
915+
done
916+
done
917+
918+
if [[ "${dynamo_args["dcgm-exporter-enabled"]}" == "True" || "${dynamo_args["dcgm-exporter-enabled"]}" == "true" ]]; then
919+
for node in ${decode_config["node-list"]:-},${prefill_config["node-list"]:-}; do
920+
[[ -z "$node" ]] && continue
921+
urls="${urls},http://${node}:${dynamo_args["dcgm-exporter-port"]}/metrics"
922+
done
923+
fi
924+
IFS="$IFS_SAVE"
925+
926+
echo "$urls"
927+
}
928+
895929
function setup_cufile()
896930
{
897931
export CUFILE_ENV_PATH_JSON="$RESULTS_DIR/cufile.json"
@@ -1059,6 +1093,10 @@ function launch_workload()
10591093
local workload_name="${workload_config_ref["--name"]}"
10601094
local script="${workload_config_ref["--script"]}"
10611095
export FRONTEND_URL="${dynamo_args["url"]}"
1096+
export AIPERF_MODEL="${dynamo_args["model"]}"
1097+
export AIPERF_ENDPOINT="${dynamo_args["endpoint"]}"
1098+
export AIPERF_FAILURE_MARKER="${FATAL_ERROR_MARKER}"
1099+
export AIPERF_SERVER_METRICS_URLS="$(_resolve_aiperf_server_metrics_urls)"
10621100

10631101
# Build config and workload args as proper bash arrays to preserve
10641102
# multi-word values (e.g. --cmd "genai-perf profile") through word splitting.

0 commit comments

Comments
 (0)