non_max_suppression_padded is very slow and doesn't appear to be using a cuda or GPU implementation
### Issue type

Performance

### Have you reproduced the bug with TensorFlow Nightly?

No

### Source

source

### TensorFlow version

2.14

### Custom code

Yes

### OS platform and distribution

_No response_

### Mobile device

_No response_

### Python version

_No response_

### Bazel version

_No response_

### GCC/compiler version

_No response_

### CUDA/cuDNN version

_No response_

### GPU model and memory

_No response_

### Current behavior?

Trying to use tf.image.non_max_suppression_padded results in very slow inference. This appears to be due to a lack of C++/CUDA implementation. Check out [this link](https://colab.research.google.com/drive/1Ost8zmFJJrtgDCPOIaiMatFFTNlDUr4N?usp=sharing) for an example.

The KerasCV NonMaxSuppression layer uses tf.image.non_max_suppression_padded, which appears to call non_max_suppression_padded_v2 ([link](https://github.com/tensorflow/tensorflow/blob/v2.14.0/tensorflow/python/ops/image_ops_impl.py#L5387-L5477)). Looking into the code for non_max_suppression_padded_v2, it appears to use a Python implementation, rather than a C++/CUDA implementation. Is there a reason for this? Has the implementation not been done? You can see a discussion of this issue in the KerasCV repo ([link](https://github.com/keras-team/keras-cv/issues/2014)).

### Standalone code to reproduce the issue

```shell
# Running example can be found here: https://colab.research.google.com/drive/1Ost8zmFJJrtgDCPOIaiMatFFTNlDUr4N?usp=sharing

! pip install --upgrade -q git+https://github.com/keras-team/keras-cv

import logging
import tensorflow as tf
import os
import numpy as np
import keras_core as keras
import keras_cv

print(tf.__version__)

image_path = tf.keras.utils.get_file(origin="https://placekitten.com/g/200/300")

def preprocess_image(file_path):
    inference_resizing = keras_cv.layers.Resizing(
        640, 640, bounding_box_format="xywh", pad_to_aspect_ratio=True)
    image = keras.utils.load_img(file_path)
    image = np.array(image)
    return inference_resizing([image])

inputs = preprocess_image(image_path)
model = keras_cv.models.RetinaNet.from_preset(
    "retinanet_resnet50_pascalvoc", bounding_box_format="xywh")

# Slow (single class NMS)
# model.prediction_decoder = keras_cv.layers.NonMaxSuppression(
#     bounding_box_format="xywh",
#     from_logits=True,
#     iou_threshold=0.5,
#     confidence_threshold=0.5,
# )

# Fast (multiclass NMS)
model.prediction_decoder = keras_cv.layers.MultiClassNonMaxSuppression(
    bounding_box_format="xywh",
    from_logits=True,
    iou_threshold=0.5,
    confidence_threshold=0.5,
)

y_pred = model.predict(inputs)
```


### Relevant log output

_No response_