From afe74899c77ed1fc9edb5f5d7dd38eaf528a3101 Mon Sep 17 00:00:00 2001 From: Malyala Karthik Date: Sun, 2 Nov 2025 12:29:57 +0530 Subject: [PATCH] Verify GPU memory consistency for Huber loss (delta=0.5) --- keras/src/losses/losses.py | 4 +++- keras/src/losses/losses_test.py | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/keras/src/losses/losses.py b/keras/src/losses/losses.py index 4bf2ba062253..35f058e9431e 100644 --- a/keras/src/losses/losses.py +++ b/keras/src/losses/losses.py @@ -1972,7 +1972,9 @@ def huber(y_true, y_pred, delta=1.0): delta = ops.convert_to_tensor(delta, dtype=y_pred.dtype) error = ops.subtract(y_pred, y_true) abs_error = ops.abs(error) - half = ops.convert_to_tensor(0.5, dtype=abs_error.dtype) + half = ops.cast(ops.convert_to_tensor(0.5), dtype=abs_error.dtype) + delta = ops.cast(delta, dtype=abs_error.dtype) + return ops.mean( ops.where( abs_error <= delta, diff --git a/keras/src/losses/losses_test.py b/keras/src/losses/losses_test.py index fe0d557d96c9..a235139172aa 100644 --- a/keras/src/losses/losses_test.py +++ b/keras/src/losses/losses_test.py @@ -708,6 +708,40 @@ def test_dtype_arg(self): loss = h_obj(self.y_true, self.y_pred) self.assertDType(loss, "bfloat16") + def test_huber_memory_usage_debug_05(self): + import tensorflow as tf + + import keras + + print("\n[Huber GPU Memory Debug: delta=0.5]") + gpus = tf.config.experimental.list_physical_devices("GPU") + if not gpus: + print("No GPU found. Skipping test.") + return + try: + for gpu in gpus: + tf.config.experimental.set_memory_growth(gpu, True) + except RuntimeError as e: + print(f"[Info] GPU memory growth already set or initialized: {e}") + + x = np.random.rand(1000, 1) + y = ((3 * x) + 2) + np.random.randn(1000, 1) + huber_loss = keras.losses.Huber(delta=0.5) + loss = huber_loss(y, x) + print(f"Huber loss: {loss.numpy():.6f}") + + memory = sum( + tf.config.experimental.get_memory_info(f"GPU:{i}")["current"] + for i in range(len(gpus)) + ) + print(f"GPU memory usage: {memory} bytes") + + # sanity check for stable GPU usage (adjust threshold as needed) + assert memory > 0, ( + f"GPU memory not allocated or usage is zero. " + f"Current usage: {memory} bytes" + ) + class LogCoshTest(testing.TestCase): def setup(self):