Skip to content

Commit 79f47a9

Browse files
committed
Migrate rotary_position_embedding to ninetoothed.build
1 parent c7f8d52 commit 79f47a9

1 file changed

Lines changed: 50 additions & 11 deletions

File tree

ops/ninetoothed/kernels/rotary_position_embedding.py

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
import ninetoothed
44
from ninetoothed import Tensor
55

6+
from ops.ninetoothed.kernels._common import DTYPES, build
67

7-
def arrangement(input, sin_table, cos_table, interleaved=True):
8-
emb_dim = input.shape[-1]
9-
tile_shape = (1, 1, 1, emb_dim // 2)
8+
9+
def arrangement(input, sin_table, cos_table, head_dim, interleaved):
10+
tile_shape = (1, 1, 1, head_dim // 2)
1011

1112
if interleaved:
1213
strides = (-1, -1, -1, 1)
@@ -40,17 +41,55 @@ def application(input, sin_table, cos_table):
4041
input[1] = input_0 * sin_table_loaded + input_1 * cos_table_loaded
4142

4243

43-
inputs = tuple(Tensor(4, shape_options={"constexpr": True}) for _ in range(3))
44+
def premake(head_dim, dtype, interleaved):
45+
arrangement_ = functools.partial(
46+
arrangement, head_dim=head_dim, interleaved=interleaved
47+
)
48+
input_tensor = Tensor(shape=(None, None, None, head_dim), dtype=dtype)
49+
sin_cos_tensors = tuple(
50+
Tensor(shape=(None, None, None, head_dim // 2), dtype=dtype) for _ in range(2)
51+
)
52+
tensors = (input_tensor,) + sin_cos_tensors
4453

45-
interleaved_kernel = ninetoothed.make(
46-
functools.partial(arrangement, interleaved=True), application, inputs
47-
)
48-
non_interleaved_kernel = ninetoothed.make(
49-
functools.partial(arrangement, interleaved=False), application, inputs
54+
return arrangement_, application, tensors
55+
56+
57+
configs = tuple(
58+
(
59+
(),
60+
{"head_dim": head_dim, "dtype": dtype, "interleaved": interleaved},
61+
{},
62+
)
63+
for head_dim in (64, 128)
64+
for dtype in (*DTYPES, ninetoothed.float32)
65+
for interleaved in (False, True)
5066
)
5167

68+
_kernel = build(premake, configs, kernel_name="rotary_position_embedding")
69+
70+
71+
_TORCH_TO_NT_DTYPE = {}
72+
5273

5374
def kernel(input, sin_table, cos_table, interleaved=True):
54-
return (interleaved_kernel if interleaved else non_interleaved_kernel)(
55-
input, sin_table, cos_table
75+
import torch
76+
77+
if not _TORCH_TO_NT_DTYPE:
78+
_TORCH_TO_NT_DTYPE.update(
79+
{
80+
torch.float16: ninetoothed.float16,
81+
torch.bfloat16: ninetoothed.bfloat16,
82+
torch.float32: ninetoothed.float32,
83+
}
84+
)
85+
86+
head_dim = input.shape[-1]
87+
88+
return _kernel(
89+
input,
90+
sin_table,
91+
cos_table,
92+
head_dim,
93+
_TORCH_TO_NT_DTYPE[input.dtype],
94+
bool(interleaved),
5695
)

0 commit comments

Comments
 (0)