coremltools icon indicating copy to clipboard operation
coremltools copied to clipboard

**Fix reciprocal op crash on int32 input by raising ValueError (Fixes #2579)**

Open Pranaykarvi opened this issue 4 months ago • 5 comments

📝 Description

This PR addresses Issue #2579, where calling the reciprocal MIL op with int32 inputs causes an unexpected crash during SSA conversion.

🔧 Problem

Using mb.reciprocal(x=int32_tensor) leads to a runtime crash because reciprocal operations are invalid for int32 types. The crash occurred deep within the MIL SSA conversion without a clear error message, making it hard to debug.


✅ Fix

  • Added an explicit ValueError in the type_inference method of the reciprocal op for int32 inputs.
  • This change provides clear, early feedback and avoids internal MIL crashes.

🧪 Tests

  • ✅ New unit test added in test_inverse_conversion.py to verify the ValueError is raised correctly.
  • ✅ Existing tests pass with pytest coremltools/test/test_inverse_conversion.py.

🧠 Files Changed

  • coremltools/converters/mil/mil/ops/defs/elementwise.py
    ➤ Added type check and exception for int32 inputs in reciprocal.type_inference.

  • coremltools/test/test_inverse_conversion.py
    ➤ Added test case to ensure invalid int32 input raises ValueError.


🔗 Related Issue

Closes #2579

Pranaykarvi avatar Aug 05 '25 07:08 Pranaykarvi

Hey @junpeiz! Could you please review my PR #2580 ? Thanks! 😊

Pranaykarvi avatar Aug 05 '25 07:08 Pranaykarvi

Thank you @Pranaykarvi for contributing! I will let this week's oncaller (@abhishek-patel6) to take a look.

junpeiz avatar Aug 05 '25 20:08 junpeiz

Hi, @Pranaykarvi . Thank you for the patch! I think that the conversion already throws an error. Original issue expects the torch compiler to implicitly convert to float. Probably something like https://github.com/apple/coremltools/blob/d4b83adcea0ba1d3ae01b06565bed5aa3bcd3e1c/coremltools/converters/mil/frontend/torch/ops.py#L7103-L7108

abhishek-patel6 avatar Aug 05 '25 22:08 abhishek-patel6

Thanks @abhishek-patel6!

I checked ops.py, and unlike log1p, there’s no frontend handler for inverse or reciprocal. The op is introduced internally during MIL lowering (e.g., for 16 / x.shape[0]), so casting can't happen in the frontend.

That’s why I added the check directly in the MIL op to raise a clear ValueError — it’s the only reliable place to catch this issue. Let me know if you’d prefer an alternate approach!

Pranaykarvi avatar Aug 06 '25 08:08 Pranaykarvi

Thanks @abhishek-patel6!

I checked ops.py, and unlike log1p, there’s no frontend handler for inverse or reciprocal. The op is introduced internally during MIL lowering (e.g., for 16 / x.shape[0]), so casting can't happen in the frontend.

That’s why I added the check directly in the MIL op to raise a clear ValueError — it’s the only reliable place to catch this issue. Let me know if you’d prefer an alternate approach!

I think there is a handler for inverse.

https://github.com/apple/coremltools/blob/d4b83adcea0ba1d3ae01b06565bed5aa3bcd3e1c/coremltools/converters/mil/frontend/torch/ops.py#L7087-L7090

Anyways, the linked issue requests for implicit conversion to float IIUC. Throwing an error message earlier wouldn't fix their original issue still.

abhishek-patel6 avatar Aug 11 '25 23:08 abhishek-patel6