Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
b19a1b1
refactor(schemas): minify generated JSON schemas (#1210)
ajcasagrande Jul 30, 2026
09eb2b0
docs(standards): allow multi-line docstrings in project code (#1234)
debermudez Jul 30, 2026
19c9ed4
feat(cache-bust): support all structured workloads (#1233)
ajcasagrande Jul 31, 2026
2eb30b4
fix(dag): update BranchStats test expectations for graphs_admitted/gr…
debermudez Jul 31, 2026
86bd64b
fix(search): evaluate error-rate SLA on average percentage (#1155)
shm197 Aug 1, 2026
eca4c7c
fix(endpoints): handle top-level JSON array responses (#1195)
Sanjays2402 Aug 1, 2026
78c7b18
fix(docs): correct output directory flag in arrival-patterns tutorial…
Alex-ai-future Aug 1, 2026
687f23a
perf: cache normalized value/hash on hot-path string enums (#1184)
ajcasagrande Aug 1, 2026
5f09805
test(amdsmi): add e2e integration tests for AMD mock telemetry path (…
FrankD412 Aug 5, 2026
aa88837
feat(mock-server): add ResponsesRequest model with full dispatch plum…
FrankD412 Aug 6, 2026
65a0537
feat(endpoint): add AIPERF_ENDPOINT_FORCE_CONTENT_PARTS to control co…
FrankD412 Aug 7, 2026
adb24fa
feat(endpoints): add audio_transcription endpoint type (#1247)
lkomali Aug 7, 2026
ac53487
feat(accuracy): restore codegen grade concurrency (AIP-1094) (#1237)
debermudez Aug 7, 2026
ecc7aec
fix(config): apply synthesis CLI overrides to YAML (#1258)
milesial Aug 10, 2026
603e6ef
perf(ci): reduce test wall-clock time across platforms (#1261)
debermudez Aug 10, 2026
5ba8908
perf: speed up Baseten trace loading (#1248)
michaelfeil Aug 11, 2026
0cd8044
fix: always project recorded-outcome columns so fidelity survives loa…
lkomali Aug 11, 2026
1cbd2f5
chore: Update CODEOWNERS to aiperf-codeowners team (#1271)
saturley-hall Aug 11, 2026
ff97af6
docs: spell out Visual Studio Code (#1272)
saturley-hall Aug 11, 2026
a25e9b3
feat(dataset): add tracelab dataset support (#1262)
debermudez Aug 12, 2026
31bf570
perf(timing): high-resolution rate-loop pacing for exact rate deliver…
ajcasagrande Aug 13, 2026
6f5bd69
feat: build ffmpeg with a minimal codec allowlist (#1232)
nv-anants Aug 14, 2026
499ae8f
chore: raise aiohttp minimum to 3.14.3 (#1277)
nv-anants Aug 14, 2026
036ec7b
fix: align adaptive-scale request_error_rate SLA with exported metric…
Sanjays2402 Aug 17, 2026
bb3e310
feat(metrics): add --per-chunk-usage to fix TPS/user inflation from b…
lkomali Aug 20, 2026
657b43d
fix(spec-decode): align vLLM adapter with #48915 review-updated wire …
matthewkotila Aug 21, 2026
08a1094
fix(enums): make != the negation of == on case-insensitive str enums …
ajcasagrande Aug 21, 2026
2c6e3d0
fix(dataset): report smallest peak context when all traces are reject…
shimib Aug 21, 2026
4ba4549
feat(http): send session affinity header by default (#1312)
michaelfeil Aug 21, 2026
dc0721d
fix(cache-bust): add WARMUP_ISOLATION_* targets; remove unconditional…
FrankD412 Aug 7, 2026
896783f
docs(cache-bust): add reference link to cache-bust.md in --cache-bust…
FrankD412 Aug 12, 2026
ba08695
feat(dataset): add --system-prompt/--system-prompt-file for verbatim …
FrankD412 Aug 18, 2026
8b59541
feat(dataset): random range ratio + PromptCorpus.RANDOM aligned with …
FrankD412 Aug 21, 2026
b4e36b6
chore: bump aiperf version to 0.13.0 (#1317)
nv-nmailhot Aug 22, 2026
457d00b
fix(test-harness): implement num_prompt_special_tokens on FakeTokeniz…
debermudez Aug 24, 2026
f26b27e
fix(mmap): make get_conversation thread-safe, prefault pages, drop ex…
ajcasagrande Aug 24, 2026
29b1449
fix(dataset): restore random_pool batch-size support with --input-fil…
debermudez Aug 24, 2026
e19fb15
fix(search): batch the DSP kernel to match a constrained multi-output…
ajcasagrande Aug 26, 2026
6e80185
fix: infer benchmark shape from --search-space keywords (#1323)
debermudez Aug 26, 2026
2ad2e24
chore: update attributions for 0.12.0 (#1212)
nv-nmailhot Aug 28, 2026
1084593
fix: stop numpy.float64 from aborting search_history.json export (#1343)
FrankD412 Aug 28, 2026
e4e1f83
fix(finite): keep numpy int and bool identities through the NaN/inf g…
FrankD412 Aug 28, 2026
227032c
fix: close RecordProcessor dataset-configuration race for scaled repl…
debermudez Aug 31, 2026
d109379
fix(config): stop silently dropping CLI flags passed with --config (#…
debermudez Aug 31, 2026
25d4fb3
fix(plot): clarify pareto frontier connectors (#1344)
ilana-n Aug 31, 2026
a0d1ab8
feat: Support stateful responses API with previous_response_id chaini…
jtechapps Sep 1, 2026
96abbf6
test: stop asserting across a Rich line wrap in agentic_code_gen CLI …
manunicholasjacob Sep 2, 2026
6751655
ci: increase Windows job timeout to 90 minutes (#1384)
ajcasagrande Sep 2, 2026
9e0036c
fix(synthesize): fix agentic-code-gen dataset reports' cumulative ISL…
karen-sy Sep 2, 2026
5d96244
feat(export): imply outputs.json from --export-level raw (#1365)
matthewkotila Sep 4, 2026
3e9af21
fix(config): reject synthetic media and rankings flags on file/public…
FrankD412 Sep 4, 2026
46e3db1
feat(metrics): add E2E Normalized Interactivity metric (#1270)
lkomali Sep 4, 2026
33e647a
fix(timing): surface execution-task exceptions instead of hanging on …
AmirF194 Sep 4, 2026
9ac5c75
feat: add stale PR/issue auto-close workflow (#1399)
debermudez Sep 10, 2026
bbd3000
fix(ci): keep uv.lock consistent with the nightly version patch (#1414)
pvijayakrish Sep 12, 2026
971ef4c
fix: default GpuSummary.hostname to None for exclude_none telemetry (…
dundysm Sep 12, 2026
a2e585c
ci(nightly): bound the amd64 wheel-test parallelism on the builder (#…
pvijayakrish Sep 13, 2026
e679761
feat(spec-decode): build the SPEED-Bench per-category matrix from one…
matthewkotila Sep 16, 2026
465102b
feat(tools): add capture_server and compare_recordings scripts (#1257)
FrankD412 Sep 17, 2026
ec7fc37
fix(ci): fetch nightly job logs via REST instead of gh api (#1402)
ajcasagrande Sep 17, 2026
7e89d33
fix(security): bump distroless base image to 3.13-v4.1.4-dev (#1441)
nv-nmailhot Sep 17, 2026
1b3dd74
feat(dataset): restore SPEED-Bench as a first-class --public-dataset …
lkomali Sep 19, 2026
747de0d
feat: group post-run MLflow diagnostic metrics under system/ (#1447)
jayeshsuyal Sep 22, 2026
49a6577
feat(telemetry): probe the NVML energy counter once instead of failin…
manunicholasjacob Sep 28, 2026
4a0b929
feat(dataset): add the H CUA Perf public dataset loader (#1449)
mbrunel-H Sep 28, 2026
d7182e6
ci: install from uv.lock instead of re-resolving dependencies (#1487)
debermudez Sep 29, 2026
7db73c7
fix(server-metrics): probe endpoint reachability with GET instead of …
lkomali Sep 30, 2026
69246c7
fix(dataset): replay bailian sessions as self-contained turns (#1393)
danghungdo Oct 2, 2026
40e99af
fix(dataset): load path-backed HuggingFace ASR audio (#1412)
git-jxj Oct 2, 2026
64b5a6a
docs: add profile to reproducibility examples (#1498)
git-jxj Oct 2, 2026
3ec5341
fix(transport): serialize multipart lists as repeated fields (#1411)
git-jxj Oct 3, 2026
a0ef8a6
fix: preserve signal amplitude in 24-bit synthetic audio (#1395)
git-jxj Oct 3, 2026
74876e1
fix(dataset): honor a weka trace's declared block_size over the plugi…
danisereb Oct 5, 2026
e92d63c
ci: add a single Unit Tests Gate check for the merge ruleset (#1515)
debermudez Oct 6, 2026
070534b
fix(logging): keep log lines a Windows console cannot encode (#1470)
manunicholasjacob Oct 8, 2026
fbe9d65
build(docs): update Fern CLI to 5.149.0 (#1542)
debermudez Oct 8, 2026
dd0368d
feat(h-cua-perf): add the uuid_cache and disable_structured_output kn…
mbrunel-H Oct 9, 2026
4bb6915
feat(h-cua-perf): replay a local build with --input-file (#1493)
mbrunel-H Oct 9, 2026
5402504
feat(spec-decode): TensorRT-LLM per-request acceptance adapter (#1433)
debermudez Oct 10, 2026
10bc024
fix(search): prevent zero DSP lengthscales during GP fitting (#1431)
shm197 Oct 11, 2026
cd83548
fix(spec-decode): drop zero-step acceptance records (#1548)
matthewkotila Oct 12, 2026
07d8335
fix(records): fail a stalled benchmark instead of waiting indefinitely
cquil11 Oct 15, 2026
8b54fb7
test: drop BranchStats expectations for the skipped DAG spine fields
cquil11 Oct 15, 2026
1cef575
feat(agentx): keep 1.0.9 runtime defaults for upstream additions
cquil11 Oct 15, 2026
e084b2a
chore: regenerate config schema and CLI and environment docs
cquil11 Oct 15, 2026
88c20fb
fix: preserve terminal benchmark failures across the message bus (#1434)
jayeshsuyal Sep 17, 2026
96d94f4
fix(config): drop control-hook routing from the --config resolver
cquil11 Oct 15, 2026
e63c15d
feat(dataset): enable live assistant responses for Mooncake messages …
Navjot10 Sep 21, 2026
5d48c60
test: drop upstream tests that need skipped Kubernetes helpers
cquil11 Oct 15, 2026
76d2bcb
ci: drop upstream's uv.lock version-patch tooling
cquil11 Oct 15, 2026
cf00948
ci: keep installing unit-test dependencies without uv.lock
cquil11 Oct 15, 2026
58ddb81
ci: drop upstream's stale PR and issue auto-close workflow
cquil11 Oct 15, 2026
13da68c
build: keep aiohttp on 3.13 for 1.0.x measurement parity
cquil11 Oct 15, 2026
1df7abd
Merge tag 'agentx-v1.0.11' into sync/agentx-v1.0.x
cquil11 Oct 16, 2026
2fad497
Merge tag 'agentx-v1.0.12' into sync/agentx-v1.0.x
cquil11 Oct 29, 2026
0dd2795
fix(tokenizer): short-circuit local paths in _resolve_local_snapshot …
heihei-push Oct 20, 2026
2bbe0c9
ci: shard integration tests 4-way and cancel superseded PR runs (#1584)
agarg21 Oct 22, 2026
732c7e8
docs: make profile export loading examples self-contained (#1499)
git-jxj Oct 27, 2026
3516119
docs: make synthesis API examples runnable (#1497)
git-jxj Oct 27, 2026
7a5573f
feat(dataset): support self-reported audio_duration_seconds for singl…
Maze999 Oct 27, 2026
22ab1bb
fix(dataset): treat image source directories as literal paths (#1496)
git-jxj Oct 28, 2026
0386043
fix(dashboard): show live GPU telemetry after the pane is toggled (#1…
manunicholasjacob Oct 28, 2026
8edf959
fix(endpoints): read reasoning_text from non-streaming Responses reas…
ra-srivid Oct 28, 2026
4624766
fix(dataset): accept multi-picture JPEGs as JPEG images (#1591)
v0ropaev Oct 28, 2026
d55b962
perf(export): bound memory usage when generating outputs.json (#1464)
jayeshsuyal Oct 28, 2026
b580507
fix(docs): repair invalid YAML example and broken documentation links…
gzydsmz Oct 25, 2026
3e7d6db
ci(windows): use -n logical so xdist does not run the suite in one wo…
lkomali Oct 27, 2026
9a5272f
fix(security): bump pillow, mlflow, gitpython, cryptography for known…
nv-nmailhot Oct 25, 2026
0aed720
fix(metrics): skip ragged values of records ingested after the timesl…
weireweire Oct 20, 2026
c168209
refactor(server-metrics): align the warmup baseline tagging with upst…
weireweire Oct 20, 2026
947f740
fix(metrics): pass timeslice ragged positions through the call instea…
weireweire Oct 20, 2026
d4b1563
chore: fix pre-commit after the upstream cherry-picks
cquil11 Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .agents/skills/aiperf-code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ description: Review the current branch against origin/main, capture findings in

Requirements:
- Treat `artifacts/code-review.md` as a living document. Update it in place if it already exists.
- **CLI docs check:** If the diff adds or removes any CLI parameter (i.e., any `Annotated[..., CLIParameter(...)]` field or `--flag` name in `src/aiperf/config/flags/cli_config.py`), verify that `docs/cli-options.md` was regenerated to reflect those changes. The file is auto-generated by `make generate-cli-docs`; a missing regeneration is a blocking finding. The description field inside `Field(description=...)` is the source of truth for what appears in the docs — changes there also require a regen.
- For each finding, record:
- status: `Confirmed`, `Partially confirmed`, or `Not confirmed`
- source-level evidence with exact file paths and line references
Expand Down
5 changes: 5 additions & 0 deletions .cursor/rules/python.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Python 3.11+ async AI benchmarking tool for measuring LLM inference server perfo
- Use mermaid diagrams instead of ASCII art in markdown files.
- Do not create markdown files to document code changes or decisions.
- Do not over-comment code. Removing code is fine without adding comments to explain why.
- Multi-line docstrings are permitted. Use them when the behavior is non-obvious.
- No emojis in code or comments.
- Hide a metric from the console table with `console_group = MetricConsoleGroup.NONE`; group it into a separate section with `MetricConsoleGroup.{USAGE,CACHE,PREDICTION,AUDIO,REASONING,SPEC_DECODE,GPU_POWER_EFFICIENCY_NVIDIA,GPU_POWER_EFFICIENCY_AMD}`. Default is `DEFAULT`. See `docs/metrics-reference.md` "Metric Console Group Reference".
- Platform-conditional code MUST branch on `IS_WINDOWS` / `IS_MACOS` / `IS_LINUX` from `aiperf.common.constants`, never on `platform.system()` directly. The constants are evaluated once at import time, are uniformly greppable, and produce smaller diffs. See `src/aiperf/common/bootstrap.py` and `src/aiperf/config/comm/ipc.py` for canonical examples.
Expand All @@ -50,6 +51,10 @@ Python 3.11+ async AI benchmarking tool for measuring LLM inference server perfo

Numeric metric values crossing a serialization boundary or feeding a numerical algorithm must be finite or explicitly `None`. Use `aiperf.common.finite` (`FiniteFloat`, `scrub_non_finite`, `nan_safe_mean`/`std`, `is_finite_value`). Mechanical CI invariants in `tests/unit/property/test_finite_invariants.py` reject new violations and ratchet existing debt to zero via baseline files. See [`docs/dev/patterns.md`](docs/dev/patterns.md) § "NaN/Inf Discipline Pattern" and [`docs/dev/global-invariants.md`](docs/dev/global-invariants.md) for the full contract.

## CLI Flag Routing Under `--config`

A CLI flag passed alongside `--config` MUST either change the resolved config or raise an error naming the flag — never be silently ignored, which for a benchmarking tool means publishing numbers that do not match what was asked for. `CLIConfig` is the source of truth, structurally: `resolve_config` receives a `CLIConfig` and a path and nothing else, so a flag reaches `AIPerfConfig` only by being a field on it. Every field must be classified in `src/aiperf/config/flags/_config_flag_routing.py` as `ROUTED_UNDER_CONFIG`, `UNROUTED_UNDER_CONFIG`, `EXEMPT_FROM_CONFIG_ROUTING`, or one of the conditional sets (`COMPANION_ROUTED`, `MAGIC_LIST_ONLY_UNDER_CONFIG`). Adding a flag without classifying it fails `test_every_cli_config_field_is_classified`; claiming a flag is routed when nothing routes it fails `test_routed_field_never_silently_no_ops`. Prefer routing the flag (check whether a builder already exists) over listing it as unrouted. See [`docs/dev/global-invariants.md`](docs/dev/global-invariants.md) § "CLI flag routing under `--config`".

## Build and Test Commands

```bash
Expand Down
14 changes: 14 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Normalize line endings to LF on checkout, including on Windows, where
# git's default core.autocrlf=true otherwise converts text files to CRLF.
# tests/ui/test_operator_*.py string/regex-strips import lines out of
# src/aiperf/operator/ui/lib/*.js before eval'ing them as data: URL modules;
# that stripping assumes LF and silently no-ops on CRLF, leaving the original
# relative import in place and breaking module resolution on Windows CI.
* text=auto eol=lf

# Vendored third-party sources are checked out byte-for-byte on every platform.
# Their value is being identical to a pinned upstream commit, and CI asserts a
# sha256 over the raw bytes -- newline conversion on Windows checkouts would
# change the digest without changing the content. This must stay last: later
# patterns win, so the blanket rule above would otherwise re-normalize them.
src/aiperf/dataset/loader/vendor/** -text
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
# Docs: https://docs.github.com/articles/about-code-owners

# Default owners for everything in the repository — the core NVIDIA AIPerf team.
* @ajcasagrande @debermudez @matthewkotila @ilana-n @lkomali @ganeshku1 @FrankD412
* @ai-dynamo/aiperf-codeowners
5 changes: 5 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ Python 3.11+ async AI benchmarking tool for measuring LLM inference server perfo
- Use mermaid diagrams instead of ASCII art in markdown files.
- Do not create markdown files to document code changes or decisions.
- Do not over-comment code. Removing code is fine without adding comments to explain why.
- Multi-line docstrings are permitted. Use them when the behavior is non-obvious.
- No emojis in code or comments.
- Hide a metric from the console table with `console_group = MetricConsoleGroup.NONE`; group it into a separate section with `MetricConsoleGroup.{USAGE,CACHE,PREDICTION,AUDIO,REASONING,SPEC_DECODE,GPU_POWER_EFFICIENCY_NVIDIA,GPU_POWER_EFFICIENCY_AMD}`. Default is `DEFAULT`. See `docs/metrics-reference.md` "Metric Console Group Reference".
- Platform-conditional code MUST branch on `IS_WINDOWS` / `IS_MACOS` / `IS_LINUX` from `aiperf.common.constants`, never on `platform.system()` directly. The constants are evaluated once at import time, are uniformly greppable, and produce smaller diffs. See `src/aiperf/common/bootstrap.py` and `src/aiperf/config/comm/ipc.py` for canonical examples.
Expand All @@ -45,6 +46,10 @@ Python 3.11+ async AI benchmarking tool for measuring LLM inference server perfo

Numeric metric values crossing a serialization boundary or feeding a numerical algorithm must be finite or explicitly `None`. Use `aiperf.common.finite` (`FiniteFloat`, `scrub_non_finite`, `nan_safe_mean`/`std`, `is_finite_value`). Mechanical CI invariants in `tests/unit/property/test_finite_invariants.py` reject new violations and ratchet existing debt to zero via baseline files. See [`docs/dev/patterns.md`](docs/dev/patterns.md) § "NaN/Inf Discipline Pattern" and [`docs/dev/global-invariants.md`](docs/dev/global-invariants.md) for the full contract.

## CLI Flag Routing Under `--config`

A CLI flag passed alongside `--config` MUST either change the resolved config or raise an error naming the flag — never be silently ignored, which for a benchmarking tool means publishing numbers that do not match what was asked for. `CLIConfig` is the source of truth, structurally: `resolve_config` receives a `CLIConfig` and a path and nothing else, so a flag reaches `AIPerfConfig` only by being a field on it. Every field must be classified in `src/aiperf/config/flags/_config_flag_routing.py` as `ROUTED_UNDER_CONFIG`, `UNROUTED_UNDER_CONFIG`, `EXEMPT_FROM_CONFIG_ROUTING`, or one of the conditional sets (`COMPANION_ROUTED`, `MAGIC_LIST_ONLY_UNDER_CONFIG`). Adding a flag without classifying it fails `test_every_cli_config_field_is_classified`; claiming a flag is routed when nothing routes it fails `test_routed_field_never_silently_no_ops`. Prefer routing the flag (check whether a builder already exists) over listing it as unrouted. See [`docs/dev/global-invariants.md`](docs/dev/global-invariants.md) § "CLI flag routing under `--config`".

## Build and Test Commands

```bash
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -593,6 +593,9 @@ jobs:
# advisory; this gate sits inside the publish path.
- name: Run unit tests against installed nightly wheel (amd64 only)
if: matrix.arch == 'amd64'
timeout-minutes: 45
env:
MALLOC_ARENA_MAX: "2"
run: |
set -euo pipefail
NIGHTLY=$(find dist/ -maxdepth 1 -name "aiperf_nightly-*.whl" -type f | head -1)
Expand Down Expand Up @@ -620,8 +623,9 @@ jobs:
# package is on sys.path via the venv; src/ is NOT on sys.path,
# so `import aiperf` resolves to the installed wheel rather than
# the source tree.
# -n auto on the many-core builder starved the runner of memory.
.venv-wheel-tests/bin/pytest tests/unit \
-n auto \
-n 8 --dist=worksteal \
-m 'not performance and not stress' \
--tb=short

Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/run-fern-checks.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
name: "Fern Docs Checks"

Expand All @@ -19,10 +19,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Node.js 20
- name: Set up Node.js 22
uses: actions/setup-node@v5
with:
node-version: "20"
node-version: "22"
- name: Install Fern CLI
run: npm install -g fern-api@$(jq -r '.version' fern/fern.config.json)
- name: Set up Python 3.12
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/run-integration-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ on:
branches:
- main

concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.ref || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
integration-tests:
runs-on: ${{ matrix.os }}
Expand All @@ -16,6 +20,10 @@ jobs:
matrix:
os: ["ubuntu-latest"]
python-version: ["3.11", "3.12", "3.13"]
shard: [0, 1, 2, 3]
env:
AIPERF_SHARD_INDEX: ${{ matrix.shard }}
AIPERF_SHARD_TOTAL: 4

steps:
- uses: actions/checkout@v6
Expand Down
92 changes: 80 additions & 12 deletions .github/workflows/run-unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
build:
runs-on: ${{ matrix.runner }}
# Windows x64 runners can finish the component tier just past 30 minutes.
timeout-minutes: 45
timeout-minutes: 90
# Force CPython UTF-8 mode so file reads default to UTF-8 instead of the
# Windows cp1252 code page (no-op on POSIX). Without it, reading a UTF-8
# file on Windows raises UnicodeDecodeError on bytes like 0x8f.
Expand Down Expand Up @@ -108,36 +108,104 @@ jobs:
# builder pod. -n auto without this OOM-kills the runner agent.
PYTEST_XDIST_AUTO_NUM_WORKERS: "4"
run: |
make test-ci PYTHON_VERSION=${{ matrix.python-version }}
# Only collect coverage on the linux/3.12 leg where Codecov upload runs.
COV=${{ (matrix.os == 'linux' && matrix.python-version == '3.12') && '1' || '0' }}
make test-ci PYTHON_VERSION=${{ matrix.python-version }} COV=$COV
# Mirrors POSIX ``make test-ci`` semantics: run BOTH tiers and
# aggregate exit codes so unit-test failures don't mask component-
# integration failures (or vice versa). Without the explicit
# ``always() && runner.os == 'Windows'`` guard on the second step,
# GitHub Actions' implicit ``success()`` short-circuits the
# component-integration step on any unit-test failure.
- name: Run unit tests (Windows)
- name: Run unit and zmq tests (Windows)
# Merged into one invocation to pay collection overhead once instead of
# twice. tests/unit/conftest.py's no_sleep patch applies only to
# tests/unit/**; tests/zmq/** uses real asyncio.sleep as before.
# --no-looptime is omitted: looptime is opt-in per test via marker/
# fixture and zmq tests use neither, so they run with a real-time loop.
# --continue-on-collection-errors preserves the previous two-step
# behaviour where a unit collection error did not block the zmq suite.
if: runner.os == 'Windows'
# -n logical, not -n auto: xdist's ``auto`` asks psutil for the PHYSICAL
# core count, and the GitHub x86 Windows VM reports 1 physical core for
# its 4 vCPUs, so ``auto`` ran the whole suite in a single worker (~3x
# slower than windows-11-arm, which happens to report 3). ``logical``
# uses the logical count on both and tracks the runner size if it grows.
run: |
uv run pytest tests/unit -n auto --tb=short -m 'not performance and not stress and not slow'
- name: Run zmq real-transport tests (Windows)
# Real-socket libzmq tests (no looptime). ``!cancelled()`` lets them run
# even if the unit step failed, matching the POSIX ``make test-ci``
# exit-code aggregation across tiers.
if: ${{ !cancelled() && runner.os == 'Windows' }}
run: |
uv run pytest tests/zmq --tb=short --no-looptime -m 'not performance and not stress and not slow'
uv run pytest tests/unit tests/zmq -n logical --dist=worksteal --tb=short --continue-on-collection-errors -m 'not performance and not stress and not slow'
- name: Run component integration tests (Windows)
# ``!cancelled()`` overrides the implicit ``success()`` so component
# integration still runs even if the unit-test step failed — matching
# POSIX ``make test-ci`` which aggregates exit codes across both tiers.
# Cancellation is still respected so we don't burn runner minutes
# finishing after a manual stop.
if: ${{ !cancelled() && runner.os == 'Windows' }}
# -n logical for the reason given on the unit-test step above.
run: |
uv run pytest tests/component_integration -n auto --tb=short -v -m 'not performance and not stress and not slow'
uv run pytest tests/component_integration -n logical --dist=worksteal --tb=short -v -m 'not performance and not stress and not slow'
- name: Upload results to Codecov
if: matrix.os == 'linux' && matrix.python-version == '3.12'
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
slug: ai-dynamo/aiperf

botorch-regression:
name: BoTorch Regression Tests (CPU)
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
env:
PYTEST_XDIST_AUTO_NUM_WORKERS: "4"
steps:
- uses: actions/checkout@v6
with:
persist-credentials: false
- name: Set up Python 3.13
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Set up uv with cache
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
cache-dependency-glob: "uv.lock"
- name: Install CPU-only BoTorch dependencies
run: |
make ci-install PYTHON_VERSION=3.13
uv pip install --torch-backend cpu -e ".[botorch]"
# Split across two steps rather than two lines of one ``run:``. ``run:``
# executes under ``bash -e``, so a failure in the first file would abort
# the step and the slow suite would never run. ``!cancelled()`` on the
# second overrides the implicit ``success()`` so both suites always
# report -- matching the Windows tiers above.
- name: Run BoTorch GP kernel regression tests
run: |
uv run pytest -n auto --dist=worksteal \
tests/unit/orchestrator/search_planner/test_botorch_kernel.py
- name: Run BoTorch GP candidates_func regression tests (slow)
if: ${{ !cancelled() }}
run: |
uv run pytest -n auto --dist=worksteal -m slow \
tests/unit/orchestrator/search_planner/test_optuna_dsp_kernel.py

# The merge ruleset requires this single check rather than each matrix leg,
# whose names change whenever a leg is added or renamed. always() keeps it
# from being skipped, because GitHub treats a skipped required check as passed.
unit-tests-gate:
name: Unit Tests Gate
needs: [build, botorch-regression]
if: always()
runs-on: ubuntu-latest
timeout-minutes: 5
permissions: {}
steps:
- name: Require every unit test job to pass
env:
RESULTS: ${{ join(needs.*.result, ' ') }}
run: |
echo "Job results: ${RESULTS}"
for result in ${RESULTS}; do
[ "${result}" = "success" ] || exit 1
done
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,4 @@ src/aiperf/_build_info.py

# Chaos/adversarial test run artifacts
tests/scripts/.chaos_runs/
.worktrees/
8 changes: 7 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,27 +29,33 @@ repos:
- id: check-toml
- id: check-yaml
- id: check-shebang-scripts-are-executable
# The vendored SPEED-Bench resolver is byte-pinned to upstream by a
# sha256 CI gate. Any whitespace or newline rewrite breaks that pin.
- id: end-of-file-fixer
types_or: [cuda, proto, textproto, python]
exclude: ^src/aiperf/dataset/loader/vendor/
- id: mixed-line-ending
exclude: ^src/aiperf/dataset/loader/vendor/
- id: no-commit-to-branch
args: [--branch, main]
- id: requirements-txt-fixer
- id: trailing-whitespace
exclude: ^src/aiperf/dataset/loader/vendor/
- repo: https://github.com/codespell-project/codespell
rev: v2.4.2
hooks:
- id: codespell
additional_dependencies: [tomli]
args: ["--toml", "pyproject.toml"]
exclude: (?x)^(.*stemmer.*|.*stop_words.*|^CHANGELOG.md$|.*shakespeare.txt|ATTRIBUTIONS-.*\.md)
exclude: (?x)^(.*stemmer.*|.*stop_words.*|^CHANGELOG.md$|.*shakespeare.txt|ATTRIBUTIONS-.*\.md|src/aiperf/dataset/loader/vendor/.*)
- repo: local
hooks:
- id: add-license
name: add-license
entry: make add-copyright
language: python
require_serial: true
exclude: ^src/aiperf/dataset/loader/vendor/
- id: generate-cli-docs
name: generate-cli-docs
entry: make generate-cli-docs
Expand Down
Loading
Loading