feat(kernel): add quanted silu fusion kernel
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
import os
|
||||||
from typing import TYPE_CHECKING, List, Optional
|
from typing import TYPE_CHECKING, List, Optional
|
||||||
|
|
||||||
import torch
|
import torch
|
||||||
@@ -42,7 +43,18 @@ _is_hip = is_hip()
|
|||||||
_is_npu = is_npu()
|
_is_npu = is_npu()
|
||||||
_is_cuda = is_cuda()
|
_is_cuda = is_cuda()
|
||||||
_use_aiter = get_bool_env_var("SGLANG_USE_AITER") and _is_hip
|
_use_aiter = get_bool_env_var("SGLANG_USE_AITER") and _is_hip
|
||||||
|
_USE_TAI_FUSED_CONTIG = _is_cuda and get_bool_env_var(
|
||||||
|
"SGLANG_DEEPGEMM_USE_TAI_FUSED_CONTIG"
|
||||||
|
)
|
||||||
|
_TAI_FUSED_CONTIG_MODE = os.getenv(
|
||||||
|
"SGLANG_DEEPGEMM_TAI_FUSED_CONTIG_MODE", "two_step"
|
||||||
|
).lower()
|
||||||
|
_USE_TAI_FUSED_CONTIG_THREE_STEP = (
|
||||||
|
_USE_TAI_FUSED_CONTIG and _TAI_FUSED_CONTIG_MODE == "three_step"
|
||||||
|
)
|
||||||
|
print(f"SGLANG_DEEPGEMM_USE_TAI_FUSED_CONTIG: {_USE_TAI_FUSED_CONTIG}, "
|
||||||
|
f"_USE_TAI_FUSED_CONTIG_THREE_STEP: {_USE_TAI_FUSED_CONTIG_THREE_STEP}"
|
||||||
|
)
|
||||||
if not (_is_npu or _is_hip) and _is_cuda:
|
if not (_is_npu or _is_hip) and _is_cuda:
|
||||||
from sgl_kernel import silu_and_mul
|
from sgl_kernel import silu_and_mul
|
||||||
|
|
||||||
@@ -76,6 +88,45 @@ def copy_list_to_gpu_no_ce(arr: List[int]):
|
|||||||
return tensor_gpu
|
return tensor_gpu
|
||||||
|
|
||||||
|
|
||||||
|
if _USE_TAI_FUSED_CONTIG:
|
||||||
|
from tai_kernel.quantization import (
|
||||||
|
fused_silu_and_mul_quant_fp8 as _contig_post_quant_fp8,
|
||||||
|
)
|
||||||
|
|
||||||
|
if _USE_TAI_FUSED_CONTIG_THREE_STEP:
|
||||||
|
from tai_kernel.quantization import (
|
||||||
|
fused_silu_and_mul_quant_fp8_three_step as _contig_post_quant_fp8,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
|
||||||
|
def _contig_post_quant_fp8(
|
||||||
|
x: torch.Tensor,
|
||||||
|
group_size: int,
|
||||||
|
column_major_scales: bool,
|
||||||
|
scale_tma_aligned: bool,
|
||||||
|
scale_ue8m0: bool,
|
||||||
|
) -> tuple[torch.Tensor, torch.Tensor]:
|
||||||
|
from sglang.srt.layers.quantization.fp8_kernel import (
|
||||||
|
sglang_per_token_group_quant_fp8,
|
||||||
|
)
|
||||||
|
|
||||||
|
down_input = torch.empty(
|
||||||
|
x.shape[:-1] + (x.shape[-1] // 2,),
|
||||||
|
device=x.device,
|
||||||
|
dtype=torch.bfloat16,
|
||||||
|
)
|
||||||
|
silu_and_mul(x.view(-1, x.shape[-1]), down_input.view(-1, down_input.shape[-1]))
|
||||||
|
x_q, x_s = sglang_per_token_group_quant_fp8(
|
||||||
|
x=down_input,
|
||||||
|
group_size=group_size,
|
||||||
|
column_major_scales=column_major_scales,
|
||||||
|
scale_tma_aligned=scale_tma_aligned,
|
||||||
|
scale_ue8m0=scale_ue8m0,
|
||||||
|
)
|
||||||
|
del down_input
|
||||||
|
return x_q, x_s
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class DeepGemmRunnerInput(RunnerInput):
|
class DeepGemmRunnerInput(RunnerInput):
|
||||||
hidden_states: torch.Tensor
|
hidden_states: torch.Tensor
|
||||||
@@ -138,9 +189,6 @@ class DeepGemmRunnerCore(MoeRunnerCore):
|
|||||||
running_state: dict,
|
running_state: dict,
|
||||||
) -> torch.Tensor:
|
) -> torch.Tensor:
|
||||||
from sglang.srt.layers.moe.ep_moe.kernels import tma_align_input_scale
|
from sglang.srt.layers.moe.ep_moe.kernels import tma_align_input_scale
|
||||||
from sglang.srt.layers.quantization.fp8_kernel import (
|
|
||||||
sglang_per_token_group_quant_fp8,
|
|
||||||
)
|
|
||||||
|
|
||||||
hidden_states = runner_input.hidden_states
|
hidden_states = runner_input.hidden_states
|
||||||
hidden_states_scale = runner_input.hidden_states_scale
|
hidden_states_scale = runner_input.hidden_states_scale
|
||||||
@@ -176,33 +224,23 @@ class DeepGemmRunnerCore(MoeRunnerCore):
|
|||||||
|
|
||||||
dispose_tensor(hidden_states)
|
dispose_tensor(hidden_states)
|
||||||
dispose_tensor(hidden_states_scale)
|
dispose_tensor(hidden_states_scale)
|
||||||
|
down_input_fp8, down_input_scale = _contig_post_quant_fp8(
|
||||||
down_input = torch.empty(
|
x=gateup_output,
|
||||||
(
|
group_size=scale_block_size,
|
||||||
all_tokens,
|
|
||||||
N // 2,
|
|
||||||
),
|
|
||||||
device=gateup_output.device,
|
|
||||||
dtype=torch.bfloat16,
|
|
||||||
)
|
|
||||||
silu_and_mul(gateup_output.view(-1, N), down_input)
|
|
||||||
del gateup_output
|
|
||||||
|
|
||||||
down_input_fp8, down_input_scale = sglang_per_token_group_quant_fp8(
|
|
||||||
down_input,
|
|
||||||
scale_block_size,
|
|
||||||
column_major_scales=deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0,
|
column_major_scales=deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0,
|
||||||
scale_tma_aligned=deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0,
|
scale_tma_aligned=deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0,
|
||||||
scale_ue8m0=deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0,
|
scale_ue8m0=deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0,
|
||||||
)
|
)
|
||||||
del down_input
|
del gateup_output
|
||||||
|
|
||||||
down_output = torch.empty(
|
down_output = torch.empty(
|
||||||
(all_tokens, K),
|
(all_tokens, K),
|
||||||
device=hidden_states_device,
|
device=hidden_states_device,
|
||||||
dtype=torch.bfloat16,
|
dtype=torch.bfloat16,
|
||||||
)
|
)
|
||||||
if not deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0:
|
if (
|
||||||
|
not deep_gemm_wrapper.DEEPGEMM_SCALE_UE8M0
|
||||||
|
and not _USE_TAI_FUSED_CONTIG_THREE_STEP
|
||||||
|
):
|
||||||
down_input_scale = tma_align_input_scale(down_input_scale)
|
down_input_scale = tma_align_input_scale(down_input_scale)
|
||||||
|
|
||||||
deep_gemm_wrapper.grouped_gemm_nt_f8f8bf16_contig(
|
deep_gemm_wrapper.grouped_gemm_nt_f8f8bf16_contig(
|
||||||
|
|||||||
Reference in New Issue
Block a user