Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
991bd06
refactor(lib): rename dtni -> utils and split out generic config mach…
atnair-amd Jun 19, 2026
c0e7413
refactor(inference): move vllm_parsing into cvs/lib/inference/utils
atnair-amd Jun 19, 2026
19a89ac
feat(inference): inference config schema with named-combo sweep selector
atnair-amd Jun 19, 2026
a7edb01
feat(inference): self-contained server cmd + artifact-based result pa…
atnair-amd Jun 19, 2026
67a67c2
feat(suite): per-metric result rows, Value/Unit columns, sweep selector
atnair-amd Jun 19, 2026
12829bf
chore(config): rename vllm_single config pair, adopt selector, drop c…
atnair-amd Jun 19, 2026
18bf04b
test(inference): unit tests for parser, sweep selector, and verdict g…
atnair-amd Jun 19, 2026
3a9723e
docs: suite-authoring guide + AGENTS.md for shared and inference helpers
atnair-amd Jun 19, 2026
8ddb3e1
docs: expand suite guide with lib restructure, drop redundant section…
atnair-amd Jun 19, 2026
00c9cdc
docs: demote headings so GitHub stops underlining sections
atnair-amd Jun 19, 2026
94d2081
removing old plan
atnair-amd Jun 19, 2026
488e9d8
fix(config): re-key W1 threshold to the swept CONC=16 cell
atnair-amd Jun 19, 2026
11c7948
fix(inference): drop dead server-env exports from build_server_cmd
atnair-amd Jun 19, 2026
c517877
fix(inference): move --kv-cache-dtype out of the driver into config
atnair-amd Jun 19, 2026
bbde541
refactor(inference): share the sweep-selector validator across load a…
atnair-amd Jun 19, 2026
022920e
fix(inference): key the per-cell out_dir by isl/osl/conc
atnair-amd Jun 19, 2026
e63255e
refactor(inference): normalize goodput_slo to dict-only
atnair-amd Jun 19, 2026
6433f86
test(inference): drop unused _fake_variant parameter
atnair-amd Jun 19, 2026
3485e64
chore(inference): placeholder personal/image refs in example config
atnair-amd Jun 19, 2026
cea80da
refactor(inference): server serve_args as a {flag: value} map
atnair-amd Jun 19, 2026
f217c9d
feat(verdict): add unit-agnostic max threshold kind
atnair-amd Jun 19, 2026
f9ab9a0
feat(inference): enforce a declared gated-metric SLO contract
atnair-amd Jun 19, 2026
f332490
fix(inference): single image source on container.image
atnair-amd Jun 19, 2026
a25687b
feat(inference): gate the full latency distribution
atnair-amd Jun 19, 2026
c520181
docs: reflect image collapse, serve_args rename, max kind, GATED_METRICS
atnair-amd Jun 19, 2026
b553fcc
Restore InferenceMax uplift reverted by #228
hnimra-amd Jun 18, 2026
1f1ffdc
fix(inference): run vLLM bench client with vLLM interpreter
hnimra-amd Jun 18, 2026
81cadd3
fix(dtni): broaden vLLM benchmark script discovery
hnimra-amd Jun 18, 2026
abe838c
fix(inference): harden InferenceMax server startup and GPU mem env
hnimra-amd Jun 18, 2026
01c4487
fix(dtni): fall back to vllm bench serve when benchmark script is absent
hnimra-amd Jun 18, 2026
2ac3957
fix(dtni): clamp bench random-range to max_model_length
hnimra-amd Jun 18, 2026
7203562
fix(inference): extend InferenceMax bench client poll budget
hnimra-amd Jun 18, 2026
730b408
feat(inference): add bench_max_failed_requests cap and completion-fir…
hnimra-amd Jun 18, 2026
65b5ec4
feat(inference): add typed InferenceMax config loader (Phase 1)
hnimra-amd Jun 23, 2026
718e066
feat(inference): migrate InferenceMax configs to schema_version 1 (Ph…
hnimra-amd Jun 23, 2026
6062312
test(inference): wire inferencemax_single to typed config and sweep (…
hnimra-amd Jun 23, 2026
26aba03
docs(inference): update InferenceMax config reference for schema_vers…
hnimra-amd Jun 23, 2026
44bb053
docs: fix stale dtni.config_loader references (Phase 1 tail)
hnimra-amd Jun 23, 2026
246250b
feat(inference): rewrite InferenceMaxJob like VllmJob (Phase 3)
hnimra-amd Jun 23, 2026
79969ba
feat(inference): move InferenceMax server flags to roles.server.serve…
hnimra-amd Jun 23, 2026
8bf942d
test(inference): align inferencemax_single suite with VllmJob pattern…
hnimra-amd Jun 23, 2026
17b902f
docs(inference): update InferenceMax reference for Phase 3 driver (Ph…
hnimra-amd Jun 23, 2026
3838d98
chore(inference): remove unused inferencemax_host_scripts (Phase 5)
hnimra-amd Jun 23, 2026
cdeef6a
docs: clarify vllm_benchmark_scripts are legacy-only (Phase 5)
hnimra-amd Jun 23, 2026
ba93dfb
docs(inference): rewrite InferenceMax reference for schema_version 1 …
hnimra-amd Jun 23, 2026
0e39316
test(inference): add InferenceMaxJob parse_results unit test (Phase 5)
hnimra-amd Jun 23, 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
8 changes: 6 additions & 2 deletions cvs/cli_plugins/run_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,12 @@ def get_parser(self, subparsers):
)
parser.add_argument(
"--log-file",
default="/tmp/cvs/test.log",
help="Pytest: Path to file for logging output (default: /tmp/cvs/test.log)",
default=None,
metavar="PATH",
help=(
"Pytest: write logging output to this file (optional). "
"Parent directories are created automatically when set."
),
)
parser.add_argument(
"--log-level",
Expand Down
29 changes: 29 additions & 0 deletions cvs/cli_plugins/unittests/test_run_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,35 @@ def test_run_test_multiple_functions(self, mock_exit, mock_pytest_main):
mock_pytest_main.assert_called_once_with(expected_args)
mock_exit.assert_called_once_with(0)

@patch("cvs.cli_plugins.run_plugin.pytest.main")
@patch("cvs.cli_plugins.run_plugin.sys.exit")
def test_run_test_omits_log_file_when_not_set(self, mock_exit, mock_pytest_main):
"""No --log-file is passed to pytest when the user does not request file logging."""
args = MagicMock()
args.test = "agfhc_cvs"
args.function = []
args.cluster_file = "/path/to/cluster.json"
args.config_file = "/path/to/config.json"
args.html = None
args.self_contained_html = False
args.log_file = None
args.log_level = None
args.capture = None
args.extra_pytest_args = []

mock_pytest_main.return_value = 0

with patch.object(self.plugin, "get_test_file", return_value="/mock/path/test.py"):
self.plugin.run(args)

expected_args = [
"/mock/path/test.py",
"--cluster_file=/path/to/cluster.json",
"--config_file=/path/to/config.json",
]
mock_pytest_main.assert_called_once_with(expected_args)
mock_exit.assert_called_once_with(0)


if __name__ == "__main__":
unittest.main()
33 changes: 0 additions & 33 deletions cvs/input/cluster_file/mi300x_vllm_single.json

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{
"_comment": "Single-node InferenceMax (schema_version 1). Set container.image and container.name. ISL+OSL must fit params.max_model_length. Volume bind home only; ContainerOrchestrator adds /home/<user>:/workspace.",
"schema_version": 1,
"framework": "inferencemax_single",
"gpu_arch": "mi300x",
"enforce_thresholds": false,
"paths": {
"shared_fs": "/home/{user-id}",
"models_dir": "{shared_fs}/models",
"log_dir": "{shared_fs}/LOGS",
"hf_token_file": "{shared_fs}/.hf_token"
},
"model": {
"id": "openai/gpt-oss-120b",
"remote": 0,
"precision": "bf16"
},
"container": {
"lifetime": "per_run",
"name": "<changeme>",
"image": "<changeme>",
"runtime": {
"name": "docker",
"args": {
"network": "host",
"ipc": "host",
"privileged": true,
"shm_size": "128G",
"volumes": [
"/home/{user-id}:/home/{user-id}"
],
"devices": [
"/dev/dri",
"/dev/kfd"
]
}
}
},
"roles": {
"server": {
"serve_args": {
"enforce-eager": true,
"gpu-memory-utilization": "0.95",
"block-size": 64,
"no-enable-prefix-caching": true
},
"env": {
"AMDGCN_USE_BUFFER_OPS": "0",
"VLLM_ROCM_USE_AITER": "1",
"VLLM_ROCM_QUICK_REDUCE_QUANTIZATION": "INT4"
}
}
},
"params": {
"backend": "vllm",
"base_url": "http://0.0.0.0",
"port_no": "8000",
"dataset_name": "random",
"burstiness": "1.0",
"seed": "0",
"request_rate": "inf",
"random_range_ratio": "0.8",
"random_prefix_len": "0",
"tensor_parallelism": "8",
"tokenizer_mode": "auto",
"percentile_metrics": "ttft,tpot,itl,e2el",
"metric_percentiles": "99",
"num_prompts": "1000",
"max_model_length": "8192",
"client_poll_count": "50",
"client_poll_wait_time": "60",
"bench_max_failed_requests": "0"
},
"sweep": {
"sequence_combinations": [
{
"name": "legacy_profile",
"isl": "7168",
"osl": "1024"
}
],
"runs": [
{
"combo": "legacy_profile",
"concurrency": 64
}
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
{
"_comment": "client.* thresholds for ISL=7168,OSL=1024,TP=8,CONC=64. Every GATED_METRICS member has a spec so the loader coverage check passes. config.json sets enforce_thresholds=false until calibrated; output_throughput/mean_ttft_ms/mean_tpot_ms carry legacy verify_inference_results targets.",
"ISL=7168,OSL=1024,TP=8,CONC=64": {
"client.total_token_throughput": {
"kind": "min_tok_s",
"value": 0
},
"client.output_throughput": {
"kind": "min_tok_s",
"value": 4200
},
"client.mean_ttft_ms": {
"kind": "max_ms",
"value": 500
},
"client.median_ttft_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p90_ttft_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p95_ttft_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p99_ttft_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.mean_tpot_ms": {
"kind": "max_ms",
"value": 15
},
"client.median_tpot_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p90_tpot_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p95_tpot_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p99_tpot_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.mean_itl_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.median_itl_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p95_itl_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p99_itl_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.mean_e2el_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.median_e2el_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p90_e2el_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p95_e2el_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.p99_e2el_ms": {
"kind": "max_ms",
"value": 1000000
},
"client.success_rate": {
"kind": "min",
"value": 0
},
"client.failed": {
"kind": "max",
"value": 1000000000
}
}
}
Loading