Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

How to Test Workflows

In order to test configurations described in configs, the primary workflow file used is .github/workflows/e2e-tests.yml. As input, this workflow takes in the CLI arguments for the utils/matrix_logic/generate_sweep_configs.py script. The usage for this script is shown below:

usage: generate_sweep_configs.py [-h] {full-sweep,test-config} ...

Generate benchmark configurations from YAML config files

positional arguments:
  {full-sweep,test-config}
                        Available commands
    full-sweep          Generate full sweep configurations with optional
                        filtering by model, precision, framework, runner type,
                        and sequence lengths
    test-config         Generate full sweep for specific config keys.
                        Supports wildcard patterns (* and ?) for matching
                        multiple keys at once.

options:
  -h, --help            show this help message and exit

full-sweep Command

The full-sweep command generates benchmark configurations with optional filtering. You can specify --single-node, --multi-node, or both. If neither is specified, both types are generated.

usage: generate_sweep_configs.py full-sweep
    --config-files CONFIG_FILES [CONFIG_FILES ...]
    [--runner-config RUNNER_CONFIG]
    [--no-evals | --evals-only] [--all-evals]
    [--model-prefix MODEL_PREFIX [MODEL_PREFIX ...]]
    [--precision PRECISION [PRECISION ...]]
    [--framework FRAMEWORK [FRAMEWORK ...]]
    [--runner-type RUNNER_TYPE [RUNNER_TYPE ...]]
    [--seq-lens {1k1k,8k1k} [{1k1k,8k1k} ...]]
    [--step-size STEP_SIZE]
    [--max-conc MAX_CONC]
    [--max-tp MAX_TP]
    [--max-ep MAX_EP]
    [--single-node] [--multi-node]

If neither --single-node nor --multi-node is specified, both types are generated.

By default, throughput runs for every generated config and eval-only jobs run for the selected 8k1k subset. --no-evals disables eval jobs, --evals-only emits only that selected subset, and adding --all-evals expands it to every fixed-sequence config. --all-evals alone is an equivalent eval-only shorthand; it cannot be combined with --no-evals.

--step-size must be greater than 1 and applies to concurrency ranges. Explicit conc-list values are emitted directly and are filtered by --min-conc / --max-conc when provided; when both bounds are set, --min-conc must not exceed --max-conc.

Examples

Generate all single-node and multi-node configurations (default):

full-sweep --config-files configs/nvidia-master.yaml

Test all single-node gptoss configurations on B200 with 1k1k sequence lengths:

full-sweep --single-node --model-prefix gptoss --runner-type b200 --seq-lens 1k1k --config-files configs/nvidia-master.yaml

Test all single-node fp8 precision configs for 8k1k workloads:

full-sweep --single-node --precision fp8 --seq-lens 8k1k --config-files configs/nvidia-master.yaml configs/amd-master.yaml

Test all single-node TRT configs on H200 runners:

full-sweep --single-node --framework trt --runner-type h200 b200-trt --config-files configs/nvidia-master.yaml

Test specific single-node model on specific hardware with specific sequence lengths:

full-sweep --single-node --model-prefix dsr1 --runner-type b200 --precision fp4 --framework sglang --seq-lens 1k1k 8k1k --config-files configs/nvidia-master.yaml

Limit concurrency and parallelism for faster testing:

full-sweep --single-node --max-conc 64 --max-tp 4 --config-files configs/nvidia-master.yaml

Test all multi-node configurations:

full-sweep --multi-node --config-files configs/nvidia-master.yaml

Test agentic configurations:

full-sweep --scenario-type agentic-coding --config-files configs/nvidia-master.yaml configs/amd-master.yaml

test-config Command

The test-config command generates the full sweep for one or more specific config keys. This is useful for testing individual configurations without filtering by model prefix, framework, etc.

usage: generate_sweep_configs.py test-config
    --config-files CONFIG_FILES [CONFIG_FILES ...]
    [--runner-config RUNNER_CONFIG]
    [--no-evals | --evals-only] [--all-evals]
    --config-keys CONFIG_KEYS [CONFIG_KEYS ...]
    [--conc CONC [CONC ...]]

Config keys support wildcard patterns using * (matches any characters) and ? (matches a single character). Patterns that match no keys will raise an error.

Examples

Test a single config by exact name:

test-config --config-keys dsr1-fp4-b200-sglang --config-files configs/nvidia-master.yaml

Test multiple exact configs:

test-config --config-keys dsr1-fp4-b200-sglang dsr1-fp8-h200-trt --config-files configs/nvidia-master.yaml

Use wildcard to test all B200 configs:

test-config --config-keys *-b200-* --config-files configs/nvidia-master.yaml

Use wildcard to test all sglang configs:

test-config --config-keys *-sglang --config-files configs/nvidia-master.yaml configs/amd-master.yaml

Use wildcard to test all dsr1 model configs:

test-config --config-keys dsr1* --config-files configs/nvidia-master.yaml

Mix exact keys and patterns:

test-config --config-keys dsr1-fp4-b200-sglang gptoss* --config-files configs/nvidia-master.yaml

Override concurrency for targeted testing:

