Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .github/actions/setup-disk-benchmark/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,34 @@ inputs:
extract-to:
description: 'Directory to extract the dataset into'
required: true
nvme-mount-path:
description: 'Mount point for the high-speed NVMe SSD'
required: false
default: '/mnt/nvme'

runs:
using: composite
steps:
- name: Install Rust
shell: bash
run: |
if ! command -v rustup &>/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
fi

- name: Show Rust toolchain
shell: bash
run: rustup show

- name: Mount high-speed NVMe SSD
shell: bash
run: |
sudo mkdir -p -m 777 ${{ inputs.nvme-mount-path }}
sudo lsblk
sudo mkfs.ext4 /dev/nvme0n1
sudo mount /dev/nvme0n1 ${{ inputs.nvme-mount-path }}

- name: Install system dependencies
shell: bash
run: |
Expand Down
36 changes: 23 additions & 13 deletions .github/workflows/disk-benchmarks-aa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ concurrency:
env:
RUST_BACKTRACE: 1
PERF_INPUTS: diskann-benchmark/perf_test_inputs
NVME_MOUNT_PATH: /mnt/nvme
DISKANN_RUST: /mnt/nvme/diskann_rust

defaults:
run:
Expand All @@ -37,7 +39,7 @@ jobs:
# A/A benchmark: run main vs main to detect environment noise.
aa-benchmark:
name: A/A - ${{ matrix.dataset }}
runs-on: ubuntu-latest
runs-on: [ self-hosted, 1ES.Pool=diskann-github, ubuntu-latest ]
timeout-minutes: 120
strategy:
fail-fast: false
Expand All @@ -51,41 +53,49 @@ jobs:
archive: openai-100K.tar.gz

steps:
- name: Checkout main
# Shallow checkout to $GITHUB_WORKSPACE so the composite action is accessible via uses:.
- name: Checkout action definitions
uses: actions/checkout@v4
with:
ref: main
path: diskann_rust
lfs: true
sparse-checkout: .github
path: github_actions

- name: Setup benchmark environment
uses: ./diskann_rust/.github/actions/setup-disk-benchmark
uses: ./github_actions/.github/actions/setup-disk-benchmark
with:
dataset: ${{ matrix.dataset }}
archive: ${{ matrix.archive }}
extract-to: diskann_rust/target/tmp
extract-to: ${{ env.DISKANN_RUST }}/target/tmp
nvme-mount-path: ${{ env.NVME_MOUNT_PATH }}

- name: Checkout main
uses: actions/checkout@v4
with:
ref: main
path: ${{ env.DISKANN_RUST }}
lfs: true

# A/A: build once, run twice (identical code — only detecting environment noise)
- name: Build benchmark binary
working-directory: diskann_rust
working-directory: ${{ env.DISKANN_RUST }}
run: cargo build -p diskann-benchmark --features disk-index --release

- name: Run baseline benchmark
working-directory: diskann_rust
working-directory: ${{ env.DISKANN_RUST }}
run: |
cargo run -p diskann-benchmark --features disk-index --release -- \
run --input-file ${{ env.PERF_INPUTS }}/${{ matrix.config }} \
--output-file target/tmp/${{ matrix.dataset }}_baseline.json

- name: Run target benchmark
working-directory: diskann_rust
working-directory: ${{ env.DISKANN_RUST }}
run: |
cargo run -p diskann-benchmark --features disk-index --release -- \
run --input-file ${{ env.PERF_INPUTS }}/${{ matrix.config }} \
--output-file target/tmp/${{ matrix.dataset }}_target.json

- name: Validate benchmark results
working-directory: diskann_rust
working-directory: ${{ env.DISKANN_RUST }}
run: |
cargo run -p diskann-benchmark --features disk-index --release -- \
check run \
Expand All @@ -100,8 +110,8 @@ jobs:
with:
name: aa-results-${{ matrix.dataset }}
path: |
diskann_rust/target/tmp/${{ matrix.dataset }}_target.json
diskann_rust/target/tmp/${{ matrix.dataset }}_baseline.json
${{ env.DISKANN_RUST }}/target/tmp/${{ matrix.dataset }}_target.json
${{ env.DISKANN_RUST }}/target/tmp/${{ matrix.dataset }}_baseline.json
retention-days: 30

