Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 12:38:16 +08:00

123 lines
4.6 KiB
Plaintext

// LP probability dispatch kernel: collapse the ~7 torch ops in
// _topk_ids_logical_to_physical_probability into one launch.
//
// Python equivalent:
//
// topk_probs = log2phy_prob[topk_ids] # gather
// row_sums = topk_probs.sum(dim=-1) # reduce
// fallback = (log2phy_map[topk_ids] >= 0).float() # gather + cast
// topk_probs = where(row_sums > 0, topk_probs, fallback) # cmp + select
// chosen = multinomial(topk_probs, 1).flatten() # sample
// out = log2phy_map[topk_ids, chosen] # gather
//
// Each thread handles one (token, slot) in the flattened topk_ids.
// `random_vals` is pre-generated by the caller via torch.rand (one kernel
// launch, ~5 µs); we sample the multinomial via prefix-sum + comparison
// against `random_vals[i] * row_sum`.
//
// Templated on (MAX_COPIES, BLOCK_DIM). MAX_COPIES is small (typically 2-3)
// so the per-row prefix sum unrolls into a few instructions per thread.
#include <sgl_kernel/tensor.h>
#include <sgl_kernel/utils.h>
#include <sgl_kernel/utils.cuh>
#include <dlpack/dlpack.h>
#include <tvm/ffi/container/tensor.h>
#include <cstdint>
namespace {
template <int MAX_COPIES, int BLOCK_DIM>
__global__ void dispatch_probability_kernel(
int32_t* __restrict__ out_topk_ids, // (N,)
const int32_t* __restrict__ in_topk_ids, // (N,)
const float* __restrict__ log2phy_prob, // (NUM_LOGICAL, MAX_COPIES)
const int32_t* __restrict__ log2phy_map, // (NUM_LOGICAL, MAX_COPIES)
const float* __restrict__ random_vals, // (N,)
int N) {
const int idx = blockIdx.x * BLOCK_DIM + threadIdx.x;
if (idx >= N) return;
const int32_t logical_id = in_topk_ids[idx];
const int32_t* row_map = log2phy_map + logical_id * MAX_COPIES;
const float* row_prob = log2phy_prob + logical_id * MAX_COPIES;
float probs[MAX_COPIES];
int32_t maps[MAX_COPIES];
float row_sum = 0.f;
#pragma unroll
for (int c = 0; c < MAX_COPIES; c++) {
maps[c] = row_map[c];
probs[c] = row_prob[c];
row_sum += probs[c];
}
// Fallback: if all LP probs for this row are 0, sample uniformly from the
// valid physical copies (map != -1).
if (row_sum <= 0.f) {
row_sum = 0.f;
#pragma unroll
for (int c = 0; c < MAX_COPIES; c++) {
probs[c] = (maps[c] >= 0) ? 1.0f : 0.0f;
row_sum += probs[c];
}
}
// Multinomial sample: smallest c such that cumsum[0..c] > u * row_sum.
// Implemented branch-free for unroll friendliness: chosen accumulates the
// largest index where cumsum[..c] is still <= u, then we add 1 (clamped to
// MAX_COPIES-1 for the all-cumsum-<=-u edge case from float rounding).
const float u = random_vals[idx] * row_sum;
float cum = 0.f;
int chosen = 0;
#pragma unroll
for (int c = 0; c < MAX_COPIES; c++) {
cum += probs[c];
if (u >= cum) chosen = c + 1;
}
if (chosen >= MAX_COPIES) chosen = MAX_COPIES - 1;
out_topk_ids[idx] = maps[chosen];
}
template <int MAX_COPIES, int BLOCK_DIM>
void dispatch_probability(
tvm::ffi::TensorView out_topk_ids, // (N,) int32
tvm::ffi::TensorView in_topk_ids, // (N,) int32
tvm::ffi::TensorView log2phy_prob, // (NUM_LOGICAL, MAX_COPIES) float32
tvm::ffi::TensorView log2phy_map, // (NUM_LOGICAL, MAX_COPIES) int32
tvm::ffi::TensorView random_vals) { // (N,) float32
using namespace host;
SymbolicSize N{"num_topk_entries"};
SymbolicSize NUM_LOGICAL{"num_logical"};
SymbolicDevice device_;
TensorMatcher({N}).with_dtype<int32_t>().with_device<kDLCUDA>(device_).verify(out_topk_ids).verify(in_topk_ids);
TensorMatcher({NUM_LOGICAL, MAX_COPIES}).with_dtype<float>().with_device<kDLCUDA>(device_).verify(log2phy_prob);
TensorMatcher({NUM_LOGICAL, MAX_COPIES}).with_dtype<int32_t>().with_device<kDLCUDA>(device_).verify(log2phy_map);
TensorMatcher({N}).with_dtype<float>().with_device<kDLCUDA>(device_).verify(random_vals);
const int n = static_cast<int>(N.unwrap());
const int grid = (n + BLOCK_DIM - 1) / BLOCK_DIM;
const DLDevice device = device_.unwrap();
using KernelT = void (*)(int32_t*, const int32_t*, const float*, const int32_t*, const float*, int);
KernelT kernel = dispatch_probability_kernel<MAX_COPIES, BLOCK_DIM>;
LaunchKernel(grid, BLOCK_DIM, device)(
kernel,
static_cast<int32_t*>(out_topk_ids.data_ptr()),
static_cast<const int32_t*>(in_topk_ids.data_ptr()),
static_cast<const float*>(log2phy_prob.data_ptr()),
static_cast<const int32_t*>(log2phy_map.data_ptr()),
static_cast<const float*>(random_vals.data_ptr()),
n);
}
} // namespace