test-config --config-keys *-b200-* --conc 4 8 --config-files configs/nvidia-master.yaml

Run eval-only jobs for every generated fixed-sequence config:

test-config --config-keys dsr1-fp8-h200-sglang --evals-only --all-evals --config-files configs/nvidia-master.yaml

PR Eval Modifiers

Use all-evals and/or evals-only with one primary sweep label (full-sweep-fail-fast is the strongly recommended primary for full sweeps; use full-sweep-enabled only when jobs must keep running past a failure). all-evals covers every fixed-sequence config; each multi-node topology runs all conc-list values on one engine. evals-only suppresses throughput; together they run all evals only. The primary label still controls canary/fail-fast. all-evals full sweeps are reusable. Runs with evals-only, including runs with both modifiers, are not. Default full sweeps, including default evals, are also reusable.

Reusing an Approved PR Full Sweep

[skip-sweep] skips PR benchmark setup only; changelog and reuse checks still run. Pushes to main ignore it.

After an eligible full sweep (full-sweep-enabled, non-canary-full-sweep-enabled, or either fail-fast variant), an authorized maintainer can comment:

/reuse-sweep-run

This selects the latest successful run-sweep.yml PR run whose commit remains in the PR. A run ID can pin an eligible successful or failed run:

/reuse-sweep-run <run_id>

Failed-run artifacts must still validate. The latest matching comment by an OWNER, MEMBER, or COLLABORATOR wins. Comments do not trigger or cancel sweeps; later commits skip a new sweep after changelog/matrix validation. Remove and re-add the sweep label to force one.

utils/merge_with_reuse.sh <pr-number> is the supported merge path for reuse. It merges main, preserves changelog bytes, fixes an appended XXX PR link, pushes a synchronization commit, waits for checks, then merges.

The main run verifies the source, validates and uploads its ingest artifacts, then ingests them with merge-run changelog metadata. Source coverage is authoritative, so later matrix/eval policy changes do not invalidate reuse. Validation rejects duplicate fixed rows, missing run stats, inconsistent agentic artifacts, malformed eval metadata, and raw/aggregate eval mismatches. Batched evals use only completed_eval_concs.

Reuse fails closed when authorized but ineligible or invalid; without authorization, main runs the normal full sweep.

Validation Architecture

The benchmarking system uses a strict validation methodology to ensure correctness at every stage. This is implemented in utils/matrix_logic/validation.py using Pydantic models.

Validation Methodology

The system validates both ends of the configuration pipeline:

  1. Input Validation (Master Configs): Validates the structure of configs/*.yaml files before any processing occurs
  2. Output Validation (Matrix Entries): Validates the generated matrix entries that are passed to workflow templates

This dual-validation approach ensures:

  • No malformed configurations enter the pipeline
  • No invalid parameters reach the benchmark workflows
  • Workflow templates (benchmark-tmpl.yml, benchmark-multinode-tmpl.yml) can assume all inputs are valid—no runtime validation needed

Input Validation: Master Config Files

Master config files (e.g., nvidia-master.yaml, amd-master.yaml) are validated against strict Pydantic schemas:

  • SingleNodeMasterConfigEntry: Validates single-node configurations
  • MultiNodeMasterConfigEntry: Validates multi-node configurations

Each config must specify:

  • Required fields: image, model, model-prefix, precision, framework, runner, multinode
  • Sequence length configs with search spaces defining TP, EP, concurrency ranges, etc.
  • Optional fields like disagg, spec-decoding, dp-attn

Invalid or missing fields raise immediate validation errors before any matrix generation.

Output Validation: Matrix Entries

Generated matrix entries (the actual workflow inputs) are validated against:

  • SingleNodeMatrixEntry: Matches the inputs expected by benchmark-tmpl.yml
  • MultiNodeMatrixEntry: Matches the inputs expected by benchmark-multinode-tmpl.yml

These Pydantic models mirror the workflow template input definitions exactly. For example, benchmark-tmpl.yml expects:

inputs:
  runner: required
  image: required
  model: required
  model-prefix: required
  precision: required
  framework: required
  ...

The corresponding SingleNodeMatrixEntry enforces these same fields with appropriate types.

Key Design Principles

  1. No defaults in output validation: Matrix entry models don't set defaults. Missing values must fail validation rather than silently using fallbacks.

  2. extra='forbid': Unknown fields are rejected, preventing typos or deprecated fields from slipping through.

  3. Strict typing: Fields like spec-decoding use Literal["mtp", "draft_model", "none"] to restrict values to known options.

  4. Concurrency validation: The system ensures either conc-list OR conc-start/conc-end is provided, but not both.

Validation Flow

configs/*.yaml
        │
        ▼
┌─────────────────────────┐
│  validate_master_config │  ← Input validation (Pydantic)
└─────────────────────────┘
        │
        ▼
┌─────────────────────────┐
│  generate_sweep_configs │  ← Matrix generation
└─────────────────────────┘
        │
        ▼
┌─────────────────────────┐
│  validate_matrix_entry  │  ← Output validation (Pydantic)
└─────────────────────────┘
        │
        ▼
  benchmark-tmpl.yml or
  benchmark-multinode-tmpl.yml