dsv41-sampled-drafting / code /offload /dspark /d2 /train /packed_forward.py
ProprietaryLegal's picture
PLI Labs public snapshot 2026-10-28 (history squashed)
e1acc15
Raw History Blame Contribute Delete
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]
@triton.jit # 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)