Skip to content

Benchmarks, optimization, and timeouts

benchmark:
  engine: guidellm  # guidellm (default) or vllm
  repeats: 3  # Default: 3. The vllm-opt CLI uses the median across repeated runs.
  runs:
    # Each named run is one GuideLLM invocation against the same server.
    # A run must contain exactly one data item.
    - name: concurrent-chat
      request_format: /v1/chat/completions  # Default: /v1/completions.
      profile:
        kind: concurrent
        streams: [4, 16, 32]
        max_concurrency: 32
      constraints:
        - kind: max_requests
          count: 500
        - kind: max_duration
          seconds: 2m  # Duration strings and numeric seconds are accepted.
      data:
        - kind: synthetic_text
          prompt_tokens: 512
          prompt_tokens_stdev: 32
          prompt_tokens_min: 128
          prompt_tokens_max: 1024
          output_tokens: 128
          output_tokens_stdev: 16
          output_tokens_min: 32
          output_tokens_max: 256
          turns: 1

    - name: maximum-throughput
      request_format: /v1/completions
      profile:
        kind: throughput
        max_concurrency: 32
        rampup_duration: 10
      constraints: [{kind: max_requests, count: 500}]
      data:
        - kind: json_file
          path: /benchmarks/prompts.jsonl  # JSON and JSONL use json_file.

    # Profile alternatives: copy one profile into a run; do not combine kinds.
    # - name: synchronous
    #   profile: {kind: synchronous}
    #   constraints: [{kind: max_requests, count: 100}]
    #   data: [{kind: synthetic_text, prompt_tokens: 256, output_tokens: 64}]
    # - name: constant-rate
    #   profile: {kind: constant, rate: 10}
    #   constraints: [{kind: max_duration, seconds: 2m}]
    #   data: [{kind: synthetic_text, prompt_tokens: 256, output_tokens: 64}]
    # - name: poisson-rate
    #   profile: {kind: poisson, rate: 10}
    #   constraints: [{kind: max_duration, seconds: 2m}]
    #   data: [{kind: synthetic_text, prompt_tokens: 256, output_tokens: 64}]
    # - name: sweep
    #   profile: {kind: sweep, sweep_size: 10, strategy_type: constant}
    #   constraints: [{kind: max_requests, count: 500}]
    #   data: [{kind: synthetic_text, prompt_tokens: 256, output_tokens: 64}]
    # - name: trace-replay
    #   profile: {kind: replay, time_scale: 1.0}
    #   constraints: [{kind: max_requests, count: 500}]
    #   data:
    #     - kind: trace_synthetic
    #       path: /benchmarks/trace.jsonl
    #       timestamp_column: timestamp
    #       prompt_tokens_column: input_length
    #       output_tokens_column: output_length

    # Other request routes supported by the model and GuideLLM:
    # request_format: /v1/completions
    # request_format: /v1/chat/completions
    # request_format: /v1/responses
    # request_format: /v1/embeddings

    # Dataset alternatives: every run must select exactly one data item.
    # data: [{kind: huggingface, source: garage-bAInd/Open-Platypus,
    #         load_kwargs: {split: train}}]
    # data: [{kind: hf, source: /local/dataset, load_kwargs: {split: train}}]
    # data: [{kind: csv_file, path: /benchmarks/prompts.csv}]
    # data: [{kind: text_file, path: /benchmarks/prompts.txt}]
    # data: [{kind: parquet_file, path: /benchmarks/prompts.parquet}]
    # data: [{kind: arrow_file, path: /benchmarks/prompts.arrow}]
    # data: [{kind: hdf5_file, path: /benchmarks/prompts.hdf5}]
    # data: [{kind: db_file, path: /benchmarks/prompts.db}]
    # data: [{kind: tar_file, path: /benchmarks/prompts.tar}]
    # GuideLLM also provides synthetic_image, synthetic_video, mooncake, and
    # weka data kinds. Their fields are version-specific and pass through.

baseline:
  enabled: true  # Default: true. Tests the fixed configuration first.

optimization:
  maximize: output_tokens_per_second  # Required GuideLLM result metric.
  sampler: tpe                        # grid, random, or tpe. Default: grid.
  trials: 20                          # Required for random/tpe; invalid for grid.
  # For exhaustive Grid search, replace the two lines above with:
  # sampler: grid
  # Do not set trials for Grid; it evaluates every unique combination.
  # For Random search, use sampler: random together with trials.

timeouts:
  startup: 15m    # Default: 15 minutes. Numeric seconds also work.
  benchmark: 20m  # Explicit limit; request-only runs otherwise use a 1h cap.
  # Omit benchmark when GuideLLM duration is bounded or the 1h cap is enough.
  # vLLM keeps its 180-second default.
  # The old literal value `auto` is intentionally invalid.