Tiny fix transform_scale_ue8m0 wrong output in some scenarios (#14003)
This commit is contained in:
@@ -575,21 +575,59 @@ def transform_scale_ue8m0_inplace(param, mn):
|
||||
|
||||
|
||||
# NOTE copy and modified from DeepGEMM
|
||||
def transform_scale_ue8m0(sf, mn):
|
||||
def transform_scale_ue8m0(sf, mn, use_torch_impl: bool = False):
|
||||
import deep_gemm.utils.layout
|
||||
|
||||
get_mn_major_tma_aligned_packed_ue8m0_tensor = (
|
||||
_get_mn_major_tma_aligned_packed_ue8m0_tensor_torch_impl
|
||||
if use_torch_impl
|
||||
else deep_gemm.utils.layout.get_mn_major_tma_aligned_packed_ue8m0_tensor
|
||||
)
|
||||
|
||||
sf = sf.index_select(-2, torch.arange(mn, device=sf.device) // 128)
|
||||
sf = deep_gemm.utils.layout.get_mn_major_tma_aligned_packed_ue8m0_tensor(sf)
|
||||
sf = get_mn_major_tma_aligned_packed_ue8m0_tensor(sf)
|
||||
return sf
|
||||
|
||||
|
||||
# Copied from DeepGEMM tests
|
||||
def _get_mn_major_tma_aligned_packed_ue8m0_tensor_torch_impl(
|
||||
x: torch.Tensor,
|
||||
) -> torch.Tensor:
|
||||
from deep_gemm.utils import align, get_tma_aligned_size
|
||||
|
||||
assert x.dtype == torch.float and x.dim() in (2, 3)
|
||||
|
||||
# First, convert into UE8M0 `uint8_t`
|
||||
ue8m0_tensor = (x.view(torch.int) >> 23).to(torch.uint8)
|
||||
|
||||
# Second, make padded packed tensors
|
||||
mn, k = x.shape[-2], x.shape[-1]
|
||||
remove_dim = False
|
||||
if x.dim() == 2:
|
||||
x, remove_dim = x.unsqueeze(0), True
|
||||
b = x.shape[0]
|
||||
aligned_mn = get_tma_aligned_size(mn, 4)
|
||||
aligned_k = align(k, 4)
|
||||
padded = torch.zeros((b, aligned_mn, aligned_k), device=x.device, dtype=torch.uint8)
|
||||
padded[:, :mn, :k] = ue8m0_tensor
|
||||
padded = padded.view(-1).view(dtype=torch.int).view(b, aligned_mn, aligned_k // 4)
|
||||
|
||||
# Finally, transpose
|
||||
transposed = torch.zeros(
|
||||
(b, aligned_k // 4, aligned_mn), device=x.device, dtype=torch.int
|
||||
).mT
|
||||
transposed[:, :, :] = padded
|
||||
aligned_x = transposed[:, :mn, :]
|
||||
return aligned_x.squeeze(0) if remove_dim else aligned_x
|
||||
|
||||
|
||||
def inverse_transform_scale_ue8m0(sf_packed, mn):
|
||||
sf_fp32 = _inverse_transform_scale_ue8m0_impl(sf_packed)
|
||||
# Can call consistency check every time since this is only called on startup
|
||||
sf_packed_recreated = transform_scale_ue8m0(sf_fp32, mn=mn)
|
||||
sf_packed_recreated = transform_scale_ue8m0(sf_fp32, mn=mn, use_torch_impl=True)
|
||||
assert torch.all(
|
||||
sf_packed == sf_packed_recreated
|
||||
), f"{sf_packed=} {sf_packed_recreated}"
|
||||
), f"{sf_packed=} {sf_packed_recreated=} {sf_fp32=}"
|
||||
return sf_fp32
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user