Align ConvertPrecision with LSB-first nibble packing for u4/i4 types #32144
+51
−121
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR fixes the nibble ordering inconsistency in 4-bit types (u4/i4) where ConvertPrecision transformation was not aligned with the current LSB-first packing standard.
Problem
ConvertPrecision transformation was using deprecated MSB-first nibble order (not updated after PR #20371), while Convert operation with ConstantFolding used the correct LSB-first order via element::iterator. This created inconsistencies between
different code paths for the same input.
Path inconsistency before fix:
This led to incorrect values in INT4 quantized models (like Phi-3) when different optimization paths were applied.
Solution
Refactored
convert_low_precisions_int()to useConvert::evaluate()instead of custom conversion logic. This ensures consistent LSB-first nibble packing across all conversion paths, aligning with the standard established in PR #20371.Path consistency after fix:
Tickets: