diff --git a/benchmarks/diffusion/diffusion_benchmark_serving.py b/benchmarks/diffusion/diffusion_benchmark_serving.py index 878159b81..bf08b8c2b 100644 --- a/benchmarks/diffusion/diffusion_benchmark_serving.py +++ b/benchmarks/diffusion/diffusion_benchmark_serving.py @@ -107,6 +107,9 @@ from tqdm.asyncio import tqdm logger = logging.getLogger(__name__) +_STAGE_METRICS_ENDPOINTS = {"/v1/chat/completions"} +_RETURN_STAGE_METRICS_FIELD = "return_stage_metrics" + class BaseDataset(ABC): def __init__(self, args, api_url: str, model: str): @@ -1163,6 +1166,10 @@ async def benchmark(args): requests_list = dataset.get_requests() print(f"Prepared {len(requests_list)} requests from {args.dataset} dataset.") + if args.return_stage_metrics and args.endpoint in _STAGE_METRICS_ENDPOINTS: + for req in requests_list: + req.extra_body.setdefault(_RETURN_STAGE_METRICS_FIELD, True) + if args.endpoint == "/v1/images/edits": for req in requests_list: req.default_bot_task = args.bot_task @@ -1443,6 +1450,11 @@ if __name__ == "__main__": default="think", help=("bot_task form field for --endpoint /v1/images/edits (think, recaption, think_recaption, vanilla)."), ) + parser.add_argument( + "--return-stage-metrics", + action="store_true", + help="Request stage duration metrics from endpoints that support return_stage_metrics.", + ) args = parser.parse_args() asyncio.run(benchmark(args)) diff --git a/tests/dfx/perf/scripts/run_diffusion_benchmark.py b/tests/dfx/perf/scripts/run_diffusion_benchmark.py index 62ce59606..98462743d 100644 --- a/tests/dfx/perf/scripts/run_diffusion_benchmark.py +++ b/tests/dfx/perf/scripts/run_diffusion_benchmark.py @@ -556,6 +556,10 @@ def benchmark_params(request, diffusion_server): # --------------------------------------------------------------------------- +_STAGE_METRICS_ENDPOINTS = {"/v1/chat/completions"} +_DIFFUSION_PIPELINE_PROFILER_ARG = "enable-diffusion-pipeline-profiler" + + def run_benchmark( host: str, port: int, @@ -608,6 +612,11 @@ def run_benchmark( str(tmp_result_file), ] + serve_args_dict = (server_cfg or {}).get("serve_args_dict") + profiler_enabled = isinstance(serve_args_dict, dict) and bool(serve_args_dict.get(_DIFFUSION_PIPELINE_PROFILER_ARG)) + if endpoint in _STAGE_METRICS_ENDPOINTS and profiler_enabled: + cmd.append("--return-stage-metrics") + for key, value in params.items(): if key in exclude_keys or value is None: continue