Skip to content

[ENH] Optimize ROCKET GPU PPV calculation for 1.45× speedup#3232

Merged
TonyBagnall merged 1 commit intoaeon-toolkit:mainfrom
Adityakushwaha2006:GPU/base-optimisation
Feb 28, 2026
Merged

[ENH] Optimize ROCKET GPU PPV calculation for 1.45× speedup#3232
TonyBagnall merged 1 commit intoaeon-toolkit:mainfrom
Adityakushwaha2006:GPU/base-optimisation

Conversation

@Adityakushwaha2006
Copy link
Contributor

Reference Issues/PRs

None

What does this implement/fix? Explain your changes.

This PR optimizes the _get_ppv() method in base.py for ROCKET GPU transformers by replacing integer operations with GPU optimised float32 operations

Performance Impact:

  • PPV calculation: 1.45× faster (measured on GTX 1650 Ti)
    PPV calculation takes around 15-20% of the time in rocket aswell so extrapolating this speed up ,it should cause a ~5% speedup in the GPU variant. (both measures approximate)

Benchmark across dataset sizes:

Dataset Size Old (ms) New (ms) Speedup
Small 100×100 1.859 1.515 1.23×
Medium 1000×500 2.047 1.413 1.45×
Large 10000×100 2.133 1.285 1.66×

Verified Correctness:

  • Mathematically equivalent to original
  • All edge cases tested
  • Zero breaking changes

Does your contribution introduce a new dependency? If yes, which one?

None

Any other comments?

GPUs handle floating point math much faster than integer counting, so switching to float operations gives a good speed boost.

For all contributions
  • [ x] I've added myself to the list of contributors. Alternatively, you can use the @all-contributors bot to do this for you after the PR has been merged.
  • [x ] The PR title starts with either [ENH], [MNT], [DOC], [BUG], [REF], [DEP] or [GOV] indicating whether the PR topic is related to enhancement, maintenance, documentation, bugs, refactoring, deprecation or governance.
For new estimators and functions
  • I've added the estimator/function to the online API documentation.
  • (OPTIONAL) I've added myself as a __maintainer__ at the top of relevant files and want to be contacted regarding its maintenance. Unmaintained files may be removed. This is for the full file, and you should not add yourself if you are just making minor changes or do not want to help maintain its contents.
For developers with write access
  • (OPTIONAL) I've updated aeon's CODEOWNERS to receive notifications about future changes to these files.

@aeon-actions-bot aeon-actions-bot bot added enhancement New feature, improvement request or other non-bug code enhancement transformations Transformations package labels Jan 9, 2026
@aeon-actions-bot
Copy link
Contributor

Thank you for contributing to aeon

I have added the following labels to this PR based on the title: [ enhancement ].
I have added the following labels to this PR based on the changes made: [ transformations ]. Feel free to change these if they do not properly represent the PR.

The Checks tab will show the status of our automated tests. You can click on individual test runs in the tab or "Details" in the panel below to see more information if there is a failure.

If our pre-commit code quality check fails, any trivial fixes will automatically be pushed to your PR unless it is a draft.

Don't hesitate to ask questions on the aeon Discord channel if you have any.

PR CI actions

These checkboxes will add labels to enable/disable CI functionality for this PR. This may not take effect immediately, and a new commit may be required to run the new configuration.

  • Run pre-commit checks for all files
  • Run mypy typecheck tests
  • Run all pytest tests and configurations
  • Run all notebook example tests
  • Run numba-disabled codecov tests
  • Stop automatic pre-commit fixes (always disabled for drafts)
  • Disable numba cache loading
  • Regenerate expected results for testing
  • Push an empty commit to re-run CI checks

@MatthewMiddlehurst
Copy link
Member

MatthewMiddlehurst commented Feb 15, 2026

Could you post a snippet showing it produces the same output as before? Alternatively are there tests that check the output that still pass. Generally experiment results are harder to trust if you do not show the code ran.

@TonyBagnall
Copy link
Contributor

hi, thanks @Adityakushwaha2006 and sorry it took so long. So I have run this for correctness on CPU only for now just for correctness sanity

def _get_ppv1(x):
    #New
    positive_mask = tf.cast(x > 0, tf.float32)
    return tf.reduce_mean(positive_mask, axis=1)


def _get_ppv2(x):
    # Old
    x_pos = tf.math.count_nonzero(tf.nn.relu(x), axis=1)
    return tf.math.divide(x_pos, x.shape[1])

and even on CPU its significantly faster
image
ran with even longer series
image

so looks good, but there are tiny numeric differences around 1e-08. Given how central this function is, should speed up rocket classifiers. I'll test overall performance next on UCR.

only issue chatgpt raises is with different handling of NaN

"Two small caveats if you ever switch _get_ppv1 to the positive_mask version:

  1. NaNs differ: relu(NaN) is NaN and is “nonzero”, but (NaN > 0) is False, so the two approaches can disagree if x contains NaNs.
  2. dtype can differ: count_nonzero path often yields float64 after division, mask-mean yields float32, values are the same."
    cant see that being an issue
    f you see NaNs in x, and you are actually comparing a relu+count_nonzero version against a (x > 0) mask version, NaNs can create genuine differences (NaN counts as nonzero after relu, but (NaN > 0) is False).

@TonyBagnall
Copy link
Contributor

ran it in rocket classifier pre and before on 21 on the train, no sig diff in accuracy (7/8/6 W/L/D, 0.0018 diff in average accuracy, 66% of the time taken after the change. Im calling this as a good change

Copy link
Contributor

@TonyBagnall TonyBagnall left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you for the contribution

@TonyBagnall TonyBagnall merged commit 218d517 into aeon-toolkit:main Feb 28, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature, improvement request or other non-bug code enhancement transformations Transformations package

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants