From 17b355f0dfab7fd9486aead61a414028b79c8b8b Mon Sep 17 00:00:00 2001 From: Xavier Dupre Date: Tue, 1 Aug 2023 14:21:38 +0200 Subject: [PATCH 1/3] fix f8 --- _unittests/ut_validation/test_f8.py | 78 ++++++++++++++--- onnx_array_api/validation/f8.py | 126 ++++++++++++++++------------ 2 files changed, 141 insertions(+), 63 deletions(-) diff --git a/_unittests/ut_validation/test_f8.py b/_unittests/ut_validation/test_f8.py index a05caef..d5439ad 100644 --- a/_unittests/ut_validation/test_f8.py +++ b/_unittests/ut_validation/test_f8.py @@ -1,9 +1,11 @@ import os import pprint +import struct import unittest import warnings import numpy import pandas +from onnx import TensorProto from onnx_array_api.validation.f8 import ( CastFloat8, UndefinedCastError, @@ -285,6 +287,15 @@ def test_search_float32_into_fe4m3fn(self): ok="" if b == nf else "WRONG", true=value, add=add, + exponent=( + int.from_bytes( + struct.pack("> 23, + d1=v - fe4m3_to_float32_float(nf), + d2=v - fe4m3_to_float32_float(b), ) ) if wrong > 0: @@ -452,7 +463,9 @@ def test_search_e4m3_pow(self): raise AssertionError( f"p={p}, v={v}, " f"search={r1}:{display_fe4m3(r1)}={fe4m3_to_float32(r1)} != " - f"bit={r2}:{display_fe4m3(r2)}={fe4m3_to_float32(r2)}" + f"bit={r2}:{display_fe4m3(r2)}={fe4m3_to_float32(r2)} " + f"d1={v - fe4m3_to_float32(r1)} d2={v - fe4m3_to_float32(r2)} " + f"|d1|==|d2|={abs(v - fe4m3_to_float32(r1)) == abs(v - fe4m3_to_float32(r2))}" ) for p in range(1, 40): v = -(2 ** (-p)) @@ -465,7 +478,9 @@ def test_search_e4m3_pow(self): raise AssertionError( f"p={p}, v={v}, " f"search={r1}:{display_fe4m3(r1)}={fe4m3_to_float32(r1)} != " - f"bit={r2}:{display_fe4m3(r2)}={fe4m3_to_float32(r2)}" + f"bit={r2}:{display_fe4m3(r2)}={fe4m3_to_float32(r2)} " + f"d1={v - fe4m3_to_float32(r1)} d2={v - fe4m3_to_float32(r2)} " + f"|d1|==|d2|={abs(v - fe4m3_to_float32(r1)) == abs(v - fe4m3_to_float32(r2))}" ) def test_search_e5m2_pow(self): @@ -481,7 +496,9 @@ def test_search_e5m2_pow(self): raise AssertionError( f"p={p}, v={v}, " f"search={r1}:{display_fe5m2(r1)}={fe5m2_to_float32(r1)} != " - f"bit={r2}:{display_fe5m2(r2)}={fe5m2_to_float32(r2)}" + f"bit={r2}:{display_fe5m2(r2)}={fe5m2_to_float32(r2)} " + f"d1={v - fe4m3_to_float32(r1)} d2={v - fe5m2_to_float32(r2)} " + f"|d1|==|d2|={abs(v - fe5m2_to_float32(r1)) == abs(v - fe5m2_to_float32(r2))}" ) for p in range(1, 40): v = -(2 ** (-p)) @@ -494,7 +511,9 @@ def test_search_e5m2_pow(self): raise AssertionError( f"p={p}, v={v}, " f"search={r1}:{display_fe5m2(r1)}={fe5m2_to_float32(r1)} != " - f"bit={r2}:{display_fe5m2(r2)}={fe5m2_to_float32(r2)}" + f"bit={r2}:{display_fe5m2(r2)}={fe5m2_to_float32(r2)} " + f"d1={v - fe4m3_to_float32(r1)} d2={v - fe5m2_to_float32(r2)} " + f"|d1|==|d2|={abs(v - fe5m2_to_float32(r1)) == abs(v - fe5m2_to_float32(r2))}" ) def test_float32_to_fe4m3fn_inf(self): @@ -1152,13 +1171,50 @@ def test_float8_e5m2fnuz_negative_nan(self): self.assertTrue(numpy.isnan(back)) def test_fe4m3fn_to_float32_bug(self): - cases = [(1.8131605, 1.875)] - for val, expected in cases: - with self.subTest(value=val, expected=expected): - res = fe4m3_to_float32(search_float32_into_fe4m3(val)) - self.assertEqual(expected, res) - res = fe4m3_to_float32(float32_to_fe4m3(val)) - self.assertEqual(expected, res) + cases = [ + (0.00439453125, 0.00390625, TensorProto.FLOAT8E4M3FN), + (0.005859375, 0.005859375, TensorProto.FLOAT8E4M3FN), + (0.005759375, 0.005859375, TensorProto.FLOAT8E4M3FN), + (0.0046875, 0.00390625, TensorProto.FLOAT8E4M3FN), + (0.001953125, 0.001953125, TensorProto.FLOAT8E4M3FN), + (0.0029296875, 0.00390625, TensorProto.FLOAT8E4M3FN), + (0.002053125, 0.001953125, TensorProto.FLOAT8E4M3FN), + (0.00234375, 0.001953125, TensorProto.FLOAT8E4M3FN), + (0.0087890625, 0.0078125, TensorProto.FLOAT8E4M3FN), + (0.001171875, 0.001953125, TensorProto.FLOAT8E4M3FN), + (1.8131605, 1.875, TensorProto.FLOAT8E4M3FN), + (-100, -96, TensorProto.FLOAT8E4M3FNUZ), + (416, 384, TensorProto.FLOAT8E5M2FNUZ), + ] + for val, expected, pt in cases: + with self.subTest(value=val, expected=expected, proto=pt): + if pt == TensorProto.FLOAT8E4M3FN: + res = fe4m3_to_float32(search_float32_into_fe4m3(val)) + self.assertEqual(expected, res) + res = fe4m3_to_float32(float32_to_fe4m3(val)) + self.assertEqual(expected, res) + continue + if pt == TensorProto.FLOAT8E4M3FNUZ: + res = fe4m3_to_float32( + search_float32_into_fe4m3(val, uz=True), uz=True + ) + self.assertEqual(expected, res) + res = fe4m3_to_float32(float32_to_fe4m3(val, uz=True), uz=True) + self.assertEqual(expected, res) + continue + if pt == TensorProto.FLOAT8E5M2FNUZ: + res = fe5m2_to_float32( + search_float32_into_fe5m2(val, fn=True, uz=True), + fn=True, + uz=True, + ) + self.assertEqual(expected, res) + res = fe5m2_to_float32( + float32_to_fe5m2(val, fn=True, uz=True), fn=True, uz=True + ) + self.assertEqual(expected, res) + continue + raise AssertionError(f"Unexpected value for pt={pt}.") if __name__ == "__main__": diff --git a/onnx_array_api/validation/f8.py b/onnx_array_api/validation/f8.py index 649eab5..0439048 100644 --- a/onnx_array_api/validation/f8.py +++ b/onnx_array_api/validation/f8.py @@ -399,10 +399,9 @@ def find_closest_value(value, sorted_values): if d1 < d2: return sorted_values[a][1] if d1 == d2: - raise UndefinedCastError( - f"Unable to cast {value}, d1={d1}, d2={d2}, " - f"options are {sorted_values[a][1]} and {sorted_values[b][1]}." - ) + # Applies rule tie to even + ca, cb = sorted_values[a][1], sorted_values[b][1] + return cb if ca & 1 == 1 else ca return sorted_values[b][1] return sorted_values[a][1] @@ -520,18 +519,27 @@ def float32_to_fe4m3(x, fn: bool = True, uz: bool = False, saturate: bool = True if e < 116: pass elif e < 117: - ret |= 1 + # first positive number + if m > 0: + ret |= 1 if (m >> 23) & 1: # rounding ret += 1 - elif e < 120: # 127 - 8 + 1 - d = 119 - e - ret |= 1 << (2 - d) - ret |= m >> (21 + d) - if (m >> (20 + d)) & 1: + elif e < 120: + # denormalized number + ex = e - 119 + ret |= 1 << (2 + ex) + ret |= m >> (21 - ex) + mask = 1 << (20 - ex) + if m & mask and ( + ret & 1 + or m & (mask - 1) > 0 + or (m & mask and m & (mask << 1) and m & (mask - 1) == 0) + ): # rounding ret += 1 - elif e < 135: # 127 + 8 + elif e < 135: + # normalized number ex = e - 119 # 127 - 8 if ex == 0: ret |= 0x4 @@ -539,9 +547,7 @@ def float32_to_fe4m3(x, fn: bool = True, uz: bool = False, saturate: bool = True else: ret |= ex << 3 ret |= m >> 20 - if (m & 0x80000) and ( - (m & 0x100000) or (m & 0x7FFFF) - ): # round to nearest even + if m & 0x80000 and ((m & 0x100000) or (m & 0x7FFFF)): if (ret & 0x7F) < 0x7F: # rounding ret += 1 @@ -569,19 +575,25 @@ def float32_to_fe4m3(x, fn: bool = True, uz: bool = False, saturate: bool = True if e < 117: pass elif e < 118: - ret |= 1 - if (m >> 23) & 1: - # rounding - ret += 1 - elif e < 121: # 127 - 7 + 1 - d = 120 - e - ret |= 1 << (2 - d) - ret |= m >> (21 + d) - if (m >> (20 + d)) & 1: + # first positive number + if m > 0: + ret |= 1 + elif e < 121: + # denormalized number + ex = e - 120 + ret |= 1 << (2 + ex) + ret |= m >> (21 - ex) + mask = 1 << (20 - ex) + if m & mask and ( + ret & 1 + or m & (mask - 1) > 0 + or (m & mask and m & (mask << 1) and m & (mask - 1) == 0) + ): # rounding ret += 1 - elif e < 136: # 127 + 8 + 1 - ex = e - 120 # 127 - 7 + elif e < 136: + # normalized number + ex = e - 120 if ex == 0: ret |= 0x4 ret |= m >> 21 @@ -590,9 +602,7 @@ def float32_to_fe4m3(x, fn: bool = True, uz: bool = False, saturate: bool = True ret |= m >> 20 if (ret & 0x7F) == 0x7F: ret &= 0xFE - if (m & 0x80000) and ( - (m & 0x100000) or (m & 0x7FFFF) - ): # round to nearest even + if (m & 0x80000) and ((m & 0x100000) or (m & 0x7FFFF)): if (ret & 0x7F) < 0x7E: # rounding ret += 1 @@ -633,25 +643,31 @@ def float32_to_fe5m2(x, fn: bool = False, uz: bool = False, saturate: bool = Tru if e < 109: pass elif e < 110: - ret |= 1 + # first positive number + if m > 0: + ret |= 1 if (m >> 23) & 1: # rounding - # may be unused ret += 1 - elif e < 112: # 127 - 16 + 1 - d = 111 - e - ret |= 1 << (1 - d) - ret |= m >> (22 + d) - if (m >> (21 + d)) & 1: + elif e < 112: + # denormlized number + ex = e - 111 + ret |= 1 << (1 + ex) + ret |= m >> (22 - ex) + mask = 1 << (21 - ex) + if m & mask and ( + ret & 1 + or m & (mask - 1) > 0 + or (m & mask and m & (mask << 1) and m & (mask - 1) == 0) + ): # rounding ret += 1 - elif e < 143: # 127 + 15 + 1 - ex = e - 111 # 127 - 16 + elif e < 143: + # normalized number + ex = e - 111 ret |= ex << 2 ret |= m >> 21 - if m & 0x100000 and ( - (m & 0xFFFFF) or (m & 0x200000) - ): # round to nearest even + if m & 0x100000 and ((m & 0xFFFFF) or (m & 0x200000)): if (ret & 0x7F) < 0x7F: # rounding ret += 1 @@ -681,25 +697,31 @@ def float32_to_fe5m2(x, fn: bool = False, uz: bool = False, saturate: bool = Tru if e < 110: pass elif e < 111: - ret |= 1 + # first positive number + if m > 0: + ret |= 1 if (m >> 23) & 1: # rounding - # may be unused ret += 1 - elif e < 113: # 127 - 15 + 1 - d = 112 - e - ret |= 1 << (1 - d) - ret |= m >> (22 + d) - if (m >> (21 + d)) & 1: + elif e < 113: + # denormlized number + ex = e - 112 + ret |= 1 << (1 + ex) + ret |= m >> (22 - ex) + mask = 1 << (21 - ex) + if m & mask and ( + ret & 1 + or m & (mask - 1) > 0 + or (m & mask and m & (mask << 1) and m & (mask - 1) == 0) + ): # rounding ret += 1 - elif e < 143: # 127 + 15 + 1 - ex = e - 112 # 127 - 15 + elif e < 143: + # normalized number + ex = e - 112 ret |= ex << 2 ret |= m >> 21 - if m & 0x100000 and ( - (m & 0xFFFFF) or (m & 0x200000) - ): # round to nearest even + if m & 0x100000 and ((m & 0xFFFFF) or (m & 0x200000)): if (ret & 0x7F) < 0x7B: # rounding ret += 1 From 7d728c3f5eff4db33d37fd8fb39fdf6ace14b57c Mon Sep 17 00:00:00 2001 From: Xavier Dupre Date: Tue, 1 Aug 2023 14:24:22 +0200 Subject: [PATCH 2/3] fix --- .../temp_search_float32_into_fe4m3fn.xlsx | Bin 0 -> 5208 bytes .../temp_search_float32_into_fe5m2.xlsx | Bin 0 -> 12502 bytes _unittests/ut_validation/test_f8.py | 12 ++++++++---- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 _unittests/ut_validation/temp_search_float32_into_fe4m3fn.xlsx create mode 100644 _unittests/ut_validation/temp_search_float32_into_fe5m2.xlsx diff --git a/_unittests/ut_validation/temp_search_float32_into_fe4m3fn.xlsx b/_unittests/ut_validation/temp_search_float32_into_fe4m3fn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..916111e1847d5cb13d0d267269a7061cd5ac5e8e GIT binary patch literal 5208 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 I{p;!f03>Gt;s5{u literal 0 HcmV?d00001 diff --git a/_unittests/ut_validation/temp_search_float32_into_fe5m2.xlsx b/_unittests/ut_validation/temp_search_float32_into_fe5m2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..095fcba562f8ed30c3c5aebd9ed729a9cb91c1fd GIT binary patch literal 12502 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 z�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 Date: Tue, 1 Aug 2023 14:24:37 +0200 Subject: [PATCH 3/3] cleaning --- .../temp_search_float32_into_fe4m3fn.xlsx | Bin 5208 -> 0 bytes .../temp_search_float32_into_fe5m2.xlsx | Bin 12502 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 _unittests/ut_validation/temp_search_float32_into_fe4m3fn.xlsx delete mode 100644 _unittests/ut_validation/temp_search_float32_into_fe5m2.xlsx diff --git a/_unittests/ut_validation/temp_search_float32_into_fe4m3fn.xlsx b/_unittests/ut_validation/temp_search_float32_into_fe4m3fn.xlsx deleted file mode 100644 index 916111e1847d5cb13d0d267269a7061cd5ac5e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5208 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 I{p;!f03>Gt;s5{u diff --git a/_unittests/ut_validation/temp_search_float32_into_fe5m2.xlsx b/_unittests/ut_validation/temp_search_float32_into_fe5m2.xlsx deleted file mode 100644 index 095fcba562f8ed30c3c5aebd9ed729a9cb91c1fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12502 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 z�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