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
547 lines
20 KiB
Python
547 lines
20 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, replace
|
|
from typing import Any, Callable, Iterator, Optional
|
|
|
|
import torch
|
|
|
|
from sglang.jit_kernel.kv_canary import consts
|
|
from sglang.jit_kernel.kv_canary.plan import launch_canary_plan_kernels
|
|
from sglang.jit_kernel.kv_canary.plan_ref import (
|
|
launch_canary_plan_kernels_torch_reference,
|
|
)
|
|
from sglang.jit_kernel.kv_canary.verify import (
|
|
CanaryLaunchTag,
|
|
RealKvSource,
|
|
VerifyOrWriteContext,
|
|
VerifyPlan,
|
|
launch_canary_verify_kernel,
|
|
)
|
|
from sglang.jit_kernel.kv_canary.verify_ref import (
|
|
launch_canary_verify_kernel_torch_reference,
|
|
)
|
|
from sglang.jit_kernel.kv_canary.write import WritePlan, launch_canary_write_kernel
|
|
from sglang.jit_kernel.kv_canary.write_ref import (
|
|
launch_canary_write_kernel_torch_reference,
|
|
)
|
|
from sglang.jit_kernel.tests.kv_canary._canary_helpers import (
|
|
FakeViolationLog,
|
|
assert_canary_buf_equal,
|
|
assert_canary_state_equal,
|
|
make_log_pair,
|
|
)
|
|
|
|
_DEVICE = torch.device("cuda")
|
|
|
|
|
|
def _run_both_plan(
|
|
*,
|
|
triton_verify: VerifyPlan,
|
|
triton_write: WritePlan,
|
|
ref_verify: VerifyPlan,
|
|
ref_write: WritePlan,
|
|
req_pool_indices: torch.Tensor,
|
|
prefix_lens: torch.Tensor,
|
|
extend_seq_lens: torch.Tensor,
|
|
req_to_token: torch.Tensor,
|
|
extras: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor],
|
|
swa_window_size: int,
|
|
full_to_swa_index_mapping: Optional[torch.Tensor],
|
|
assert_equal: bool = True,
|
|
active_verify_entries: Optional[int] = None,
|
|
active_write_reqs: Optional[int] = None,
|
|
req_to_verify_expected_tokens: Optional[torch.Tensor] = None,
|
|
req_to_verify_expected_tokens_valid_lens: Optional[torch.Tensor] = None,
|
|
kv_token_id_vs_position_offset: int = 0,
|
|
) -> None:
|
|
_ = extras
|
|
verify_capacity = int(triton_verify.verify_slot_indices.shape[0])
|
|
# Default lens to "no tighter bound than pool width" so existing kernel tests that
|
|
# only care about gather wiring keep their old semantics without each call site
|
|
# explicitly building a per-req lens tensor.
|
|
if (
|
|
req_to_verify_expected_tokens is not None
|
|
and req_to_verify_expected_tokens_valid_lens is None
|
|
):
|
|
req_to_verify_expected_tokens_valid_lens = torch.full(
|
|
(int(req_pool_indices.shape[0]),),
|
|
int(req_to_verify_expected_tokens.shape[1]),
|
|
dtype=torch.int64,
|
|
device=req_pool_indices.device,
|
|
)
|
|
launch_canary_plan_kernels(
|
|
verify_plan_out=triton_verify,
|
|
write_plan_out=triton_write,
|
|
req_pool_indices=req_pool_indices,
|
|
prefix_lens=prefix_lens,
|
|
extend_seq_lens=extend_seq_lens,
|
|
req_to_token=req_to_token,
|
|
swa_window_size=swa_window_size,
|
|
full_to_swa_index_mapping=full_to_swa_index_mapping,
|
|
verify_capacity=verify_capacity,
|
|
req_to_verify_expected_tokens=req_to_verify_expected_tokens,
|
|
req_to_verify_expected_tokens_valid_lens=req_to_verify_expected_tokens_valid_lens,
|
|
kv_token_id_vs_position_offset=kv_token_id_vs_position_offset,
|
|
)
|
|
launch_canary_plan_kernels_torch_reference(
|
|
verify_plan_out=ref_verify,
|
|
write_plan_out=ref_write,
|
|
req_pool_indices=req_pool_indices,
|
|
prefix_lens=prefix_lens,
|
|
extend_seq_lens=extend_seq_lens,
|
|
req_to_token=req_to_token,
|
|
swa_window_size=swa_window_size,
|
|
full_to_swa_index_mapping=full_to_swa_index_mapping,
|
|
verify_capacity=int(ref_verify.verify_slot_indices.shape[0]),
|
|
req_to_verify_expected_tokens=req_to_verify_expected_tokens,
|
|
req_to_verify_expected_tokens_valid_lens=req_to_verify_expected_tokens_valid_lens,
|
|
kv_token_id_vs_position_offset=kv_token_id_vs_position_offset,
|
|
)
|
|
torch.cuda.synchronize()
|
|
|
|
if assert_equal:
|
|
_assert_plans_byte_equal(
|
|
triton_verify=triton_verify,
|
|
triton_write=triton_write,
|
|
ref_verify=ref_verify,
|
|
ref_write=ref_write,
|
|
active_verify_entries=active_verify_entries,
|
|
active_write_reqs=active_write_reqs,
|
|
)
|
|
|
|
|
|
def _assert_plans_byte_equal(
|
|
*,
|
|
triton_verify: VerifyPlan,
|
|
triton_write: WritePlan,
|
|
ref_verify: VerifyPlan,
|
|
ref_write: WritePlan,
|
|
active_verify_entries: Optional[int] = None,
|
|
active_write_reqs: Optional[int] = None,
|
|
) -> None:
|
|
"""Byte-equal check on (Triton vs ref) plan outputs.
|
|
|
|
Optional ``active_verify_entries`` / ``active_write_reqs`` truncate the comparison to the meaningful
|
|
prefix; tail entries past the active count are kernel-undefined and need not match byte-equal.
|
|
"""
|
|
n_verify = (
|
|
active_verify_entries
|
|
if active_verify_entries is not None
|
|
else int(triton_verify.verify_num_valid[0].item())
|
|
)
|
|
n_verify_ref = int(ref_verify.verify_num_valid[0].item())
|
|
assert (
|
|
n_verify == n_verify_ref
|
|
), f"verify_num_valid diverged: triton={n_verify} ref={n_verify_ref}"
|
|
# When total_verify > VERIFY_CAPACITY the offsets kernel clears verify_enable and
|
|
# plan_entries skips its scatter — leaving verify_slot_indices/positions/prev_slot_indices
|
|
# as whatever the (torch.empty) allocation contained. Skip the byte-equal probe in that
|
|
# case; verify_num_valid being clamped + verify_enable=0 is the contract here.
|
|
triton_enable = int(triton_verify.enable[0].item())
|
|
ref_enable = int(ref_verify.enable[0].item())
|
|
assert (
|
|
triton_enable == ref_enable
|
|
), f"verify_enable diverged: triton={triton_enable} ref={ref_enable}"
|
|
if n_verify > 0 and triton_enable != 0:
|
|
assert torch.equal(
|
|
triton_verify.verify_slot_indices[:n_verify],
|
|
ref_verify.verify_slot_indices[:n_verify],
|
|
)
|
|
assert torch.equal(
|
|
triton_verify.verify_expected_tokens[:n_verify],
|
|
ref_verify.verify_expected_tokens[:n_verify],
|
|
)
|
|
assert torch.equal(
|
|
triton_verify.verify_expected_positions[:n_verify],
|
|
ref_verify.verify_expected_positions[:n_verify],
|
|
)
|
|
assert torch.equal(
|
|
triton_verify.verify_prev_slot_indices[:n_verify],
|
|
ref_verify.verify_prev_slot_indices[:n_verify],
|
|
)
|
|
|
|
n_write = (
|
|
active_write_reqs
|
|
if active_write_reqs is not None
|
|
else int(triton_write.write_num_valid_reqs[0].item())
|
|
)
|
|
n_write_ref = int(ref_write.write_num_valid_reqs[0].item())
|
|
assert (
|
|
n_write == n_write_ref
|
|
), f"write_num_valid_reqs diverged: triton={n_write} ref={n_write_ref}"
|
|
assert torch.equal(
|
|
triton_write.write_offsets[: n_write + 1],
|
|
ref_write.write_offsets[: n_write + 1],
|
|
)
|
|
if n_write > 0:
|
|
assert torch.equal(
|
|
triton_write.write_seed_slot_indices[:n_write],
|
|
ref_write.write_seed_slot_indices[:n_write],
|
|
)
|
|
|
|
|
|
def _run_both_verify(
|
|
*,
|
|
cuda_canary_buf: torch.Tensor,
|
|
ref_canary_buf: torch.Tensor,
|
|
plan_cuda,
|
|
plan_ref,
|
|
cuda_log: FakeViolationLog,
|
|
ref_log: FakeViolationLog,
|
|
real_kv_sources_cuda: tuple[RealKvSource, ...],
|
|
real_kv_sources_ref: tuple[RealKvSource, ...],
|
|
real_kv_hash_mode: consts.RealKvHashMode,
|
|
kernel_kind: CanaryLaunchTag = CanaryLaunchTag.HEAD_K_FULL,
|
|
assert_equal: bool = True,
|
|
check_verify_expected_token: bool = True,
|
|
) -> None:
|
|
launch_canary_verify_kernel(
|
|
context=VerifyOrWriteContext(
|
|
canary_buf=cuda_canary_buf,
|
|
kernel_kind=kernel_kind,
|
|
violation_ring=cuda_log.ring,
|
|
violation_write_index=cuda_log.write_index,
|
|
slot_run_counter=cuda_log.slot_run_counter,
|
|
kernel_run_counter=cuda_log.kernel_run_counter,
|
|
enable_chain_position_assert=cuda_log.enable_chain_position_assert,
|
|
real_kv_sources=real_kv_sources_cuda,
|
|
real_kv_hash_mode=real_kv_hash_mode,
|
|
),
|
|
plan=plan_cuda,
|
|
check_verify_expected_token=check_verify_expected_token,
|
|
)
|
|
launch_canary_verify_kernel_torch_reference(
|
|
context=VerifyOrWriteContext(
|
|
canary_buf=ref_canary_buf,
|
|
kernel_kind=kernel_kind,
|
|
violation_ring=ref_log.ring,
|
|
violation_write_index=ref_log.write_index,
|
|
slot_run_counter=ref_log.slot_run_counter,
|
|
kernel_run_counter=ref_log.kernel_run_counter,
|
|
enable_chain_position_assert=ref_log.enable_chain_position_assert,
|
|
real_kv_sources=real_kv_sources_ref,
|
|
real_kv_hash_mode=real_kv_hash_mode,
|
|
),
|
|
plan=plan_ref,
|
|
check_verify_expected_token=check_verify_expected_token,
|
|
)
|
|
torch.cuda.synchronize()
|
|
|
|
if assert_equal:
|
|
assert_canary_state_equal(log_a=cuda_log, log_b=ref_log)
|
|
|
|
|
|
def _run_both_write(
|
|
*,
|
|
cuda_canary_buf: torch.Tensor,
|
|
ref_canary_buf: torch.Tensor,
|
|
plan_cuda,
|
|
plan_ref,
|
|
input_ids: torch.Tensor,
|
|
positions: torch.Tensor,
|
|
out_cache_loc: torch.Tensor,
|
|
enable_write_verify_inputs: bool,
|
|
expected_input_tokens: torch.Tensor,
|
|
expected_input_positions: torch.Tensor,
|
|
cuda_log: FakeViolationLog,
|
|
ref_log: FakeViolationLog,
|
|
real_kv_sources_cuda: tuple[RealKvSource, ...],
|
|
real_kv_sources_ref: tuple[RealKvSource, ...],
|
|
real_kv_hash_mode: consts.RealKvHashMode,
|
|
kernel_kind: CanaryLaunchTag = CanaryLaunchTag.HEAD_K_FULL,
|
|
assert_equal: bool = True,
|
|
) -> None:
|
|
expected_tokens_for_launch = (
|
|
expected_input_tokens if enable_write_verify_inputs else None
|
|
)
|
|
expected_positions_for_launch = (
|
|
expected_input_positions if enable_write_verify_inputs else None
|
|
)
|
|
launch_canary_write_kernel(
|
|
context=VerifyOrWriteContext(
|
|
canary_buf=cuda_canary_buf,
|
|
kernel_kind=kernel_kind,
|
|
violation_ring=cuda_log.ring,
|
|
violation_write_index=cuda_log.write_index,
|
|
slot_run_counter=cuda_log.slot_run_counter,
|
|
kernel_run_counter=cuda_log.kernel_run_counter,
|
|
enable_chain_position_assert=cuda_log.enable_chain_position_assert,
|
|
real_kv_sources=real_kv_sources_cuda,
|
|
real_kv_hash_mode=real_kv_hash_mode,
|
|
),
|
|
plan=plan_cuda,
|
|
input_ids=input_ids,
|
|
positions=positions,
|
|
out_cache_loc=out_cache_loc,
|
|
enable_write_input_assert=enable_write_verify_inputs,
|
|
expected_input_tokens=expected_tokens_for_launch,
|
|
expected_input_positions=expected_positions_for_launch,
|
|
)
|
|
launch_canary_write_kernel_torch_reference(
|
|
context=VerifyOrWriteContext(
|
|
canary_buf=ref_canary_buf,
|
|
kernel_kind=kernel_kind,
|
|
violation_ring=ref_log.ring,
|
|
violation_write_index=ref_log.write_index,
|
|
slot_run_counter=ref_log.slot_run_counter,
|
|
kernel_run_counter=ref_log.kernel_run_counter,
|
|
enable_chain_position_assert=ref_log.enable_chain_position_assert,
|
|
real_kv_sources=real_kv_sources_ref,
|
|
real_kv_hash_mode=real_kv_hash_mode,
|
|
),
|
|
plan=plan_ref,
|
|
input_ids=input_ids,
|
|
positions=positions,
|
|
out_cache_loc=out_cache_loc,
|
|
enable_write_input_assert=enable_write_verify_inputs,
|
|
expected_input_tokens=expected_tokens_for_launch,
|
|
expected_input_positions=expected_positions_for_launch,
|
|
)
|
|
torch.cuda.synchronize()
|
|
|
|
if assert_equal:
|
|
assert_canary_buf_equal(buf_a=cuda_canary_buf, buf_b=ref_canary_buf)
|
|
assert_canary_state_equal(log_a=cuda_log, log_b=ref_log)
|
|
|
|
|
|
@dataclass(frozen=True, slots=True, kw_only=True)
|
|
class ShrinkResult:
|
|
inputs: Any
|
|
mutations_applied: list[str]
|
|
|
|
|
|
def shrink_inputs(
|
|
inputs: Any,
|
|
*,
|
|
check_fn: Callable[[Any], bool],
|
|
max_iterations: int = 50,
|
|
) -> ShrinkResult:
|
|
"""Greedy 1-step minify for a fuzz inputs dataclass.
|
|
|
|
``check_fn(candidate)`` returns True when ``candidate`` still reproduces the failure. Each round
|
|
yields candidate-simpler-than-current mutations through ``_yield_simpler``; the first accepted
|
|
candidate becomes the new current. Iteration stops when no mutation is accepted or ``max_iterations``
|
|
is reached.
|
|
"""
|
|
current = inputs
|
|
applied: list[str] = []
|
|
for _ in range(max_iterations):
|
|
improved = False
|
|
for label, candidate in _yield_simpler(current):
|
|
try:
|
|
still_fails = check_fn(candidate)
|
|
except Exception:
|
|
still_fails = False
|
|
if still_fails:
|
|
current = candidate
|
|
applied.append(label)
|
|
improved = True
|
|
break
|
|
if not improved:
|
|
break
|
|
return ShrinkResult(inputs=current, mutations_applied=applied)
|
|
|
|
|
|
def _yield_simpler(inputs: Any) -> Iterator[tuple[str, Any]]:
|
|
"""Yield (label, simpler_candidate) tuples for generic fuzz-input minifiers.
|
|
|
|
The candidates touch only well-known field names; an inputs dataclass that lacks a field will simply
|
|
have that mutation skipped. No kernel-specific knowledge is encoded here so the same shrinker drives
|
|
Plan / Verify / Write fuzz failures uniformly.
|
|
"""
|
|
fields = {
|
|
f: getattr(inputs, f) for f in inputs.__dataclass_fields__ # type: ignore[attr-defined]
|
|
}
|
|
|
|
def emit(label: str, **overrides: Any) -> Iterator[tuple[str, Any]]:
|
|
candidate = replace(inputs, **overrides)
|
|
yield label, candidate
|
|
|
|
bs_field = (
|
|
"req_pool_indices"
|
|
if "req_pool_indices" in fields
|
|
else ("input_ids" if "input_ids" in fields else None)
|
|
)
|
|
if bs_field is not None and isinstance(fields[bs_field], torch.Tensor):
|
|
tensor = fields[bs_field]
|
|
if tensor.numel() > 1:
|
|
new_len = tensor.numel() - 1
|
|
related_tensors_overrides: dict[str, Any] = {}
|
|
for name in (
|
|
"req_pool_indices",
|
|
"prefix_lens",
|
|
"extend_seq_lens",
|
|
"input_ids",
|
|
"positions",
|
|
"out_cache_loc",
|
|
"expected_input_tokens",
|
|
"expected_input_positions",
|
|
):
|
|
t = fields.get(name)
|
|
if (
|
|
isinstance(t, torch.Tensor)
|
|
and t.numel() >= new_len
|
|
and t.dim() == 1
|
|
):
|
|
related_tensors_overrides[name] = t[:new_len].contiguous()
|
|
if related_tensors_overrides:
|
|
yield from emit("drop_last_row", **related_tensors_overrides)
|
|
|
|
if "swa_window_size" in fields and isinstance(fields["swa_window_size"], int):
|
|
if fields["swa_window_size"] != 0:
|
|
yield from emit(
|
|
"swa_off", swa_window_size=0, full_to_swa_index_mapping=None
|
|
)
|
|
|
|
if "extras_count" in fields and isinstance(fields["extras_count"], int):
|
|
if fields["extras_count"] > 0:
|
|
yield from emit("extras_zero", extras_count=0)
|
|
|
|
if "real_kv_hash_mode" in fields:
|
|
cur = fields["real_kv_hash_mode"]
|
|
if hasattr(cur, "value"):
|
|
cls = cur.__class__
|
|
if int(cur) == 2:
|
|
yield from emit("hash_mode_bit", real_kv_hash_mode=cls(1))
|
|
elif int(cur) == 1:
|
|
yield from emit("hash_mode_off", real_kv_hash_mode=cls(0))
|
|
|
|
if "real_kv_sources" in fields:
|
|
srcs = fields["real_kv_sources"]
|
|
if isinstance(srcs, tuple) and len(srcs) > 1:
|
|
yield from emit("sources_to_one", real_kv_sources=srcs[:1])
|
|
|
|
if "enable_write_verify_inputs" in fields:
|
|
cur = fields["enable_write_verify_inputs"]
|
|
if hasattr(cur, "value") and int(cur) != 0:
|
|
cls = cur.__class__
|
|
yield from emit("pseudo_off", enable_write_verify_inputs=cls(0))
|
|
|
|
for name in ("verify_capacity", "write_req_capacity"):
|
|
if name in fields and isinstance(fields[name], int):
|
|
current_value = fields[name]
|
|
if current_value > 8:
|
|
yield from emit(f"shrink_{name}", **{name: max(8, current_value // 2)})
|
|
|
|
|
|
def run_verify_diff(
|
|
*,
|
|
buf_pair: tuple[torch.Tensor, torch.Tensor],
|
|
plan_pair: tuple[VerifyPlan, VerifyPlan],
|
|
real_kv_sources_pair: tuple[tuple[RealKvSource, ...], tuple[RealKvSource, ...]] = (
|
|
(),
|
|
(),
|
|
),
|
|
real_kv_hash_mode: consts.RealKvHashMode = consts.RealKvHashMode.NONE,
|
|
kernel_kind: CanaryLaunchTag = CanaryLaunchTag.HEAD_K_FULL,
|
|
device: torch.device = _DEVICE,
|
|
assert_equal: bool = True,
|
|
check_verify_expected_token: bool = True,
|
|
) -> tuple[FakeViolationLog, FakeViolationLog]:
|
|
"""Thin wrapper around ``_run_both_verify`` that creates a fresh log pair and packs (cuda, ref)
|
|
buf/plan/source arguments into 2-tuples to drop ~8 lines of boilerplate per call site.
|
|
"""
|
|
cuda_log, ref_log = make_log_pair(device=device)
|
|
_run_both_verify(
|
|
cuda_canary_buf=buf_pair[0],
|
|
ref_canary_buf=buf_pair[1],
|
|
plan_cuda=plan_pair[0],
|
|
plan_ref=plan_pair[1],
|
|
cuda_log=cuda_log,
|
|
ref_log=ref_log,
|
|
real_kv_sources_cuda=real_kv_sources_pair[0],
|
|
real_kv_sources_ref=real_kv_sources_pair[1],
|
|
real_kv_hash_mode=real_kv_hash_mode,
|
|
kernel_kind=kernel_kind,
|
|
assert_equal=assert_equal,
|
|
check_verify_expected_token=check_verify_expected_token,
|
|
)
|
|
return cuda_log, ref_log
|
|
|
|
|
|
def run_write_diff(
|
|
*,
|
|
buf_pair: tuple[torch.Tensor, torch.Tensor],
|
|
plan_pair: tuple[WritePlan, WritePlan],
|
|
input_ids: torch.Tensor,
|
|
positions: torch.Tensor,
|
|
out_cache_loc: torch.Tensor,
|
|
expected_input_tokens: torch.Tensor,
|
|
expected_input_positions: torch.Tensor,
|
|
enable_write_verify_inputs: bool = False,
|
|
real_kv_sources_pair: tuple[tuple[RealKvSource, ...], tuple[RealKvSource, ...]] = (
|
|
(),
|
|
(),
|
|
),
|
|
real_kv_hash_mode: consts.RealKvHashMode = consts.RealKvHashMode.NONE,
|
|
kernel_kind: CanaryLaunchTag = CanaryLaunchTag.HEAD_K_FULL,
|
|
device: torch.device = _DEVICE,
|
|
assert_equal: bool = True,
|
|
) -> tuple[FakeViolationLog, FakeViolationLog]:
|
|
"""Thin wrapper around ``_run_both_write`` that creates a fresh log pair and packs (cuda, ref)
|
|
buf/plan/source arguments into 2-tuples to drop ~10 lines of boilerplate per call site.
|
|
"""
|
|
cuda_log, ref_log = make_log_pair(device=device)
|
|
_run_both_write(
|
|
cuda_canary_buf=buf_pair[0],
|
|
ref_canary_buf=buf_pair[1],
|
|
plan_cuda=plan_pair[0],
|
|
plan_ref=plan_pair[1],
|
|
input_ids=input_ids,
|
|
positions=positions,
|
|
out_cache_loc=out_cache_loc,
|
|
enable_write_verify_inputs=enable_write_verify_inputs,
|
|
expected_input_tokens=expected_input_tokens,
|
|
expected_input_positions=expected_input_positions,
|
|
cuda_log=cuda_log,
|
|
ref_log=ref_log,
|
|
real_kv_sources_cuda=real_kv_sources_pair[0],
|
|
real_kv_sources_ref=real_kv_sources_pair[1],
|
|
real_kv_hash_mode=real_kv_hash_mode,
|
|
kernel_kind=kernel_kind,
|
|
assert_equal=assert_equal,
|
|
)
|
|
return cuda_log, ref_log
|
|
|
|
|
|
def run_plan_diff(
|
|
*,
|
|
plan_pair: tuple[tuple[VerifyPlan, WritePlan], tuple[VerifyPlan, WritePlan]],
|
|
req_pool_indices: torch.Tensor,
|
|
prefix_lens: torch.Tensor,
|
|
extend_seq_lens: torch.Tensor,
|
|
req_to_token: torch.Tensor,
|
|
extras: tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor],
|
|
swa_window_size: int = 0,
|
|
full_to_swa_index_mapping: Optional[torch.Tensor] = None,
|
|
assert_equal: bool = True,
|
|
active_verify_entries: Optional[int] = None,
|
|
active_write_reqs: Optional[int] = None,
|
|
req_to_verify_expected_tokens: Optional[torch.Tensor] = None,
|
|
req_to_verify_expected_tokens_valid_lens: Optional[torch.Tensor] = None,
|
|
kv_token_id_vs_position_offset: int = 0,
|
|
) -> None:
|
|
"""Thin wrapper around ``_run_both_plan`` that unpacks ``((triton_v, triton_w), (ref_v, ref_w))``
|
|
plan pairs to drop the per-call-site ``triton_verify=.../triton_write=.../ref_verify=...`` block.
|
|
"""
|
|
(triton_verify, triton_write), (ref_verify, ref_write) = plan_pair
|
|
_run_both_plan(
|
|
triton_verify=triton_verify,
|
|
triton_write=triton_write,
|
|
ref_verify=ref_verify,
|
|
ref_write=ref_write,
|
|
req_pool_indices=req_pool_indices,
|
|
prefix_lens=prefix_lens,
|
|
extend_seq_lens=extend_seq_lens,
|
|
req_to_token=req_to_token,
|
|
extras=extras,
|
|
swa_window_size=swa_window_size,
|
|
full_to_swa_index_mapping=full_to_swa_index_mapping,
|
|
assert_equal=assert_equal,
|
|
active_verify_entries=active_verify_entries,
|
|
active_write_reqs=active_write_reqs,
|
|
req_to_verify_expected_tokens=req_to_verify_expected_tokens,
|
|
req_to_verify_expected_tokens_valid_lens=req_to_verify_expected_tokens_valid_lens,
|
|
kv_token_id_vs_position_offset=kv_token_id_vs_position_offset,
|
|
)
|