Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
ebb2f38
[Quantization] Bump compressed-tensors version (#19295)
kylesayrs Jun 9, 2025
31f58be
[Frontend] Make TIMEOUT_KEEP_ALIVE configurable through env var (#18472)
liusiqian-tal Jun 9, 2025
7d44c46
[TPU]Fix KV cache sharing tests (#19371)
lsy323 Jun 9, 2025
8058c91
[HOT-FIX] Add `kv_sharing_target_layer_name` argument to cutlass_mla …
pavanimajety Jun 9, 2025
3a7cd62
[Misc] Fix a config typo in disable_hybrid_kv_cache_manager configura…
lsy323 Jun 9, 2025
cc867be
[V1] Reuse V0's memory_profiling util for gpu worker memory profiling…
yeqcharlotte Jun 10, 2025
4589b94
[Bugfix] Fix benchmark_moe.py (#19016)
gty111 Jun 10, 2025
9af6d22
Use xla flag to improve the quantized model performance (#19303)
vanbasten23 Jun 10, 2025
c016047
Fix docs/mkdocs/hooks/remove_announcement.py (#19382)
hmellor Jun 10, 2025
6cd4ae8
[Frontend] Add tqdm_leave_pbar to control progress bar visibility (#1…
reidliu41 Jun 10, 2025
646d62f
[Core] Use tuple for kv cache group block ids (#19175)
njhill Jun 10, 2025
1efef71
[Bugfix] Fix modelscope token passed in (#19389)
Potabk Jun 10, 2025
319cb1e
[Core] Batch multi modal input using pinned memory (#19169)
lgeiger Jun 10, 2025
a3f66e7
Add security warning to bug report template (#19365)
russellb Jun 10, 2025
6b1391c
[Misc] refactor neuron_multimodal and profiling (#19397)
reidliu41 Jun 10, 2025
32b3946
Add clear documentation around the impact of debugging flag (#19369)
annapendleton Jun 10, 2025
9368cc9
Automatically bind CPU OMP Threads of a rank to CPU ids of a NUMA nod…
louie-tsai Jun 10, 2025
5f1ac1e
Revert "[v1] Add fp32 support to v1 engine through flex attn" (#19404)
Isotr0py Jun 10, 2025
467bef1
[BugFix][FlashInfer] Fix attention backend interface mismatch with un…
YUNQIUGUO Jun 10, 2025
e424884
[BugFix][CPU] Fix CPU CI by ignore collecting test_pixtral (#19411)
bigPYJ1151 Jun 10, 2025
64a9af5
Simplify ep kernels installation (#19412)
youkaichao Jun 10, 2025
b6553be
[Misc] Slight improvement of the BNB (#19418)
jeejeelee Jun 10, 2025
da9b523
[Docs] Note that alternative structured output backends are supported…
russellb Jun 10, 2025
5241ca5
[ROCm][V1] Adding ROCm to the list of plaforms using V1 by default (#…
gshtras Jun 10, 2025
33f8dba
[Model] use AutoWeightsLoader for commandr (#19399)
PoyenAndyChen Jun 10, 2025
22c3c0a
Add H20-3e fused MoE kernel tuning configs for Qwen3-235B-A22B-FP8 (#…
Xu-Wenqing Jun 10, 2025
77f0d46
[BugFix] Allow use_cudagraph to work with dynamic VLLM_USE_V1 (#19390)
zou3519 Jun 10, 2025
3952731
[New Model]: Support Qwen3 Embedding & Reranker (#19260)
noooop Jun 11, 2025
a45b979
[BugFix] Fix docker build cpu-dev image error (#19394)
2niuhe Jun 11, 2025
2b1e211
Fix test_max_model_len in tests/entrypoints/llm/test_generate.py (#19…
houseroad Jun 11, 2025
1e473b3
[CI] Disable failing GGUF model test (#19454)
mgoin Jun 11, 2025
96ada38
[Misc] Remove unused `MultiModalHasher.hash_prompt_mm_data` (#19422)
lgeiger Jun 11, 2025
2d40665
Add fused MOE config for Qwen3 30B A3B on B200 (#19455)
0xjunhao Jun 11, 2025
7c644ab
Fix Typo in Documentation and Function Name (#19442)
leopardracer Jun 11, 2025
5039ec2
[ROCm] Add rules to automatically label ROCm related PRs (#19405)
houseroad Jun 11, 2025
b8e809a
[Kernel] Support deep_gemm for linear methods (#19085)
artetaout Jun 11, 2025
68b4a26
[Doc] Update V1 User Guide for Hardware and Models (#19474)
DarkLight1337 Jun 11, 2025
a5115f4
[Doc] Fix quantization link titles (#19478)
DarkLight1337 Jun 11, 2025
29a38f0
[Doc] Support "important" and "announcement" admonitions (#19479)
DarkLight1337 Jun 11, 2025
871d6b7
[Misc] Reduce warning message introduced in env_override (#19476)
houseroad Jun 11, 2025
a2142f0
Support non-string values in JSON keys from CLI (#19471)
DarkLight1337 Jun 11, 2025
7484e1f
Add cache to cuda get_device_capability (#19436)
mgoin Jun 11, 2025
3c8694e
Fix some typo (#19475)
Ximingwang-09 Jun 11, 2025
5c8d34a
Support no privileged mode on CPU for docker and kubernetes deploymen…
louie-tsai Jun 11, 2025
943ffa5
[Bugfix] Update the example code, make it work with the latest lmcach…
runzhen Jun 11, 2025
497a91e
[CI] Update FlashInfer to 0.2.6.post1 (#19297)
mgoin Jun 11, 2025
89b0f84
[doc] fix "Other AI accelerators" getting started page (#19457)
davidxia Jun 11, 2025
04a5561
[Misc] Fix misleading ROCm warning (#19486)
jeejeelee Jun 11, 2025
b2d9be6
[Docs] Remove WIP features in V1 guide (#19498)
WoosukKwon Jun 11, 2025
29fa5ca
[Kernels] Add activation chunking logic to FusedMoEModularKernel (#19…
bnellnm Jun 11, 2025
4b03baa
Merge remote-tracking branch 'upstream/main'
gshtras Jun 11, 2025
c7ea0b5
[AMD] [Quantization] Add override flag for attention dtype instead of…
rasmith Jun 11, 2025
d3fc29f
Merge remote-tracking branch 'upstream/main' into upstream_merge_2025…
gshtras Jun 11, 2025
97a9465
[UX] Add Feedback During CUDAGraph Capture (#19501)
robertgshaw2-redhat Jun 11, 2025
42f52cc
[CI/Build] Fix torch nightly CI dependencies (#19505)
zou3519 Jun 11, 2025
2f1c19b
[CI] change spell checker from codespell to typos (#18711)
andyxning Jun 12, 2025
e5d35d6
[BugFix] Force registration of w8a8_block_fp8_matmul_deepgemm via laz…
varun-sundar-rabindranath Jun 12, 2025
3f6341b
Add Triton Fused MoE kernel config for E=16 on B200 (#19518)
b8zhong Jun 12, 2025
7e3e74c
[Frontend] Improve error message in tool_choice validation (#19239)
22quinn Jun 12, 2025
d5bdf89
[BugFix] Work-around incremental detokenization edge case error (#19449)
njhill Jun 12, 2025
1b0b065
[BugFix] Handle missing sep_token for Qwen3-Reranker in Score API (#1…
strutive07 Jun 12, 2025
2e090bd
[AMD][Kernel][BugFix] fix test_rocm_compressed_tensors_w8a8 for rocm …
rasmith Jun 12, 2025
dff6800
Fix typo (#19525)
2niuhe Jun 12, 2025
4f6c42f
[Security] Prevent new imports of (cloud)pickle (#18018)
russellb Jun 12, 2025
af09b3f
[Bugfix][V1] Allow manual FlashAttention for Blackwell (#19492)
mgoin Jun 12, 2025
c9280e6
[Bugfix] Respect num-gpu-blocks-override in v1 (#19503)
jmswen Jun 12, 2025
73e2e01
[Quantization] Improve AWQ logic (#19431)
jeejeelee Jun 12, 2025
c742438
[Doc] Add V1 column to supported models list (#19523)
DarkLight1337 Jun 12, 2025
1129e2b
[V1][NixlConnector] Drop `num_blocks` check (#19532)
NickLucche Jun 12, 2025
b6efafd
[Perf] Vectorize static / dynamic INT8 quant kernels (#19233)
yewentao256 Jun 12, 2025
96846bb
Fix TorchAOConfig skip layers (#19265)
mobicham Jun 12, 2025
5b601bb
Cleanup
gshtras Jun 12, 2025
b376029
Merge remote-tracking branch 'upstream/main' into upstream_merge_2025…
gshtras Jun 12, 2025
0eb854c
New typos checker
gshtras Jun 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .buildkite/scripts/hardware_ci/run-cpu-test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ function cpu_tests() {
pytest -v -s tests/kernels/attention/test_mla_decode_cpu.py -m cpu_model
pytest -v -s tests/models/language/generation -m cpu_model
pytest -v -s tests/models/language/pooling -m cpu_model
pytest -v -s tests/models/multimodal/generation --ignore=tests/models/multimodal/generation/test_mllama.py -m cpu_model"
pytest -v -s tests/models/multimodal/generation \
--ignore=tests/models/multimodal/generation/test_mllama.py \
--ignore=tests/models/multimodal/generation/test_pixtral.py \
-m cpu_model"

# Run compressed-tensor test
docker exec cpu-test-"$NUMA_NODE" bash -c "
Expand Down
10 changes: 10 additions & 0 deletions .github/ISSUE_TEMPLATE/400-bug-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ body:
attributes:
value: >
#### Before submitting an issue, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/vllm-project/vllm/issues?q=is%3Aissue+sort%3Acreated-desc+).
- type: markdown
attributes:
value: |
⚠️ **SECURITY WARNING:** Please review any text you paste to ensure it does not contain sensitive information such as:
- API tokens or keys (e.g., Hugging Face tokens, OpenAI API keys)
- Passwords or authentication credentials
- Private URLs or endpoints
- Personal or confidential data

Consider redacting or replacing sensitive values with placeholders like `<YOUR_TOKEN_HERE>` when sharing configuration or code examples.
- type: textarea
attributes:
label: Your current environment
Expand Down
20 changes: 20 additions & 0 deletions .github/mergify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,26 @@ pull_request_rules:
add:
- multi-modality

- name: label-rocm
description: Automatically apply rocm label
conditions:
- or:
- files~=^csrc/rocm/
- files~=^docker/Dockerfile.rocm
- files~=^requirements/rocm.*\.txt
- files~=^vllm/attention/backends/rocm.*\.py
- files~=^vllm/attention/ops/rocm.*\.py
- files~=^vllm/model_executor/layers/fused_moe/rocm.*\.py
- files~=^vllm/v1/attention/backends/mla/rocm.*\.py
- files~=^tests/kernels/.*_rocm.*\.py
- files=vllm/platforms/rocm.py
- title~=(?i)AMD
- title~=(?i)ROCm
actions:
label:
add:
- rocm

- name: label-structured-output
description: Automatically apply structured-output label
conditions:
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -200,5 +200,5 @@ benchmarks/**/*.json
actionlint
shellcheck*/

# Ingore moe/marlin_moe gen code
# Ignore moe/marlin_moe gen code
csrc/moe/marlin_moe_wna16/kernel_*
15 changes: 10 additions & 5 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@ repos:
args: [--output-format, github, --fix]
- id: ruff-format
files: ^(.buildkite|benchmarks|examples)/.*
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
- repo: https://github.com/crate-ci/typos
rev: v1.32.0
hooks:
- id: codespell
additional_dependencies: ['tomli']
args: ['--toml', 'pyproject.toml']
- id: typos
- repo: https://github.com/PyCQA/isort
rev: 6.0.1
hooks:
Expand Down Expand Up @@ -145,6 +143,13 @@ repos:
types: [python]
pass_filenames: false
additional_dependencies: [regex]
- id: check-pickle-imports
name: Prevent new pickle/cloudpickle imports
entry: python tools/check_pickle_imports.py
language: python
types: [python]
pass_filenames: false
additional_dependencies: [pathspec, regex]
# Keep `suggestion` last
- id: suggestion
name: Suggestion
Expand Down
8 changes: 4 additions & 4 deletions benchmarks/P3L_mling.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,19 +91,19 @@ def get_wikitext2_text(tokenizer):
return test_enc, test_text


def get_flores_plus_text(tokenizer, lng_scrpt):
def get_flores_plus_text(tokenizer, lng_script):
hf_hub_download(
repo_id="alexei-v-ivanov-amd/flores_plus",
repo_type="dataset",
filename=lng_scrpt + ".parquet",
filename=lng_script + ".parquet",
local_dir="./",
)

df = pandas.read_parquet("./" + lng_scrpt + ".parquet")
df = pandas.read_parquet("./" + lng_script + ".parquet")
test_text = "\n\n".join(line.strip() for line in df["text"])
test_enc = tokenizer(test_text)

os.remove("./" + lng_scrpt + ".parquet")
os.remove("./" + lng_script + ".parquet")

return test_enc, test_text

Expand Down
200 changes: 200 additions & 0 deletions benchmarks/kernels/bench_int8_gemm.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
import argparse
import copy
import itertools

import torch
from weight_shapes import WEIGHT_SHAPES

from vllm._custom_ops import cutlass_scaled_mm as vllm_scaled_mm
from vllm._custom_ops import scaled_int8_quant as vllm_scaled_int8_quant
from vllm.triton_utils import triton


@triton.testing.perf_report(
triton.testing.Benchmark(
x_names=["batch_size"],
x_vals=[1, 16, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384],
x_log=False,
line_arg="provider",
line_vals=[
"torch-bf16",
# "int8-tensor-w-token-a",
"int8-tensor-w-tensor-a",
"int8-channel-w-token-a",
# "int8-channel-w-tensor-a",
# "int8-tensor-w-token-a-noquant",
"int8-tensor-w-tensor-a-noquant",
"int8-channel-w-token-a-noquant",
# "int8-channel-w-tensor-a-noquant",
],
line_names=[
"torch-bf16",
# "int8-tensor-w-token-a",
"int8-tensor-w-tensor-a",
"int8-channel-w-token-a",
# "int8-channel-w-tensor-a",
# "int8-tensor-w-token-a-noquant",
"int8-tensor-w-tensor-a-noquant",
"int8-channel-w-token-a-noquant",
# "int8-channel-w-tensor-a-noquant",
],
ylabel="TFLOP/s (larger is better)",
plot_name="BF16 vs INT8 GEMMs",
args={},
)
)
def benchmark(batch_size, provider, N, K):
M = batch_size
device = "cuda"
dtype = torch.bfloat16
a = torch.randn((M, K), device=device, dtype=dtype)
b = torch.randn((N, K), device=device, dtype=dtype)

quantiles = [0.5, 0.2, 0.8]

if "torch-bf16" in provider:
ms, min_ms, max_ms = triton.testing.do_bench_cudagraph(
lambda: torch.nn.functional.linear(a, b), quantiles=quantiles
)

elif "int8" in provider:
# Weights are always quantized ahead of time
if "noquant" in provider:
# For "no quant", we don't measure the time for activations
if "tensor-w-token-a" in provider:
# Dynamic per-token quant for A, static per-tensor quant for B
scale_b = torch.tensor([1.0], device=device, dtype=torch.float32)
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b, scale_b)
assert scale_b_int8.numel() == 1
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a)

elif "tensor-w-tensor-a" in provider:
# Static per-tensor quantization with fixed scales for both A and B
scale_a = torch.tensor([1.0], device=device, dtype=torch.float32)
scale_b = torch.tensor([1.0], device=device, dtype=torch.float32)
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b, scale_b)
assert scale_b_int8.numel() == 1
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a, scale_a)

elif "channel-w-token-a" in provider:
# Dynamic per-channel quantization for weights, per-token quant for A
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b)
assert scale_b_int8.numel() == N
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a)

elif "channel-w-tensor-a" in provider:
# Dynamic per-channel quantization for weights, per-tensor quant for A
scale_a = torch.tensor([1.0], device=device, dtype=torch.float32)
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b)
assert scale_b_int8.numel() == N
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a, scale_a)

def run_quant():
return vllm_scaled_mm(a_int8, b_int8, scale_a_int8, scale_b_int8, dtype)

else:
# Quantize the activations during the GEMM call
if "tensor-w-token-a" in provider:
# Dynamic per-token quant for A, static per-tensor quant for B
scale_b = torch.tensor([1.0], device=device, dtype=torch.float32)
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b, scale_b)
assert scale_b_int8.numel() == 1

def run_quant():
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a)
return vllm_scaled_mm(
a_int8, b_int8, scale_a_int8, scale_b_int8, dtype
)

elif "tensor-w-tensor-a" in provider:
# Static per-tensor quantization with fixed scales for both A and B
scale_a = torch.tensor([1.0], device=device, dtype=torch.float32)
scale_b = torch.tensor([1.0], device=device, dtype=torch.float32)
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b, scale_b)
assert scale_b_int8.numel() == 1

def run_quant():
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a, scale_a)
return vllm_scaled_mm(
a_int8, b_int8, scale_a_int8, scale_b_int8, dtype
)

elif "channel-w-token-a" in provider:
# Dynamic per-channel quant for weights, per-token quant for A
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b)
assert scale_b_int8.numel() == N

def run_quant():
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a)
return vllm_scaled_mm(
a_int8, b_int8, scale_a_int8, scale_b_int8, dtype
)

elif "channel-w-tensor-a" in provider:
# Dynamic per-channel quant for weights, static per-tensor quant for A
scale_a = torch.tensor([1.0], device=device, dtype=torch.float32)
b_int8, scale_b_int8, _ = vllm_scaled_int8_quant(b)
assert scale_b_int8.numel() == N

def run_quant():
a_int8, scale_a_int8, _ = vllm_scaled_int8_quant(a, scale_a)
return vllm_scaled_mm(
a_int8, b_int8, scale_a_int8, scale_b_int8, dtype
)

b_int8 = b_int8.t()

ms, min_ms, max_ms = triton.testing.do_bench_cudagraph(
lambda: run_quant(), quantiles=quantiles
)

# Calculate TFLOP/s, two flops per multiply-add
tflops = lambda ms: (2 * M * N * K) * 1e-12 / (ms * 1e-3)
return tflops(ms), tflops(max_ms), tflops(min_ms)


def prepare_shapes(args):
KN_model_names = []
models_tps = list(itertools.product(args.models, args.tp_sizes))
for model, tp_size in models_tps:
assert model in WEIGHT_SHAPES
for KN, tp_split_dim in copy.deepcopy(WEIGHT_SHAPES[model]):
KN[tp_split_dim] = KN[tp_split_dim] // tp_size
KN.append(model)
KN_model_names.append(KN)
return KN_model_names


if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--models",
nargs="+",
type=str,
default=["meta-llama/Llama-3.1-8B-Instruct"],
choices=[*WEIGHT_SHAPES.keys()],
help="List of models to benchmark",
)
parser.add_argument(
"--tp-sizes",
nargs="+",
type=int,
default=[1],
help="List of tensor parallel sizes",
)
args = parser.parse_args()

KN_model_names = prepare_shapes(args)
for K, N, model_name in KN_model_names:
print(f"{model_name}, N={N} K={K}, BF16 vs INT8 GEMMs TFLOP/s:")
benchmark.run(
print_data=True,
show_plots=True,
save_path=f"bench_int8_res_n{N}_k{K}",
N=N,
K=K,
)

print("Benchmark finished!")
14 changes: 4 additions & 10 deletions benchmarks/kernels/benchmark_moe.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from contextlib import nullcontext
from datetime import datetime
from itertools import product
from types import SimpleNamespace
from typing import Any, TypedDict

import ray
Expand Down Expand Up @@ -43,7 +42,7 @@ def benchmark_config(
use_fp8_w8a8: bool,
use_int8_w8a16: bool,
num_iters: int = 100,
block_quant_shape: List[int] = None,
block_quant_shape: list[int] = None,
use_deep_gemm: bool = False,
) -> float:
init_dtype = torch.float16 if use_fp8_w8a8 else dtype
Expand Down Expand Up @@ -400,7 +399,7 @@ def benchmark(
dtype: torch.dtype,
use_fp8_w8a8: bool,
use_int8_w8a16: bool,
block_quant_shape: List[int] = None,
block_quant_shape: list[int] = None,
use_deep_gemm: bool = False,
) -> tuple[dict[str, int], float]:
current_platform.seed_everything(self.seed)
Expand Down Expand Up @@ -532,7 +531,7 @@ def save_configs(
dtype: torch.dtype,
use_fp8_w8a8: bool,
use_int8_w8a16: bool,
block_quant_shape: List[int],
block_quant_shape: list[int],
) -> None:
dtype_str = get_config_dtype_str(
dtype, use_int8_w8a16=use_int8_w8a16, use_fp8_w8a8=use_fp8_w8a8
Expand Down Expand Up @@ -563,7 +562,6 @@ def main(args: argparse.Namespace):
config = get_config(model=args.model, trust_remote_code=args.trust_remote_code)
if args.model_prefix:
config = getattr(config, args.model_prefix)
config = SimpleNamespace(**config)

if config.architectures[0] == "DbrxForCausalLM":
E = config.ffn_config.moe_num_experts
Expand Down Expand Up @@ -595,11 +593,7 @@ def main(args: argparse.Namespace):
shard_intermediate_size = 2 * intermediate_size // args.tp_size

hidden_size = config.hidden_size
dtype = (
torch.float16
if current_platform.is_rocm()
else getattr(torch, config.torch_dtype)
)
dtype = torch.float16 if current_platform.is_rocm() else config.torch_dtype
use_fp8_w8a8 = args.dtype == "fp8_w8a8"
use_int8_w8a16 = args.dtype == "int8_w8a16"
block_quant_shape = get_weight_block_size_safety(config)
Expand Down
6 changes: 3 additions & 3 deletions csrc/cpu/attention.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,8 @@ FORCE_INLINE std::pair<T, T> reduceSoftmaxAlibi(T* data, const int size,
}

template <typename T>
FORCE_INLINE void reducePartitonSoftmax(const T* max_data, T* sum_data,
const int size) {
FORCE_INLINE void reducePartitionSoftmax(const T* max_data, T* sum_data,
const int size) {
T max = max_data[0];
for (int i = 1; i < size; ++i) {
max = max >= max_data[i] ? max : max_data[i];
Expand Down Expand Up @@ -634,7 +634,7 @@ struct paged_attention_v2_impl {

if (partition_num == 1) continue;

reducePartitonSoftmax(
reducePartitionSoftmax(
max_logits + seq_idx * num_heads * max_num_partitions +
head_idx * max_num_partitions,
exp_sums + seq_idx * num_heads * max_num_partitions +
Expand Down
Loading