# Notify diskann-disk-maintainers on A/A failure — but only when the failure
Expand Down
49 changes: 30 additions & 19 deletions .github/workflows/disk-benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ concurrency:
env:
RUST_BACKTRACE: 1
PERF_INPUTS: diskann-benchmark/perf_test_inputs
NVME_MOUNT_PATH: /mnt/nvme
DISKANN_RUST: /mnt/nvme/diskann_rust
BASELINE: /mnt/nvme/baseline

defaults:
run:
Expand All @@ -54,7 +57,7 @@ jobs:
# Macro benchmark: compare current branch against baseline
macro-benchmark:
name: Macro Benchmark - ${{ matrix.dataset }}
runs-on: ubuntu-latest
runs-on: [ self-hosted, 1ES.Pool=diskann-github, ubuntu-latest ]
# TODO: For production benchmarks, consider using a self-hosted runner with:
# - NVMe storage for consistent I/O performance
# - CPU pinning (taskset) for reduced variance
Expand All @@ -74,53 +77,61 @@ jobs:
data_dir: OpenAIArXiv

steps:
# Shallow checkout to $GITHUB_WORKSPACE so the composite action is accessible via uses:.
- name: Checkout action definitions
uses: actions/checkout@v4
with:
sparse-checkout: .github
path: github_actions

- name: Setup benchmark environment
uses: ./github_actions/.github/actions/setup-disk-benchmark
with:
dataset: ${{ matrix.dataset }}
archive: ${{ matrix.archive }}
extract-to: ${{ env.DISKANN_RUST }}/target/tmp
nvme-mount-path: ${{ env.NVME_MOUNT_PATH }}

- name: Checkout current branch
uses: actions/checkout@v4
with:
path: diskann_rust
path: ${{ env.DISKANN_RUST }}
lfs: true

- name: Checkout baseline (${{ inputs.baseline_ref || 'main' }})
uses: actions/checkout@v4
with:
ref: ${{ inputs.baseline_ref || 'main' }}
path: baseline
path: ${{ env.BASELINE }}
lfs: true

- name: Setup benchmark environment
uses: ./diskann_rust/.github/actions/setup-disk-benchmark
with:
dataset: ${{ matrix.dataset }}
archive: ${{ matrix.archive }}
extract-to: diskann_rust/target/tmp

- name: Copy dataset to baseline
run: |
mkdir -p baseline/target/tmp
cp -r diskann_rust/target/tmp/${{ matrix.data_dir }} baseline/target/tmp/
mkdir -p ${{ env.BASELINE }}/target/tmp
cp -r ${{ env.DISKANN_RUST }}/target/tmp/${{ matrix.data_dir }} ${{ env.BASELINE }}/target/tmp/

- name: Run baseline benchmark
working-directory: baseline
working-directory: ${{ env.BASELINE }}
run: |
cargo run -p diskann-benchmark --features disk-index --release -- \
run --input-file ../diskann_rust/${{ env.PERF_INPUTS }}/${{ matrix.config }} \
run --input-file ${{ env.DISKANN_RUST }}/${{ env.PERF_INPUTS }}/${{ matrix.config }} \
--output-file target/tmp/${{ matrix.dataset }}_baseline.json

- name: Run current branch benchmark
working-directory: diskann_rust
working-directory: ${{ env.DISKANN_RUST }}
run: |
cargo run -p diskann-benchmark --features disk-index --release -- \
run --input-file ${{ env.PERF_INPUTS }}/${{ matrix.config }} \
--output-file target/tmp/${{ matrix.dataset }}_target.json

- name: Validate benchmark results
working-directory: diskann_rust
working-directory: ${{ env.DISKANN_RUST }}
run: |
cargo run -p diskann-benchmark --features disk-index --release -- \
check run \
--tolerances ${{ env.PERF_INPUTS }}/disk-index-tolerances.json \
--input-file ${{ env.PERF_INPUTS }}/${{ matrix.config }} \
--before ../baseline/target/tmp/${{ matrix.dataset }}_baseline.json \
--before ${{ env.BASELINE }}/target/tmp/${{ matrix.dataset }}_baseline.json \
--after target/tmp/${{ matrix.dataset }}_target.json

- name: Upload benchmark results
Expand All @@ -129,6 +140,6 @@ jobs:
with:
name: benchmark-results-${{ matrix.dataset }}
path: |
diskann_rust/target/tmp/${{ matrix.dataset }}_target.json
baseline/target/tmp/${{ matrix.dataset }}_baseline.json
${{ env.DISKANN_RUST }}/target/tmp/${{ matrix.dataset }}_target.json
${{ env.BASELINE }}/target/tmp/${{ matrix.dataset }}_baseline.json
retention-days: 30
Loading