Download code/offload/dspark/d2/train/packed_forward.py from ProprietaryLegal/dsv41-sampled-drafting: direct link, hf CLI and curl.
- Browser
- Download file 2.19 kB
-
https://huggingface.co/ProprietaryLegal/dsv41-sampled-drafting/resolve/main/code/offload/dspark/d2/train/packed_forward.py
- Command line
-
hf download hf://ProprietaryLegal/dsv41-sampled-drafting/code/offload/dspark/d2/train/packed_forward.py
-
curl -L -o packed_forward.py https://huggingface.co/ProprietaryLegal/dsv41-sampled-drafting/resolve/main/code/offload/dspark/d2/train/packed_forward.py
2.19 kB
| """Packed MXFP4 forward, decoded only in registers, FP64 reference sums. | |
| Backward alone materializes one selected expert matrix in BF16. This kernel | |
| does not expand a matrix/bank in device memory and has no expert gradients. | |
| """ | |
| from __future__ import annotations | |
| import torch | |
| from torch import Tensor | |
| import triton # type: ignore[import-untyped] | |
| import triton.language as tl # type: ignore[import-untyped] | |
| # type: ignore[untyped-decorator] | |
| def _packed(X, W, S, Y, K: tl.constexpr, N: tl.constexpr, # type: ignore[no-untyped-def] | |
| BN: tl.constexpr, BK: tl.constexpr) -> None: | |
| m = tl.program_id(0) | |
| n = tl.program_id(1)*BN + tl.arange(0, BN) | |
| kk = tl.arange(0, BK) | |
| total = tl.full((BN,), 0., tl.float64) | |
| for start in range(tl.cdiv(K, BK)): | |
| k = start*BK+kk | |
| a = tl.load(X+m*K+k, k < K, 0).to(tl.float32) | |
| packed = tl.load(W+n[:, None]*(K//2)+k[None, :]//2, | |
| (n[:, None] < N) & (k[None, :] < K), 0).to(tl.int32) | |
| code = (packed >> ((k[None, :] % 2)*4)) & 15 | |
| mag = code & 7 | |
| value = tl.where(mag < 2, mag.to(tl.float32)*.5, | |
| (2+(mag & 1)).to(tl.float32)*tl.exp2(((mag >> 1)-2).to(tl.float32))) | |
| value = tl.where((code & 8) != 0, -value, value) | |
| scale = tl.load(S+n[:, None]*(K//32)+k[None, :]//32, | |
| (n[:, None] < N) & (k[None, :] < K), 127).to(tl.int32) | |
| weight = value*tl.exp2((scale-127).to(tl.float32)) | |
| # QDQ activations and FP4 values have <=4 and <=3 significant bits; | |
| # their product is exact in FP32. Only the sum needs FP64. | |
| total += tl.sum((a[None, :]*weight).to(tl.float64), 1) | |
| tl.store(Y+m*N+n, total.to(tl.float32), n < N) | |
| def packed_matmul(x: Tensor, weight: Tensor, scale: Tensor) -> Tensor: | |
| K = x.shape[-1] | |
| n = weight.shape[0] | |
| x2 = x.reshape(-1, K).contiguous() | |
| out = torch.empty(x2.shape[0], n, device=x.device, dtype=torch.float32) | |
| _packed[(x2.shape[0], triton.cdiv(n, 4))](x2, weight, scale, out, K, n, BN=4, BK=128, | |
| num_warps=4, enable_fp_fusion=False) | |
| return out.reshape(*x.shape[:-1], n) | |