A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 3, 09:15 UTC
[Refactor] Remove dead cuda kernels (#42767)
Signed-off-by: yewentao256 <zhyanwentao@126.com>
Wentao Ye committed
May 18, 2026 at 14:14 UTC
00e20e76f775b88f47469ae9fcb0f1ecd7580bb9
6 files changed
+1
-605
CMakeLists.txt
-1
@@ -311,7 +311,6 @@ set(VLLM_EXT_SRC
311
"csrc/attention/paged_attention_v1.cu"
312
"csrc/attention/paged_attention_v2.cu"
313
"csrc/attention/merge_attn_states.cu"
314
- "csrc/attention/vertical_slash_index.cu"
314
"csrc/pos_encoding_kernels.cu"
315
"csrc/activation_kernels.cu"
316
"csrc/layernorm_kernels.cu"
csrc/attention/vertical_slash_index.cu
deleted
-401
@@ -1,401 +0,0 @@
1
-// Copyright (c) Microsoft Corporation.
2
-// Licensed under the MIT license.
3
-
4
-#include <assert.h>
5
-
6
-#include <cuda.h>
7
-
8
-#include <torch/all.h>
9
-
10
-__device__ int64_t save_blocks(int* block_offset, int64_t range_start,
11
- int64_t range_end, int64_t block_size,
12
- int64_t input_block_count, int64_t kv_seqlen) {
13
- if (range_start >= kv_seqlen) {
14
- return input_block_count;
15
- }
16
- if (range_end > kv_seqlen) {
17
- range_end = kv_seqlen;
18
- }
19
- int64_t current_block_count = input_block_count;
20
- for (int idx = range_start; idx < range_end; idx += block_size) {
21
- block_offset[current_block_count++] = idx;
22
- }
23
- return current_block_count;
24
-}
25
-
26
-__global__ void convert_vertical_slash_indexes_kernel(
27
- const int* q_seqlens, // [BATCH, ]
28
- const int* kv_seqlens, // [BATCH, ]
29
- const int* vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
30
- const int* slash_indexes, // [BATCH, N_HEADS, NNZ_S]
31
- int* block_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
32
- int* block_offset, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_S]
33
- int* column_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
34
- int* column_index, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_V]
35
- int64_t N_HEADS, int64_t N_ROWS, int64_t BLOCK_SIZE_M, int64_t BLOCK_SIZE_N,
36
- int64_t NNZ_V, int64_t NNZ_S,
37
- bool causal // True for intra, False for succ
38
-) {
39
- const int batch_idx = blockIdx.y;
40
- const int head_idx = blockIdx.x;
41
- const int group_idx = blockIdx.z;
42
-
43
- int64_t q_seqlen = q_seqlens[batch_idx];
44
- int64_t kv_seqlen = kv_seqlens[batch_idx];
45
- int64_t block_idx_m = group_idx * blockDim.x + threadIdx.x;
46
- int64_t start_m = block_idx_m * BLOCK_SIZE_M;
47
- if (start_m >= q_seqlen) {
48
- return;
49
- }
50
- int64_t end_m = start_m + BLOCK_SIZE_M;
51
- vertical_indexes += (batch_idx * N_HEADS + head_idx) * NNZ_V;
52
- slash_indexes += (batch_idx * N_HEADS + head_idx) * NNZ_S;
53
- int64_t row_offset = (batch_idx * N_HEADS + head_idx) * N_ROWS + block_idx_m;
54
- block_count += row_offset;
55
- block_offset += row_offset * NNZ_S;
56
- column_count += row_offset;
57
- column_index += row_offset * NNZ_V;
58
-
59
- bool has_slash = true;
60
- int64_t tmp_col_cnt = 0, tmp_blk_cnt = 0;
61
- int64_t s = 0, v = 0;
62
- int64_t v_idx = vertical_indexes[v++];
63
- int64_t s_idx = slash_indexes[s++];
64
- if (causal) {
65
- while (s_idx >= end_m + (kv_seqlen - q_seqlen) && s < NNZ_S) {
66
- s_idx = slash_indexes[s++];
67
- }
68
- if (s_idx > end_m + (kv_seqlen - q_seqlen)) has_slash = false;
69
- s_idx = max((kv_seqlen - q_seqlen) + end_m - s_idx, BLOCK_SIZE_M);
70
- } else {
71
- while (s_idx >= end_m + kv_seqlen && s < NNZ_S) {
72
- s_idx = slash_indexes[s++];
73
- }
74
- if (s_idx > end_m + kv_seqlen) has_slash = false;
75
- s_idx = max(kv_seqlen + end_m - s_idx, BLOCK_SIZE_M);
76
- }
77
-
78
- int64_t range_start = s_idx - BLOCK_SIZE_M, range_end = s_idx;
79
- if (!has_slash) {
80
- if (causal) {
81
- range_start = (kv_seqlen - q_seqlen) + end_m;
82
- range_end = (kv_seqlen - q_seqlen) + end_m + BLOCK_SIZE_N;
83
- } else {
84
- range_start = kv_seqlen;
85
- range_end = kv_seqlen + BLOCK_SIZE_N;
86
- }
87
- }
88
-
89
- bool slash_finished = false;
90
- while (1) {
91
- if (v_idx < range_end) {
92
- if (v_idx < range_start) {
93
- column_index[tmp_col_cnt++] = v_idx;
94
- }
95
- if (v < NNZ_V) {
96
- v_idx = vertical_indexes[v++];
97
- } else {
98
- if (causal)
99
- v_idx = end_m + BLOCK_SIZE_N + (kv_seqlen - q_seqlen);
100
- else
101
- v_idx = end_m + BLOCK_SIZE_N + kv_seqlen;
102
- }
103
- } else {
104
- if ((s < NNZ_S && causal) ||
105
- (s < NNZ_S && !causal && slash_indexes[s] >= start_m)) {
106
- if (causal)
107
- s_idx = max((kv_seqlen - q_seqlen) + end_m - slash_indexes[s++],
108
- BLOCK_SIZE_M);
109
- else
110
- s_idx = max(kv_seqlen + end_m - slash_indexes[s++], BLOCK_SIZE_M);
111
- } else {
112
- if (v == NNZ_V || (v_idx > range_start && causal)) {
113
- // add the last vertical if no more slash
114
- if (v == NNZ_V && !causal && v_idx < kv_seqlen) {
115
- column_index[tmp_col_cnt++] = v_idx;
116
- }
117
- tmp_blk_cnt = save_blocks(block_offset, range_start, range_end,
118
- BLOCK_SIZE_N, tmp_blk_cnt, kv_seqlen);
119
- break;
120
- } else {
121
- if (causal) {
122
- range_start = (kv_seqlen - q_seqlen) + end_m;
123
- range_end = (kv_seqlen - q_seqlen) + end_m + BLOCK_SIZE_N;
124
- } else {
125
- // if slash_finished but there are vertical left, save current
126
- // blocks
127
- tmp_blk_cnt = save_blocks(block_offset, range_start, range_end,
128
- BLOCK_SIZE_N, tmp_blk_cnt, kv_seqlen);
129
- range_start = kv_seqlen;
130
- range_end = kv_seqlen + BLOCK_SIZE_N;
131
- }
132
- slash_finished = true;
133
- }
134
- }
135
- if (!slash_finished) {
136
- if (s_idx > range_end + BLOCK_SIZE_M) {
137
- tmp_blk_cnt = save_blocks(block_offset, range_start, range_end,
138
- BLOCK_SIZE_N, tmp_blk_cnt, kv_seqlen);
139
- range_start = s_idx - BLOCK_SIZE_M;
140
- range_end = s_idx;
141
- } else if (s_idx > range_end) {
142
- range_end += BLOCK_SIZE_M;
143
- }
144
- }
145
- }
146
- }
147
-
148
- block_count[0] = tmp_blk_cnt;
149
- column_count[0] = tmp_col_cnt;
150
-}
151
-
152
-void convert_vertical_slash_indexes_64x64(
153
- const int* q_seqlens, // [BATCH, ]
154
- const int* kv_seqlens, // [BATCH, ]
155
- const int* vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
156
- const int* slash_indexes, // [BATCH, N_HEADS, NNZ_S]
157
- int* block_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
158
- int* block_offset, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_S]
159
- int* column_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
160
- int* column_index, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_V]
161
- int64_t BATCH_SIZE, int64_t N_HEADS, int64_t N_ROWS, int64_t BLOCK_SIZE_M,
162
- int64_t BLOCK_SIZE_N, int64_t NNZ_V, int64_t NNZ_S, bool causal) {
163
- const int N_THREADS = 64;
164
- const dim3 dimBlock(N_THREADS);
165
- const dim3 dimGrid(N_HEADS, BATCH_SIZE, (N_ROWS + N_THREADS - 1) / N_THREADS);
166
- convert_vertical_slash_indexes_kernel<<<dimGrid, dimBlock>>>(
167
- q_seqlens, kv_seqlens, vertical_indexes, slash_indexes, block_count,
168
- block_offset, column_count, column_index, N_HEADS, N_ROWS, BLOCK_SIZE_M,
169
- BLOCK_SIZE_N, NNZ_V, NNZ_S, causal);
170
-}
171
-
172
-/**
173
- * Implements the Algorithm 4 in paper https://arxiv.org/abs/2407.02490.
174
- *
175
- * This function builds the index of each row of blocks from vertical indices
176
- * and slash indices. The vertical indices are treated as points, while the
177
- * slash indices are converted as ranges. The output consists of the merged
178
- * ranges and separate column indices, where the ranges are represented by
179
- * block indices.
180
- *
181
- * The implementation is referenced from the original MInference repo:
182
- * https://github.com/microsoft/MInference/blob/main/csrc/vertical_slash_index.cu.
183
- */
184
-void convert_vertical_slash_indexes(
185
- torch::Tensor& block_count, // [BATCH, N_HEADS, NUM_ROWS]
186
- torch::Tensor& block_offset, // [BATCH, N_HEADS, NUM_ROWS, NNZ_S]
187
- torch::Tensor& column_count, // [BATCH, N_HEADS, NUM_ROWS]
188
- torch::Tensor& column_index, // [BATCH, N_HEADS, NUM_ROWS, NNZ_V]
189
- torch::Tensor q_seqlens, // [BATCH, ]
190
- torch::Tensor kv_seqlens, // [BATCH, ]
191
- torch::Tensor vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
192
- torch::Tensor slash_indexes, // [BATCH, N_HEADS, NNZ_S]
193
- int64_t context_size, int64_t block_size_M, int64_t block_size_N,
194
- bool causal) {
195
- cudaSetDevice(q_seqlens.get_device());
196
-
197
- int batch_size = slash_indexes.size(0);
198
- int num_heads = slash_indexes.size(1);
199
- int nnz_slash = slash_indexes.size(2);
200
- int nnz_vertical = vertical_indexes.size(2);
201
- int num_rows = (context_size + block_size_M - 1) / block_size_M;
202
-
203
- convert_vertical_slash_indexes_64x64(
204
- q_seqlens.data_ptr<int>(), kv_seqlens.data_ptr<int>(),
205
- vertical_indexes.data_ptr<int>(), slash_indexes.data_ptr<int>(),
206
- block_count.data_ptr<int>(), block_offset.data_ptr<int>(),
207
- column_count.data_ptr<int>(), column_index.data_ptr<int>(), batch_size,
208
- num_heads, num_rows, block_size_M, block_size_N, nnz_vertical, nnz_slash,
209
- causal);
210
-}
211
-
212
-__global__ void convert_vertical_slash_indexes_kernel_mergehead(
213
- const int* q_seqlens, // [BATCH, ]
214
- const int* kv_seqlens, // [BATCH, ]
215
- const int* vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
216
- const int* slash_indexes, // [BATCH, N_HEADS, NNZ_S]
217
- const int* per_head_vertical_topkv, const int* per_head_slash_topkv,
218
- int* block_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
219
- int* block_offset, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_S]
220
- int* column_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
221
- int* column_index, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_V]
222
- int64_t N_HEADS, int64_t N_ROWS, int64_t BLOCK_SIZE_M, int64_t BLOCK_SIZE_N,
223
- int64_t NNZ_V, int64_t NNZ_S,
224
- bool causal // True for intra, False for succ
225
-) {
226
- const int batch_idx = blockIdx.y;
227
- const int head_idx = blockIdx.x;
228
- const int group_idx = blockIdx.z;
229
-
230
- int64_t q_seqlen = q_seqlens[batch_idx];
231
- int64_t kv_seqlen = kv_seqlens[batch_idx];
232
- int64_t block_idx_m = group_idx * blockDim.x + threadIdx.x;
233
- int64_t start_m = block_idx_m * BLOCK_SIZE_M;
234
- if (start_m >= q_seqlen) {
235
- return;
236
- }
237
- int64_t end_m = start_m + BLOCK_SIZE_M;
238
- vertical_indexes += (batch_idx * N_HEADS + head_idx) * NNZ_V;
239
- slash_indexes += (batch_idx * N_HEADS + head_idx) * NNZ_S;
240
- int64_t row_offset = (batch_idx * N_HEADS + head_idx) * N_ROWS + block_idx_m;
241
- block_count += row_offset;
242
- block_offset += row_offset * NNZ_S;
243
- column_count += row_offset;
244
- column_index += row_offset * NNZ_V;
245
-
246
- // MergeHead: each head has it's unique max topk NNZ_V,NNZ_S. (NNZ_V,NNZ_S
247
- // above is buffer size, use to compute offset)
248
- NNZ_S = per_head_slash_topkv[head_idx];
249
- NNZ_V = per_head_vertical_topkv[head_idx];
250
-
251
- bool has_slash = true;
252
- int64_t tmp_col_cnt = 0, tmp_blk_cnt = 0;
253
- int64_t s = 0, v = 0;
254
- int64_t v_idx = vertical_indexes[v++];
255
- int64_t s_idx = slash_indexes[s++];
256
- if (causal) {
257
- while (s_idx >= end_m + (kv_seqlen - q_seqlen) && s < NNZ_S) {
258
- s_idx = slash_indexes[s++];
259
- }
260
- if (s_idx > end_m + (kv_seqlen - q_seqlen)) has_slash = false;
261
- s_idx = max((kv_seqlen - q_seqlen) + end_m - s_idx, BLOCK_SIZE_M);
262
- } else {
263
- while (s_idx >= end_m + kv_seqlen && s < NNZ_S) {
264
- s_idx = slash_indexes[s++];
265
- }
266
- if (s_idx > end_m + kv_seqlen) has_slash = false;
267
- s_idx = max(kv_seqlen + end_m - s_idx, BLOCK_SIZE_M);
268
- }
269
-
270
- int64_t range_start = s_idx - BLOCK_SIZE_M, range_end = s_idx;
271
- if (!has_slash) {
272
- if (causal) {
273
- range_start = (kv_seqlen - q_seqlen) + end_m;
274
- range_end = (kv_seqlen - q_seqlen) + end_m + BLOCK_SIZE_N;
275
- } else {
276
- range_start = kv_seqlen;
277
- range_end = kv_seqlen + BLOCK_SIZE_N;
278
- }
279
- }
280
-
281
- bool slash_finished = false;
282
- while (1) {
283
- if (v_idx < range_end) {
284
- if (v_idx < range_start) {
285
- column_index[tmp_col_cnt++] = v_idx;
286
- }
287
- if (v < NNZ_V) {
288
- v_idx = vertical_indexes[v++];
289
- } else {
290
- if (causal)
291
- v_idx = end_m + BLOCK_SIZE_N + (kv_seqlen - q_seqlen);
292
- else
293
- v_idx = end_m + BLOCK_SIZE_N + kv_seqlen;
294
- }
295
- } else {
296
- if ((s < NNZ_S && causal) ||
297
- (s < NNZ_S && !causal && slash_indexes[s] >= start_m)) {
298
- if (causal)
299
- s_idx = max((kv_seqlen - q_seqlen) + end_m - slash_indexes[s++],
300
- BLOCK_SIZE_M);
301
- else
302
- s_idx = max(kv_seqlen + end_m - slash_indexes[s++], BLOCK_SIZE_M);
303
- } else {
304
- if (v == NNZ_V || (v_idx > range_start && causal)) {
305
- // add the last vertical if no more slash
306
- if (v == NNZ_V && !causal && v_idx < kv_seqlen) {
307
- column_index[tmp_col_cnt++] = v_idx;
308
- }
309
- tmp_blk_cnt = save_blocks(block_offset, range_start, range_end,
310
- BLOCK_SIZE_N, tmp_blk_cnt, kv_seqlen);
311
- break;
312
- } else {
313
- if (causal) {
314
- range_start = (kv_seqlen - q_seqlen) + end_m;
315
- range_end = (kv_seqlen - q_seqlen) + end_m + BLOCK_SIZE_N;
316
- } else {
317
- // if slash_finished but there are vertical left, save current
318
- // blocks
319
- tmp_blk_cnt = save_blocks(block_offset, range_start, range_end,
320
- BLOCK_SIZE_N, tmp_blk_cnt, kv_seqlen);
321
- range_start = kv_seqlen;
322
- range_end = kv_seqlen + BLOCK_SIZE_N;
323
- }
324
- slash_finished = true;
325
- }
326
- }
327
- if (!slash_finished) {
328
- if (s_idx > range_end + BLOCK_SIZE_M) {
329
- tmp_blk_cnt = save_blocks(block_offset, range_start, range_end,
330
- BLOCK_SIZE_N, tmp_blk_cnt, kv_seqlen);
331
- range_start = s_idx - BLOCK_SIZE_M;
332
- range_end = s_idx;
333
- } else if (s_idx > range_end) {
334
- range_end += BLOCK_SIZE_M;
335
- }
336
- }
337
- }
338
- }
339
-
340
- block_count[0] = tmp_blk_cnt;
341
- column_count[0] = tmp_col_cnt;
342
-}
343
-
344
-void convert_vertical_slash_indexes_64x64_mergehead(
345
- const int* q_seqlens, // [BATCH, ]
346
- const int* kv_seqlens, // [BATCH, ]
347
- const int* vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
348
- const int* slash_indexes, // [BATCH, N_HEADS, NNZ_S]
349
- int* per_head_vertical_topkv, int* per_head_slash_topkv,
350
- int* block_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
351
- int* block_offset, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_S]
352
- int* column_count, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M)]
353
- int* column_index, // [BATCH, N_HEADS, cdiv(N_CTX, BLOCK_SIZE_M), NNZ_V]
354
- int64_t BATCH_SIZE, int64_t N_HEADS, int64_t N_ROWS, int64_t BLOCK_SIZE_M,
355
- int64_t BLOCK_SIZE_N, int64_t NNZ_V, int64_t NNZ_S, bool causal) {
356
- const int N_THREADS = 64;
357
- const dim3 dimBlock(N_THREADS);
358
- const dim3 dimGrid(N_HEADS, BATCH_SIZE, (N_ROWS + N_THREADS - 1) / N_THREADS);
359
- convert_vertical_slash_indexes_kernel_mergehead<<<dimGrid, dimBlock>>>(
360
- q_seqlens, kv_seqlens, vertical_indexes, slash_indexes,
361
- per_head_vertical_topkv, per_head_slash_topkv, block_count, block_offset,
362
- column_count, column_index, N_HEADS, N_ROWS, BLOCK_SIZE_M, BLOCK_SIZE_N,
363
- NNZ_V, NNZ_S, causal);
364
-}
365
-
366
-/**
367
- * Implements the Algorithm 4 in paper https://arxiv.org/abs/2407.02490.
368
- *
369
- * Like the above convert_vertical_slash_indexes, but with
370
- * pre-computed vertical and slash counts.
371
- */
372
-void convert_vertical_slash_indexes_mergehead(
373
- torch::Tensor& block_count, // [BATCH, N_HEADS, NUM_ROWS]
374
- torch::Tensor& block_offset, // [BATCH, N_HEADS, NUM_ROWS, NNZ_S]
375
- torch::Tensor& column_count, // [BATCH, N_HEADS, NUM_ROWS]
376
- torch::Tensor& column_index, // [BATCH, N_HEADS, NUM_ROWS, NNZ_V]
377
- torch::Tensor q_seqlens, // [BATCH, ]
378
- torch::Tensor kv_seqlens, // [BATCH, ]
379
- torch::Tensor vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
380
- torch::Tensor slash_indexes, // [BATCH, N_HEADS, NNZ_S]
381
- torch::Tensor vertical_indices_count, // [N_HEADS, ]
382
- torch::Tensor slash_indices_count, // [N_HEADS, ]
383
- int64_t context_size, int64_t block_size_M, int64_t block_size_N,
384
- bool causal) {
385
- cudaSetDevice(q_seqlens.get_device());
386
-
387
- int batch_size = slash_indexes.size(0);
388
- int num_heads = slash_indexes.size(1);
389
- int nnz_slash = slash_indexes.size(2);
390
- int nnz_vertical = vertical_indexes.size(2);
391
- int num_rows = (context_size + block_size_M - 1) / block_size_M;
392
-
393
- convert_vertical_slash_indexes_64x64_mergehead(
394
- q_seqlens.data_ptr<int>(), kv_seqlens.data_ptr<int>(),
395
- vertical_indexes.data_ptr<int>(), slash_indexes.data_ptr<int>(),
396
- vertical_indices_count.data_ptr<int>(),
397
- slash_indices_count.data_ptr<int>(), block_count.data_ptr<int>(),
398
- block_offset.data_ptr<int>(), column_count.data_ptr<int>(),
399
- column_index.data_ptr<int>(), batch_size, num_heads, num_rows,
400
- block_size_M, block_size_N, nnz_vertical, nnz_slash, causal);
401
-}
csrc/moe/torch_bindings.cpp
-10
@@ -92,16 +92,6 @@ TORCH_LIBRARY_EXPAND(TORCH_EXTENSION_NAME, m) {
92
"bool use_fp32_reduce, bool is_zp_float,"
93
"int thread_k, int thread_n, int blocks_per_sm) -> Tensor");
94
95
- m.def(
96
- "marlin_gemm_moe(Tensor! a, Tensor! b_q_weights, Tensor! sorted_ids, "
97
- "Tensor! topk_weights, Tensor! topk_ids, Tensor! b_scales, Tensor! "
98
- "b_zeros, Tensor! g_idx, Tensor! perm, Tensor! workspace, "
99
- "int b_q_type, SymInt size_m, "
100
- "SymInt size_n, SymInt size_k, bool is_k_full, int num_experts, int "
101
- "topk, "
102
- "int moe_block_size, bool replicate_input, bool apply_weights)"
103
- " -> Tensor");
104
-
95
m.def(
96
"moe_permute(Tensor input, Tensor topk_ids,"
97
"Tensor token_expert_indices, Tensor? expert_map, int n_expert,"
csrc/ops.h
-26
@@ -60,32 +60,6 @@ void merge_attn_states(
60
const torch::Tensor& suffix_output, const torch::Tensor& suffix_lse,
61
const std::optional<int64_t> prefill_tokens_with_context,
62
const std::optional<torch::Tensor>& output_scale = std::nullopt);
63
-#ifndef USE_ROCM
64
-void convert_vertical_slash_indexes(
65
- torch::Tensor& block_count, // [BATCH, N_HEADS, NUM_ROWS]
66
- torch::Tensor& block_offset, // [BATCH, N_HEADS, NUM_ROWS, NNZ_S]
67
- torch::Tensor& column_count, // [BATCH, N_HEADS, NUM_ROWS]
68
- torch::Tensor& column_index, // [BATCH, N_HEADS, NUM_ROWS, NNZ_V]
69
- torch::Tensor q_seqlens, // [BATCH, ]
70
- torch::Tensor kv_seqlens, // [BATCH, ]
71
- torch::Tensor vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
72
- torch::Tensor slash_indexes, // [BATCH, N_HEADS, NNZ_S]
73
- int64_t context_size, int64_t block_size_M, int64_t block_size_N,
74
- bool causal);
75
-
76
-void convert_vertical_slash_indexes_mergehead(
77
- torch::Tensor& block_count, // [BATCH, N_HEADS, NUM_ROWS]
78
- torch::Tensor& block_offset, // [BATCH, N_HEADS, NUM_ROWS, NNZ_S]
79
- torch::Tensor& column_count, // [BATCH, N_HEADS, NUM_ROWS]
80
- torch::Tensor& column_index, // [BATCH, N_HEADS, NUM_ROWS, NNZ_V]
81
- torch::Tensor q_seqlens, // [BATCH, ]
82
- torch::Tensor kv_seqlens, // [BATCH, ]
83
- torch::Tensor vertical_indexes, // [BATCH, N_HEADS, NNZ_V]
84
- torch::Tensor slash_indexes, // [BATCH, N_HEADS, NNZ_S]
85
- torch::Tensor vertical_indices_count, // [N_HEADS, ]
86
- torch::Tensor slash_indices_count, int64_t context_size,
87
- int64_t block_size_M, int64_t block_size_N, bool causal);
88
-#endif
63
64
void rms_norm(torch::Tensor& out, torch::Tensor& input, torch::Tensor& weight,
65
double epsilon);
csrc/torch_bindings.cpp
-24
@@ -76,30 +76,6 @@ TORCH_LIBRARY_EXPAND(TORCH_EXTENSION_NAME, ops) {
76
" int!? prefill_tokens_with_context,"
77
" Tensor? output_scale=None) -> ()");
78
ops.impl("merge_attn_states", torch::kCUDA, &merge_attn_states);
79
-#ifndef USE_ROCM
80
- ops.def(
81
- "convert_vertical_slash_indexes("
82
- " Tensor! block_count, Tensor! block_offset, "
83
- " Tensor! column_count, Tensor! column_index, "
84
- " Tensor q_seqlens, Tensor q_seqlens, "
85
- " Tensor vertical_indexes, Tensor slash_indexes, "
86
- " int context_size, int block_size_M, int block_size_N, "
87
- " bool causal) -> ()");
88
- ops.impl("convert_vertical_slash_indexes", torch::kCUDA,
89
- &convert_vertical_slash_indexes);
90
-
91
- ops.def(
92
- "convert_vertical_slash_indexes_mergehead("
93
- " Tensor! block_count, Tensor! block_offset, "
94
- " Tensor! column_count, Tensor! column_index, "
95
- " Tensor q_seqlens, Tensor q_seqlens, "
96
- " Tensor vertical_indexes, Tensor slash_indexes, "
97
- " Tensor vertical_indices_count, Tensor slash_indices_count, "
98
- " int context_size, int block_size_M, int block_size_N, "
99
- " bool causal) -> ()");
100
- ops.impl("convert_vertical_slash_indexes_mergehead", torch::kCUDA,
101
- &convert_vertical_slash_indexes_mergehead);
102
-#endif
79
80
// Activation ops
81
// Activation function used in SwiGLU.
vllm/_custom_ops.py
+1
-143
@@ -280,123 +280,6 @@ def merge_attn_states(
280
)
281
282
283
-def convert_vertical_slash_indexes(
284
- q_seqlens: torch.Tensor, # [BATCH, ]
285
- kv_seqlens: torch.Tensor, # [BATCH, ]
286
- vertical_indexes: torch.Tensor, # [BATCH, N_HEADS, NNZ_V]
287
- slash_indexes: torch.Tensor, # [BATCH, N_HEADS, NNZ_S]
288
- context_size: int,
289
- block_size_M: int,
290
- block_size_N: int,
291
- causal: bool = True,
292
-) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
293
- batch_size = slash_indexes.size(0)
294
- num_heads = slash_indexes.size(1)
295
- nnz_slash = slash_indexes.size(2)
296
- nnz_vertical = vertical_indexes.size(2)
297
- num_rows = (context_size + block_size_M - 1) // block_size_M
298
-
299
- block_count = torch.zeros(
300
- batch_size, num_heads, num_rows, dtype=q_seqlens.dtype, device=q_seqlens.device
301
- )
302
- block_offset = torch.zeros(
303
- batch_size,
304
- num_heads,
305
- num_rows,
306
- nnz_slash,
307
- dtype=q_seqlens.dtype,
308
- device=q_seqlens.device,
309
- )
310
- column_count = torch.zeros(
311
- batch_size, num_heads, num_rows, dtype=q_seqlens.dtype, device=q_seqlens.device
312
- )
313
- column_index = torch.zeros(
314
- batch_size,
315
- num_heads,
316
- num_rows,
317
- nnz_vertical,
318
- dtype=q_seqlens.dtype,
319
- device=q_seqlens.device,
320
- )
321
-
322
- torch.ops._C.convert_vertical_slash_indexes(
323
- block_count,
324
- block_offset,
325
- column_count,
326
- column_index,
327
- q_seqlens,
328
- kv_seqlens,
329
- vertical_indexes,
330
- slash_indexes,
331
- context_size,
332
- block_size_M,
333
- block_size_N,
334
- causal,
335
- )
336
- return block_count, block_offset, column_count, column_index
337
-
338
-
339
-def convert_vertical_slash_indexes_mergehead(
340
- q_seqlens: torch.Tensor, # [BATCH, ]
341
- kv_seqlens: torch.Tensor, # [BATCH, ]
342
- vertical_indexes: torch.Tensor, # [BATCH, N_HEADS, NNZ_V]
343
- slash_indexes: torch.Tensor, # [BATCH, N_HEADS, NNZ_S]
344
- # [N_HEADS] : different head use different number of indices
345
- vertical_indices_count: torch.Tensor,
346
- slash_indices_count: torch.Tensor,
347
- context_size: int,
348
- block_size_M: int,
349
- block_size_N: int,
350
- causal: bool = True,
351
-) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor]:
352
- batch_size = slash_indexes.size(0)
353
- num_heads = slash_indexes.size(1)
354
- nnz_slash = slash_indexes.size(2)
355
- nnz_vertical = vertical_indexes.size(2)
356
- num_rows = (context_size + block_size_M - 1) // block_size_M
357
-
358
- block_count = torch.empty(
359
- batch_size, num_heads, num_rows, dtype=q_seqlens.dtype, device=q_seqlens.device
360
- )
361
- block_offset = torch.empty(
362
- batch_size,
363
- num_heads,
364
- num_rows,
365
- nnz_slash,
366
- dtype=q_seqlens.dtype,
367
- device=q_seqlens.device,
368
- )
369
- column_count = torch.empty(
370
- batch_size, num_heads, num_rows, dtype=q_seqlens.dtype, device=q_seqlens.device
371
- )
372
- column_index = torch.empty(
373
- batch_size,
374
- num_heads,
375
- num_rows,
376
- nnz_vertical,
377
- dtype=q_seqlens.dtype,
378
- device=q_seqlens.device,
379
- )
380
-
381
- torch.ops._C.convert_vertical_slash_indexes_mergehead(
382
- block_count,
383
- block_offset,
384
- column_count,
385
- column_index,
386
- q_seqlens,
387
- kv_seqlens,
388
- vertical_indexes,
389
- slash_indexes,
390
- vertical_indices_count,
391
- slash_indices_count,
392
- context_size,
393
- block_size_M,
394
- block_size_N,
395
- causal,
396
- )
397
- return block_count, block_offset, column_count, column_index
398
-
399
-
283
# pos encoding ops
284
def rotary_embedding(
285
positions: torch.Tensor,
@@ -2658,32 +2541,7 @@ def moe_wna16_marlin_gemm(
2541
)
2542
2543
2661
-if hasattr(torch.ops, "_moe_C") and hasattr(torch.ops._moe_C, "marlin_gemm_moe"):
2662
-
2663
- @register_fake("_moe_C::marlin_gemm_moe")
2664
- def marlin_gemm_moe_fake(
2665
- a: torch.Tensor,
2666
- b_q_weights: torch.Tensor,
2667
- sorted_ids: torch.Tensor,
2668
- topk_weights: torch.Tensor,
2669
- topk_ids: torch.Tensor,
2670
- b_scales: torch.Tensor,
2671
- b_zero_points: torch.Tensor,
2672
- g_idx: torch.Tensor,
2673
- perm: torch.Tensor,
2674
- workspace: torch.Tensor,
2675
- b_q_type: ScalarType,
2676
- size_m: torch.SymInt,
2677
- size_n: torch.SymInt,
2678
- size_k: torch.SymInt,
2679
- is_k_full: bool,
2680
- num_experts: int,
2681
- topk: int,
2682
- moe_block_size: int,
2683
- replicate_input: bool,
2684
- apply_weights: bool,
2685
- ) -> torch.Tensor:
2686
- return torch.empty((size_m, topk, size_n), dtype=a.dtype, device=a.device)
2544
+if hasattr(torch.ops, "_moe_C") and hasattr(torch.ops._moe_C, "moe_wna16_marlin_gemm"):
2545
2546
@register_fake("_moe_C::moe_wna16_marlin_gemm")
2547
def moe_wna16_marlin_gemm_fake(