Skip to content

Commit f2f1005

Browse files
Adding and supporting loadgen server scenario to mlflow
1 parent 58f2095 commit f2f1005

File tree

1 file changed

+36
-6
lines changed

1 file changed

+36
-6
lines changed

harness/mlflow_tools/mlflow_client.py

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
254254
Dictionary of metric names to values
255255
"""
256256
metrics = {}
257+
scenario = None # Will be detected from file
257258

258259
try:
259260
with open(summary_file, 'r') as f:
@@ -267,6 +268,13 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
267268
orig_line = line # Keep original for debugging
268269
line = line.strip()
269270

271+
# Detect scenario early from "Scenario : Server" or "Scenario : Offline"
272+
if scenario is None and 'Scenario :' in line:
273+
scenario_str = line.split(':', 1)[1].strip() if ':' in line else ''
274+
scenario = 'Server' if 'Server' in scenario_str else 'Offline'
275+
metrics['loadgen_scenario_server'] = 1.0 if scenario == 'Server' else 0.0
276+
self.logger.info(f"Detected scenario from summary file: {scenario}")
277+
270278
# Check for section headers - they appear before separator lines
271279
if 'Additional Stats' in line:
272280
in_additional_stats = True
@@ -297,7 +305,12 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
297305
if len(parts) == 2:
298306
try:
299307
value = float(parts[1].strip())
300-
metrics['loadgen_samples_per_second'] = value
308+
# Store both specific and generic names
309+
if 'completed' in line.lower():
310+
metrics['loadgen_completed_samples_per_second'] = value
311+
metrics['loadgen_samples_per_second'] = value # Generic alias
312+
else:
313+
metrics['loadgen_samples_per_second'] = value
301314
except ValueError:
302315
pass
303316

@@ -308,11 +321,16 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
308321
if len(parts) == 2:
309322
try:
310323
value = float(parts[1].strip())
311-
metrics['loadgen_tokens_per_second'] = value
324+
# Store both specific and generic names
325+
if 'completed' in line.lower():
326+
metrics['loadgen_completed_tokens_per_second'] = value
327+
metrics['loadgen_tokens_per_second'] = value # Generic alias
328+
else:
329+
metrics['loadgen_tokens_per_second'] = value
312330
except ValueError:
313331
pass
314332

315-
# Extract Scheduled samples per second (Server scenario) - in Additional Stats
333+
# Extract Scheduled samples per second (Server scenario only) - in Additional Stats
316334
if in_additional_stats and 'Scheduled samples per second' in line:
317335
parts = line.split(':', 1)
318336
if len(parts) == 2:
@@ -323,6 +341,7 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
323341
pass
324342

325343
# Extract latency metrics (Additional Stats section)
344+
# Note: Server scenario also has "Completed tokens per second" repeated here
326345
if in_additional_stats:
327346
# Min/Max/Mean latency
328347
if 'Min latency (ns)' in line and ':' in line:
@@ -376,7 +395,8 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
376395
except ValueError:
377396
pass
378397

379-
# First Token latency metrics (Server scenario)
398+
# First Token latency metrics (Server scenario only)
399+
# These only appear in Server scenario summaries
380400
if 'Min First Token latency (ns)' in line and ':' in line:
381401
parts = line.split(':', 1)
382402
if len(parts) == 2:
@@ -428,7 +448,8 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
428448
except ValueError:
429449
pass
430450

431-
# Time to Output Token metrics (Server scenario)
451+
# Time to Output Token metrics (Server scenario only)
452+
# These only appear in Server scenario summaries
432453
if 'Min Time to Output Token (ns)' in line and ':' in line:
433454
parts = line.split(':', 1)
434455
if len(parts) == 2:
@@ -517,8 +538,17 @@ def _extract_loadgen_metrics(self, summary_file: Path) -> Dict[str, float]:
517538
except (ValueError, IndexError):
518539
pass
519540

541+
# Log scenario-specific metrics summary
520542
if metrics:
521-
self.logger.info(f"Extracted {len(metrics)} LoadGen metrics from summary file")
543+
scenario_detected = scenario or "Unknown"
544+
# Count Server-specific metrics
545+
server_metrics = [k for k in metrics.keys() if any(term in k.lower() for term in ['ttft', 'tpot', 'scheduled', 'completed_samples', 'completed_tokens'])]
546+
self.logger.info(f"Extracted {len(metrics)} LoadGen metrics from summary file (Scenario: {scenario_detected})")
547+
if server_metrics and scenario_detected == 'Server':
548+
self.logger.info(f"Server-specific metrics found: {len(server_metrics)} metrics including TTFT, TPOT, Scheduled, and Completed throughput")
549+
# List key Server metrics
550+
key_server_metrics = [k for k in server_metrics if any(term in k for term in ['ttft', 'tpot', 'scheduled', 'completed'])]
551+
self.logger.debug(f"Server metrics: {sorted(key_server_metrics)}")
522552
else:
523553
self.logger.warning("No metrics extracted from summary file")
524554

0 commit comments

Comments
 (0)