[diffusion] optimization: unfused w2 bias on SM12.x (cuBLAS 16x16 kernel mis-dispatch) for minimax-h3 vae decoder: (#37835)
This commit is contained in:
+29
-1
@@ -1,5 +1,6 @@
|
|||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
# Transformer building blocks for the MiniMax H3 visual VAE ViT decoder.
|
# Transformer building blocks for the MiniMax H3 visual VAE ViT decoder.
|
||||||
|
import functools
|
||||||
import math
|
import math
|
||||||
from contextlib import nullcontext
|
from contextlib import nullcontext
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
@@ -33,6 +34,33 @@ def _scaled_residual_add(residual, x, scale):
|
|||||||
return residual + x * scale if fused is None else fused
|
return residual + x * scale if fused is None else fused
|
||||||
|
|
||||||
|
|
||||||
|
@functools.lru_cache(maxsize=1)
|
||||||
|
def _is_sm120() -> bool:
|
||||||
|
return bool(current_platform.is_sm120())
|
||||||
|
|
||||||
|
|
||||||
|
def _unfused_bias_linear(
|
||||||
|
linear: nn.Linear, hidden_states: torch.Tensor
|
||||||
|
) -> torch.Tensor:
|
||||||
|
"""``linear`` as a plain matmul plus a separate bias add on SM12.x.
|
||||||
|
|
||||||
|
For the decoder's w2 shape ([~1800, 8192] x [8192, 2048], fp16/bf16) the
|
||||||
|
fused ``addmm`` epilogue makes cuBLAS on a GB10 pick a 16x16 wmma kernel
|
||||||
|
that runs at 14 TFLOPS; the same product without the fused bias runs at
|
||||||
|
76-91 TFLOPS (measured: 4.0 ms -> 0.8 ms per call, 3780 calls per decode).
|
||||||
|
"""
|
||||||
|
if (
|
||||||
|
linear.bias is None
|
||||||
|
or not hidden_states.is_cuda
|
||||||
|
or hidden_states.dtype != linear.weight.dtype
|
||||||
|
or not _is_sm120()
|
||||||
|
):
|
||||||
|
return linear(hidden_states)
|
||||||
|
out = torch.matmul(hidden_states, linear.weight.t())
|
||||||
|
out += linear.bias
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
class FeedForward(nn.Module):
|
class FeedForward(nn.Module):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -99,7 +127,7 @@ class FeedForward(nn.Module):
|
|||||||
else:
|
else:
|
||||||
hidden_states = self.act_fn(hidden_states)
|
hidden_states = self.act_fn(hidden_states)
|
||||||
|
|
||||||
hidden_states = self.w2(hidden_states)
|
hidden_states = _unfused_bias_linear(self.w2, hidden_states)
|
||||||
return hidden_states
|
return hidden_states
|
||||||
|
|
||||||
def _get_forward_impl(self):
|
def _get_forward_impl(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user