@@ -1265,7 +1265,9 @@ def test_accuracy_contiguous(shape, dtype):
12651265 gems_assert_equal (res_out , ref_out )
12661266
12671267
1268- def native_per_token_group_quant_fp8 (x , group_size , eps = 1e-10 , dtype = None ):
1268+ def native_per_token_group_quant_fp8 (
1269+ x , group_size , eps = 1e-10 , dtype = None , scale_ue8m0 = False
1270+ ):
12691271 if dtype is None :
12701272 dtype = flag_gems .SUPPORTED_FP8_DTYPE
12711273
@@ -1281,6 +1283,9 @@ def native_per_token_group_quant_fp8(x, group_size, eps=1e-10, dtype=None):
12811283 x_ = x .reshape (x .numel () // group_size , group_size )
12821284 amax = x_ .abs ().max (dim = - 1 , keepdim = True )[0 ].clamp (min = eps ).to (torch .float32 )
12831285 x_s = amax / fp8_max
1286+ if scale_ue8m0 :
1287+ min_val = torch .tensor (1e-10 , dtype = x_s .dtype , device = x_s .device )
1288+ x_s = torch .exp2 (torch .ceil (torch .log2 (torch .maximum (x_s .abs (), min_val ))))
12841289 x_q = (x_ / x_s ).clamp (min = fp8_min , max = fp8_max ).to (dtype )
12851290 x_q = x_q .reshape (x .shape )
12861291 x_s = x_s .reshape (x .shape [:- 1 ] + (x .shape [- 1 ] // group_size ,))
@@ -1294,14 +1299,21 @@ def native_per_token_group_quant_fp8(x, group_size, eps=1e-10, dtype=None):
12941299@pytest .mark .parametrize ("dtype" , FP8_QUANT_SHAPES ["DTYPES" ])
12951300@pytest .mark .parametrize ("d" , FP8_QUANT_SHAPES ["D" ])
12961301@pytest .mark .parametrize ("num_tokens" , FP8_QUANT_SHAPES ["NUM_TOKENS" ])
1297- def test_accuracy_per_token_group_quant_fp8 (num_tokens , d , dtype , group_size , seed ):
1302+ @pytest .mark .parametrize ("scale_ue8m0" , [True , False ])
1303+ def test_accuracy_per_token_group_quant_fp8 (
1304+ num_tokens , d , dtype , group_size , seed , scale_ue8m0
1305+ ):
12981306 torch .manual_seed (seed )
12991307 x = torch .rand (num_tokens , d , dtype = dtype , device = flag_gems .device )
13001308 ref_x = to_reference (x )
13011309
1302- ref_out , ref_scale = native_per_token_group_quant_fp8 (ref_x , group_size )
1310+ ref_out , ref_scale = native_per_token_group_quant_fp8 (
1311+ ref_x , group_size , scale_ue8m0 = scale_ue8m0
1312+ )
13031313 with flag_gems .use_gems ():
1304- out , scale = flag_gems .per_token_group_quant_fp8 (x , group_size )
1314+ out , scale = flag_gems .per_token_group_quant_fp8 (
1315+ x , group_size , scale_ue8m0 = scale_ue8m0
1316+ )
13051317
13061318 gems_assert_close (scale , ref_scale , dtype = torch .float32 )
13071319
0 commit comments