2121
2222from guidellm .backends import Backend , BackendType
2323from guidellm .benchmark .benchmarker import Benchmarker
24- from guidellm .benchmark .outputs import GenerativeBenchmarkerOutput
24+ from guidellm .benchmark .outputs import (
25+ GenerativeBenchmarkerConsole ,
26+ GenerativeBenchmarkerOutput ,
27+ )
2528from guidellm .benchmark .profiles import Profile , ProfileType
2629from guidellm .benchmark .progress import GenerativeConsoleBenchmarkerProgress
2730from guidellm .benchmark .schemas import (
@@ -313,7 +316,7 @@ async def resolve_profile(
313316 profile : StrategyType | ProfileType | Profile ,
314317 rate : list [float ] | None ,
315318 random_seed : int ,
316- rampup : TransientPhaseConfig ,
319+ rampup : float ,
317320 constraints : MutableMapping [str , ConstraintInitializer | Any ],
318321 max_seconds : int | float | None ,
319322 max_requests : int | None ,
@@ -332,7 +335,8 @@ async def resolve_profile(
332335 :param profile: Profile type identifier or pre-configured Profile instance
333336 :param rate: Request rate(s) for the benchmark execution
334337 :param random_seed: Seed for reproducible random operations
335- :param rampup: Ramp-up phase configuration for the benchmark execution
338+ :param warmup: Warm-up phase configuration for the benchmark execution
339+ (used for ramp-up duration calculation)
336340 :param constraints: Dictionary of constraint initializers for benchmark limits
337341 :param max_seconds: Maximum duration in seconds for the benchmark
338342 :param max_requests: Maximum number of requests to process
@@ -358,24 +362,21 @@ async def resolve_profile(
358362 }.items ():
359363 if val is not None :
360364 constraints [key ] = val
361- rampup_duration , _ = rampup .compute_limits (
362- max_requests = max_requests , max_seconds = max_seconds
363- )
364365
365366 if not isinstance (profile , Profile ):
366367 profile = Profile .create (
367368 rate_type = profile ,
368369 rate = rate ,
369370 random_seed = random_seed ,
370- rampup_duration = rampup_duration or 0.0 ,
371+ rampup_duration = rampup ,
371372 constraints = {** constraints },
372373 )
373374 elif constraints :
374375 raise ValueError (
375376 "Constraints must be empty when providing a Profile instance. "
376377 f"Provided constraints: { constraints } ; provided profile: { profile } "
377378 )
378- elif rampup_duration is not None :
379+ elif rampup > 0.0 :
379380 raise ValueError (
380381 "Ramp-up duration must not be set when providing a Profile instance. "
381382 f"Provided rampup: { rampup } ; provided profile: { profile } "
@@ -392,15 +393,15 @@ async def resolve_profile(
392393
393394
394395async def resolve_output_formats (
395- output_formats : OutputFormatT ,
396- output_path : str | Path | None ,
396+ outputs : list [ str ] | tuple [ str ] ,
397+ output_dir : str | Path | None ,
397398 console : Console | None = None ,
398399) -> dict [str , GenerativeBenchmarkerOutput ]:
399400 """
400401 Resolve output format specifications into configured output handler instances.
401402
402- :param output_formats : Specification of desired output formats
403- :param output_path : Base path for output file generation, or None for default
403+ :param outputs : Specification of desired output files/types
404+ :param output_dir : Base path for output file generation, or None for default
404405 :param console: Console instance for progress reporting, or None
405406 :return: Dictionary mapping format names to configured output handler instances
406407 """
@@ -409,7 +410,7 @@ async def resolve_output_formats(
409410 )
410411
411412 resolved = GenerativeBenchmarkerOutput .resolve (
412- output_formats = output_formats , output_path = output_path
413+ outputs = outputs , output_dir = output_dir
413414 )
414415
415416 if console_step :
@@ -473,18 +474,16 @@ async def benchmark_generative_text(
473474 ** (args .dataloader_kwargs or {}),
474475 )
475476
476- rampup = TransientPhaseConfig .create_from_value (args .rampup )
477- rampup .mode = "duration"
478477 warmup = TransientPhaseConfig .create_from_value (args .warmup )
479478 cooldown = TransientPhaseConfig .create_from_value (args .cooldown )
480479 if console :
481480 console .print_update (
482481 title = "Resolved transient phase configurations" ,
483482 details = "\n " .join (
484483 [
485- f"Rampup: { rampup } " ,
486484 f"Warmup: { warmup } " ,
487485 f"Cooldown: { cooldown } " ,
486+ f"Rampup (Throughput/Concurrent): { args .rampup } " ,
488487 ]
489488 ),
490489 status = "success" ,
@@ -494,7 +493,7 @@ async def benchmark_generative_text(
494493 profile = args .profile ,
495494 rate = args .rate ,
496495 random_seed = args .random_seed ,
497- rampup = rampup ,
496+ rampup = args . rampup ,
498497 constraints = constraints ,
499498 max_seconds = args .max_seconds ,
500499 max_requests = args .max_requests ,
@@ -504,9 +503,7 @@ async def benchmark_generative_text(
504503 console = console ,
505504 )
506505 output_formats = await resolve_output_formats (
507- output_formats = args .output_formats ,
508- output_path = args .output_path ,
509- console = console ,
506+ outputs = args .outputs , output_dir = args .output_dir , console = console
510507 )
511508
512509 report = GenerativeBenchmarksReport (args = args )
@@ -541,6 +538,7 @@ async def benchmark_generative_text(
541538 output_format_results [key ] = output_result
542539
543540 if console :
541+ await GenerativeBenchmarkerConsole (console = console ).finalize (report )
544542 console .print ("\n \n " )
545543 console .print_update (
546544 title = (
@@ -581,7 +579,9 @@ async def reimport_benchmarks_report(
581579 )
582580
583581 resolved_output_formats = await resolve_output_formats (
584- output_formats , output_path , console = console
582+ output_formats , # type: ignore[arg-type]
583+ output_path ,
584+ console = console ,
585585 )
586586 output_format_results = {}
587587 for key , output in resolved_output_formats .items ():
0 commit comments