94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
124 lines
3.9 KiB
Python
124 lines
3.9 KiB
Python
import functools
|
|
from typing import Any
|
|
|
|
import tilelang
|
|
import tilelang.language as T
|
|
import torch
|
|
|
|
from sglang.srt.utils import is_hip
|
|
|
|
if is_hip():
|
|
FP8 = "float8_e5m2fnuz"
|
|
FP8_ = torch.float8_e5m2
|
|
else:
|
|
FP8 = "float8_e4m3"
|
|
FP8_ = torch.float8_e4m3fn
|
|
FP32 = "float32"
|
|
INT32 = "int32"
|
|
|
|
|
|
@functools.cache
|
|
def fp8_paged_mqa_logits_kernel(
|
|
head_dim: int = 128,
|
|
num_heads: int = 64,
|
|
block_size: int = 64,
|
|
clear_accum: bool = True,
|
|
) -> Any:
|
|
N = T.symbolic("batch_size")
|
|
L = T.symbolic("max_table_length")
|
|
S = T.symbolic("max_seq_len")
|
|
C = T.symbolic("num_blocks")
|
|
B = block_size
|
|
D = head_dim
|
|
H = num_heads
|
|
d_0, d_1 = T.dynamic("d_0, d_1")
|
|
|
|
assert D % 4 == 0
|
|
assert H % 4 == 0
|
|
assert D == 128
|
|
|
|
@tilelang.jit
|
|
def fp8_paged_mqa_logits(
|
|
q: T.Tensor[(N, H, D), FP8],
|
|
kvcache: T.StridedTensor[(C, B, D), (d_0, D, 1), FP8],
|
|
kvcache_scale: T.StridedTensor[(C, B), (d_1, 1), FP32],
|
|
weight: T.Tensor[(N, H), FP32],
|
|
seq_lens: T.Tensor[(N,), INT32],
|
|
page_table: T.Tensor[(N, L), INT32],
|
|
o: T.Tensor[(N, S), FP32],
|
|
) -> None:
|
|
_ = N, L, S, C, D, H, B, d_0, d_1
|
|
with T.Kernel(N) as bx:
|
|
seq_len = seq_lens[bx]
|
|
q_smem = T.alloc_shared((H, D), FP8)
|
|
q_s_frag = T.alloc_fragment((H,), FP32)
|
|
T.copy(q[bx, 0, 0], q_smem)
|
|
T.copy(weight[bx, 0], q_s_frag)
|
|
|
|
for i in T.Pipelined(T.ceildiv(seq_len, B), num_stages=2):
|
|
page = page_table[bx, i]
|
|
k_smem = T.alloc_shared((B, D), FP8)
|
|
k_s_frag = T.alloc_fragment((B,), FP32)
|
|
T.copy(kvcache[page, 0, 0], k_smem)
|
|
T.copy(kvcache_scale[page, 0], k_s_frag)
|
|
|
|
logits = T.alloc_fragment((B, H), FP32)
|
|
if not clear_accum:
|
|
T.fill(logits, 0.0)
|
|
T.gemm(
|
|
k_smem,
|
|
q_smem,
|
|
logits,
|
|
transpose_A=False,
|
|
transpose_B=True,
|
|
clear_accum=clear_accum,
|
|
)
|
|
|
|
for h, j in T.Parallel(H, B):
|
|
logits[j, h] = T.max(logits[j, h], 0.0) * q_s_frag[h]
|
|
logits_sum = T.alloc_fragment((B,), FP32)
|
|
T.reduce_sum(logits, logits_sum, dim=1)
|
|
for j in T.Parallel(B):
|
|
logits_sum[j] *= k_s_frag[j]
|
|
T.copy(logits_sum, o[bx, i * B])
|
|
|
|
return fp8_paged_mqa_logits
|
|
|
|
|
|
def tilelang_fp8_paged_mqa_logits(
|
|
q_fp8: torch.Tensor,
|
|
kvcache_fp8: torch.Tensor,
|
|
weight: torch.Tensor,
|
|
seq_lens: torch.Tensor,
|
|
page_table: torch.Tensor,
|
|
deep_gemm_metadata: Any,
|
|
max_seq_len: int,
|
|
clean_logits: bool = True,
|
|
) -> torch.Tensor:
|
|
_ = deep_gemm_metadata
|
|
batch_size, _, num_heads, head_dim = q_fp8.shape
|
|
block_size = kvcache_fp8.shape[1]
|
|
assert head_dim == 128, "TODO"
|
|
assert block_size == 64, "TODO"
|
|
assert q_fp8.shape == (batch_size, 1, num_heads, head_dim)
|
|
assert kvcache_fp8.shape[1:] == (block_size, 1, head_dim + 4)
|
|
assert weight.shape == (batch_size, num_heads)
|
|
assert seq_lens.shape == (batch_size,)
|
|
assert page_table.shape[0] == batch_size
|
|
assert clean_logits == False
|
|
|
|
logits = page_table.new_empty((batch_size, max_seq_len), dtype=torch.float32)
|
|
kernel = fp8_paged_mqa_logits_kernel(
|
|
head_dim=head_dim,
|
|
num_heads=num_heads,
|
|
block_size=block_size,
|
|
clear_accum=clean_logits,
|
|
)
|
|
q_fp8 = q_fp8.view(batch_size, num_heads, head_dim)
|
|
kvcache_fp8 = kvcache_fp8.view(-1, block_size * (head_dim + 4))
|
|
kvcache = kvcache_fp8[..., : block_size * head_dim].view(dtype=FP8_)
|
|
kvcache = kvcache.view(-1, block_size, head_dim)
|
|
kvcache_scale = kvcache_fp8[..., block_size * head_dim :].view(dtype=torch.float32)
|
|
kernel(q_fp8, kvcache, kvcache_scale, weight, seq_lens, page_table, logits)
|
|
return logits
|