Download code/offload/dspark/kernels/mxfp4/reference.py from ProprietaryLegal/dsv41-sampled-drafting: direct link, hf CLI and curl.
- Browser
- Download file 3.06 kB
-
https://huggingface.co/ProprietaryLegal/dsv41-sampled-drafting/resolve/main/code/offload/dspark/kernels/mxfp4/reference.py
- Command line
-
hf download hf://ProprietaryLegal/dsv41-sampled-drafting/code/offload/dspark/kernels/mxfp4/reference.py
-
curl -L -o reference.py https://huggingface.co/ProprietaryLegal/dsv41-sampled-drafting/resolve/main/code/offload/dspark/kernels/mxfp4/reference.py
3.06 kB
| """Independent CPU E2M1/E8M0 decoder and admission; no CUDA import or access.""" | |
| from __future__ import annotations | |
| import torch | |
| E2M1: tuple[float, ...] = (0., .5, 1., 1.5, 2., 3., 4., 6., | |
| -0., -.5, -1., -1.5, -2., -3., -4., -6.) | |
| def decode_codes(codes: torch.Tensor, scales: torch.Tensor) -> torch.Tensor: | |
| """Float64 oracle, including signed zero, scale-0 and NaN scale-255.""" | |
| if codes.device.type != 'cpu' or scales.device.type != 'cpu': | |
| raise ValueError('reference decoder requires CPU tensors') | |
| values = torch.tensor(E2M1, dtype=torch.float64)[codes.long()] | |
| values = torch.ldexp(values, scales.to(torch.int32) - 127) | |
| return torch.where(scales == 255, float('nan'), values) | |
| def unpack(packed: torch.Tensor, scales: torch.Tensor) -> torch.Tensor: | |
| if packed.dtype != torch.uint8 or scales.dtype != torch.uint8: | |
| raise ValueError('checkpoint codes and E8M0 scales must be uint8') | |
| if packed.ndim != 3 or scales.shape != (*packed.shape[:2], packed.shape[2] // 16): | |
| raise ValueError('expected [E,N,K/2] codes and [E,N,K/32] scales') | |
| if packed.shape[-1] % 16: | |
| raise ValueError('K must be a multiple of group size 32') | |
| codes = torch.stack((packed & 15, packed >> 4), dim=-1).flatten(-2) | |
| return decode_codes(codes, scales.repeat_interleave(32, dim=-1)) | |
| def admit(packed: torch.Tensor, scales: torch.Tensor) -> dict[str, int]: | |
| """Bounded load-time validation. Never narrow/repair unsupported native values. | |
| Inspect one expert at a time so preparing a full bank never expands the | |
| checkpoint in RAM. BF16 subnormals decode exactly but MMA may flush them: | |
| reject them for computation rather than asserting unsupported fidelity. | |
| """ | |
| if packed.device.type != 'cpu' or scales.device.type != 'cpu': | |
| raise ValueError('admission must run on the CPU before GPU allocation') | |
| if packed.ndim != 3 or packed.shape[0] == 0 or packed.shape[1] == 0: | |
| raise ValueError('expected nonempty expert bank') | |
| result = {'values': 0, 'negative_zeros': 0, 'scale_min': 255, 'scale_max': 0} | |
| for e in range(packed.shape[0]): | |
| decoded = unpack(packed[e:e+1], scales[e:e+1]) | |
| if not bool(torch.isfinite(decoded).all()): | |
| raise ValueError(f'expert {e}: NaN/nonfinite native scale/value') | |
| widened = decoded.to(torch.bfloat16).to(torch.float64) | |
| if not torch.equal(decoded, widened): | |
| raise ValueError(f'expert {e}: native values not exactly representable in BF16') | |
| subnormal = (decoded != 0) & (decoded.abs() < torch.finfo(torch.bfloat16).tiny) | |
| if bool(subnormal.any()): | |
| raise ValueError(f'expert {e}: BF16 subnormal operands require a wider arithmetic path') | |
| result['values'] += decoded.numel() | |
| result['negative_zeros'] += int(((decoded == 0) & decoded.signbit()).sum()) | |
| result['scale_min'] = min(result['scale_min'], int(scales[e].min())) | |
| result['scale_max'] = max(result['scale_max'], int(scales[e].max())) | |
| return result | |