Repository: vllm-project/vllm
Issue category: Bug Report

Issue:
[Bug, V1]: LlaVa outputs wrong results in batch inference with V1 code（V0 code is correct)
### Your current environment

<details>
<summary>The output of `python collect_env.py`</summary>

```text
Warning: Your installation of OpenCV appears to be broken: module 'cv2.dnn' has no attribute 'DictValue'.Please follow the instructions at https://github.com/opencv/opencv-python/issues/884 to correct your environment. The import of cv2 has been skipped.
WARNING 12-04 08:26:48 cuda.py:30] You are using a deprecated `pynvml` package. Please install `nvidia-ml-py` instead, and make sure to uninstall `pynvml`. When both of them are installed, `pynvml` will take precedence and cause errors. See https://pypi.org/project/pynvml for more information.
Collecting environment information...
PyTorch version: 2.5.1+cu124
Is debug build: False
CUDA used to build PyTorch: 12.4
ROCM used to build PyTorch: N/A

OS: Ubuntu 22.04.4 LTS (x86_64)
GCC version: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Clang version: Could not collect
CMake version: version 3.29.2
Libc version: glibc-2.35

Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] (64-bit runtime)
Python platform: Linux-5.4.0-125-generic-x86_64-with-glibc2.35
Is CUDA available: True
CUDA runtime version: 12.4.131
CUDA_MODULE_LOADING set to: LAZY
GPU models and configuration:
GPU 0: NVIDIA GeForce RTX 4090
GPU 1: NVIDIA GeForce RTX 4090
GPU 2: NVIDIA GeForce RTX 4090
GPU 3: NVIDIA GeForce RTX 4090
GPU 4: NVIDIA GeForce RTX 4090
GPU 5: NVIDIA GeForce RTX 4090
GPU 6: NVIDIA GeForce RTX 4090
GPU 7: NVIDIA GeForce RTX 4090

Nvidia driver version: 535.54.03
cuDNN version: Probably one of the following:
/usr/lib/x86_64-linux-gnu/libcudnn.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_adv.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_cnn.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_engines_precompiled.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_engines_runtime_compiled.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_graph.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_heuristic.so.9.1.0
/usr/lib/x86_64-linux-gnu/libcudnn_ops.so.9.1.0
HIP runtime version: N/A
MIOpen runtime version: N/A
Is XNNPACK available: True

CPU:
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Address sizes:                   52 bits physical, 57 bits virtual
Byte Order:                      Little Endian
CPU(s):                          96
On-line CPU(s) list:             0-95
Vendor ID:                       GenuineIntel
Model name:                      Intel(R) Xeon(R) Gold 5318Y CPU @ 2.10GHz
CPU family:                      6
Model:                           106
Thread(s) per core:              2
Core(s) per socket:              24
Socket(s):                       2
Stepping:                        6
Frequency boost:                 enabled
CPU max MHz:                     2101.0000
CPU min MHz:                     800.0000
BogoMIPS:                        4200.00
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 invpcid_single ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local wbnoinvd dtherm ida arat pln pts avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq rdpid md_clear pconfig flush_l1d arch_capabilities
Virtualization:                  VT-x
L1d cache:                       2.3 MiB (48 instances)
L1i cache:                       1.5 MiB (48 instances)
L2 cache:                        60 MiB (48 instances)
L3 cache:                        72 MiB (2 instances)
NUMA node(s):                    2
NUMA node0 CPU(s):               0-23,48-71
NUMA node1 CPU(s):               24-47,72-95
Vulnerability Itlb multihit:     Not affected
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Not affected
Vulnerability Mmio stale data:   Mitigation; Clear CPU buffers; SMT vulnerable
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Enhanced IBRS, IBPB conditional, RSB filling
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Not affected

Versions of relevant libraries:
[pip3] numpy==1.26.4
[pip3] nvidia-cublas-cu12==12.4.5.8
[pip3] nvidia-cuda-cupti-cu12==12.4.127
[pip3] nvidia-cuda-nvrtc-cu12==12.4.127
[pip3] nvidia-cuda-runtime-cu12==12.4.127
[pip3] nvidia-cudnn-cu12==9.1.0.70
[pip3] nvidia-cudnn-frontend==1.3.0
[pip3] nvidia-cufft-cu12==11.2.1.3
[pip3] nvidia-curand-cu12==10.3.5.147
[pip3] nvidia-cusolver-cu12==11.6.1.9
[pip3] nvidia-cusparse-cu12==12.3.1.170
[pip3] nvidia-dali-cuda120==1.37.1
[pip3] nvidia-ml-py==12.560.30
[pip3] nvidia-nccl-cu12==2.21.5
[pip3] nvidia-nvimgcodec-cu12==0.2.0.7
[pip3] nvidia-nvjitlink-cu12==12.4.127
[pip3] nvidia-nvtx-cu12==12.4.127
[pip3] nvidia-pyindex==1.0.9
[pip3] onnx==1.16.0
[pip3] optree==0.11.0
[pip3] pynvml==11.4.1
[pip3] pytorch-quantization==2.1.2
[pip3] pytorch-triton==3.0.0+989adb9a2
[pip3] pyzmq==26.0.3
[pip3] torch==2.5.1
[pip3] torch-tensorrt==2.4.0a0
[pip3] torchvision==0.20.1
[pip3] transformers==4.46.3
[pip3] triton==3.1.0
[conda] Could not collect
ROCM Version: Could not collect
Neuron SDK Version: N/A
vLLM Version: 0.6.4.post2.dev221+g3bc94cab
vLLM Build Flags:
CUDA Archs: 5.2 6.0 6.1 7.0 7.2 7.5 8.0 8.6 8.7 9.0+PTX; ROCm: Disabled; Neuron: Disabled
GPU Topology:
GPU0    GPU1    GPU2    GPU3    GPU4    GPU5    GPU6    GPU7    NIC0    NIC1    NIC2    NIC3    CPU Affinity    NUMA Affinity   GPU NUMA ID
GPU0     X      PXB     PXB     PXB     SYS     SYS     SYS     SYS     PXB     PXB     SYS     SYS     0-23,48-71      0               N/A
GPU1    PXB      X      PXB     PXB     SYS     SYS     SYS     SYS     PIX     PIX     SYS     SYS     0-23,48-71      0               N/A
GPU2    PXB     PXB      X      PIX     SYS     SYS     SYS     SYS     PXB     PXB     SYS     SYS     0-23,48-71      0               N/A
GPU3    PXB     PXB     PIX      X      SYS     SYS     SYS     SYS     PXB     PXB     SYS     SYS     0-23,48-71      0               N/A
GPU4    SYS     SYS     SYS     SYS      X      NODE    NODE    NODE    SYS     SYS     NODE    NODE    24-47,72-95     1               N/A
GPU5    SYS     SYS     SYS     SYS     NODE     X      PXB     PXB     SYS     SYS     PXB     PXB     24-47,72-95     1               N/A
GPU6    SYS     SYS     SYS     SYS     NODE    PXB      X      PXB     SYS     SYS     PIX     PIX     24-47,72-95     1               N/A
GPU7    SYS     SYS     SYS     SYS     NODE    PXB     PXB      X      SYS     SYS     PXB     PXB     24-47,72-95     1               N/A
NIC0    PXB     PIX     PXB     PXB     SYS     SYS     SYS     SYS      X      PIX     SYS     SYS
NIC1    PXB     PIX     PXB     PXB     SYS     SYS     SYS     SYS     PIX      X      SYS     SYS
NIC2    SYS     SYS     SYS     SYS     NODE    PXB     PIX     PXB     SYS     SYS      X      PIX
NIC3    SYS     SYS     SYS     SYS     NODE    PXB     PIX     PXB     SYS     SYS     PIX      X

Legend:

  X    = Self
  SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
  NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
  PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
  PXB  = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
  PIX  = Connection traversing at most a single PCIe bridge
  NV#  = Connection traversing a bonded set of # NVLinks

NIC Legend:

  NIC0: mlx5_0
  NIC1: mlx5_1
  NIC2: mlx5_2
  NIC3: mlx5_3

NVIDIA_VISIBLE_DEVICES=all
CUBLAS_VERSION=12.4.5.8
NVIDIA_REQUIRE_CUDA=cuda>=9.0
CUDA_CACHE_DISABLE=1
TORCH_CUDA_ARCH_LIST=5.2 6.0 6.1 7.0 7.2 7.5 8.0 8.6 8.7 9.0+PTX
NCCL_VERSION=2.21.5
NVIDIA_DRIVER_CAPABILITIES=compute,utility,video
NVIDIA_PRODUCT_NAME=PyTorch
CUDA_VERSION=12.4.1.003
PYTORCH_VERSION=2.4.0a0+07cecf4
PYTORCH_BUILD_NUMBER=0
CUDNN_VERSION=9.1.0.70
PYTORCH_HOME=/opt/pytorch/pytorch
LD_LIBRARY_PATH=/usr/local/lib/python3.10/dist-packages/cv2/../../lib64:/usr/local/lib/python3.10/dist-packages/torch/lib:/usr/local/lib/python3.10/dist-packages/torch_tensorrt/lib:/usr/local/cuda/compat/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
NVIDIA_BUILD_ID=91431255
CUDA_DRIVER_VERSION=550.54.15
PYTORCH_BUILD_VERSION=2.4.0a0+07cecf4
CUDA_HOME=/usr/local/cuda
CUDA_HOME=/usr/local/cuda
CUDA_MODULE_LOADING=LAZY
NVIDIA_REQUIRE_JETPACK_HOST_MOUNTS=
NVIDIA_PYTORCH_VERSION=24.05
TORCH_ALLOW_TF32_CUBLAS_OVERRIDE=1
```

</details>


### Model Input Dumps

Version：
0.6.4.post2.dev221+g3bc94cab

Test Image：
[test_img.zip](https://github.com/user-attachments/files/18004889/test_img.zip)


### 🐛 Describe the bug

@WoosukKwon Here is an fatal bug on V1 offline batch inference

```
import os
from vllm import LLM, SamplingParams, envs
from PIL import Image
import time

prompt = "USER: <image>\nWhat is the content of this image?\nASSISTANT:"

fname = 'animal.jpg' # get form the .zip file
image = Image.open(fname).convert('RGB')

envs.VLLM_USE_V1 = True
llm = LLM(model='llava-1.5-7b-hf', trust_remote_code=True, dtype="bfloat16", 
          tokenizer_mode="auto", gpu_memory_utilization=0.9, max_model_len=1000, max_num_batched_tokens=1200)

sampling_params = SamplingParams(temperature=0, max_tokens=128)

inputs = {
    "prompt": prompt,
    "multi_modal_data": {
        "image": image
    }
}

outputs = llm.generate([inputs, inputs], sampling_params)
for output in outputs:
    text = output.outputs[0].text
    print(text)
    print()

print("done")
```

The output is

>  The image features a black and white panda bear sitting in a grassy area. The panda is eating grass, and it appears to be enjoying the meal. The scene is set in a lush green environment, with the panda being the main focus of the image.
> 
>  ASSA TEXT

That is, though the two inputs are the same, the results are not the same.

Here is my debug info:
(1) If I comment ```envs.VLLM_USE_V1 = True```，I can get the two correct result，so the bug is in V1
(2) If I ajust ```max_model_len``` larger(2 times seqlen)，I can get the two correct result

### Before submitting a new issue...

- [X] Make sure you already searched for relevant issues, and asked the chatbot living at the bottom right corner of the [documentation page](https://docs.vllm.ai/en/latest/), which can answer lots of frequently asked questions.


Hints:
cc @ywang96 @WoosukKwon 
@PYNing Thanks for reporting this bug! I can confirm this is reproducible, and only happens ~~when `max_model_len` is smaller than `max_num_batched_tokens`.~~ when the `max_model_len` is not divisible by `block_size` (default block_size is 16 in V1).

Code to reproduce:
``` python
import os
from vllm import LLM, SamplingParams, envs
from PIL import Image
import time
from vllm.assets.image import ImageAsset

max_model_len = <to-be-specified>

prompt = "USER: <image>\nWhat is the content of this image?\nASSISTANT:"
image = ImageAsset("cherry_blossom").pil_image.convert("RGB")

envs.VLLM_USE_V1 = True
llm = LLM(model='llava-hf/llava-1.5-7b-hf', trust_remote_code=True, dtype="bfloat16", 
          tokenizer_mode="auto", gpu_memory_utilization=0.9, max_model_len=max_model_len, max_num_batched_tokens=1200)
sampling_params = SamplingParams(temperature=0, max_tokens=128)
inputs = {
    "prompt": prompt,
    "multi_modal_data": {
        "image": image
    }
}
outputs = llm.generate([inputs, inputs], sampling_params)
for output in outputs:
    text = output.outputs[0].text
    print("response:", text)
    print()
```

When setting `max_model_len` to 1199, incorrect responses were generated:
```linux
Response:  The image features a tall tower with a spire, surrounded by a beautiful flowering tree filled with pink flowers. The tower stands tall in the background, while the tree's branches are filled with the vibrant blossoms. The combination of the tower and the flowering tree creates a picturesque scene, showcasing the beauty of nature and architecture.

Response: 100)Follow us on Facebook.
```

When setting `max_model_len` to 700, incorrect responses were generated:
```
Response:  The image features a tall tower with a spire, surrounded by a beautiful flowering tree filled with pink flowers. The tower stands tall in the background, while the tree's branches are filled with the vibrant blossoms. The combination of the tower and the tree creates a picturesque scene, showcasing the beauty of nature and architecture.

Response: ASSISTANT:ASSISTANT:In the image, the color palette is a mix of the primary colors, with the most dominant color being the color of the sky. The image is a beautiful representation of the sky, with the clouds and the sun. The clouds are a mix of the primary colors, with the most dominant color being the color of the sky. The image is a beautiful representation of the sky, with the clouds and the sun. The clouds are a mix of the primary colors, with the
```


When setting `max_model_len` to 1201, incorrect responses were generated:
```linux
Response:  The image features a tall tower with a spire, surrounded by a beautiful blossoming tree filled with pink flowers. The tower stands tall in the background, while the tree's branches are filled with the vibrant pink flowers, creating a picturesque scene. The tower's spire can be seen peeking through the tree's branches, adding a sense of depth to the image.

Response:  yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it should be yes, it
```

When setting `max_model_len` to 800, correct responses were generated:
```linux
Response:  The image features a tall tower with a spire, surrounded by a beautiful cherry blossom tree. The tree is filled with pink flowers, creating a picturesque scene. The tower stands tall in the background, with the blossoming tree in the foreground. The combination of the tower and the tree creates a captivating and serene atmosphere.

Response:  The image features a tall tower with a spire, surrounded by a beautiful cherry blossom tree. The tree is filled with pink flowers, creating a picturesque scene. The tower stands tall in the background, with the blossoming tree in the foreground. The combination of the tower and the tree creates a captivating and serene atmosphere.
```

When setting `max_model_len` to 1200, correct responses were generated:
```linux
Response:  The image features a tall tower with a spire, surrounded by a beautiful cherry blossom tree. The tree is filled with pink flowers, creating a picturesque scene. The tower stands tall in the background, with the blossoming tree in the foreground. The combination of the tower and the tree creates a captivating and serene atmosphere.

Response:  The image features a tall tower with a spire, surrounded by a beautiful cherry blossom tree. The tree is filled with pink flowers, creating a picturesque scene. The tower stands tall in the background, with the blossoming tree in the foreground. The combination of the tower and the tree creates a captivating and serene atmosphere.
```

Patch:
diff --git a/vllm/v1/worker/gpu_model_runner.py b/vllm/v1/worker/gpu_model_runner.py
index 4692762493f00..e8d964a722f60 100644
--- a/vllm/v1/worker/gpu_model_runner.py
+++ b/vllm/v1/worker/gpu_model_runner.py
@@ -260,7 +260,8 @@ def _prepare_inputs(self, scheduler_output: "SchedulerOutput"):
         # E.g., [0, 1, 0, 1, 2, 3, 4, 0, 1, 2]
         # -> [0, 1, M, M + 1, M + 2, M + 3, M + 4, 2 * M, 2 * M + 1, 2 * M + 2]
         # where M is the max_model_len.
-        token_indices = positions_np + req_indices * self.max_model_len
+        token_indices = (positions_np +
+                         req_indices * self.input_batch.token_ids_cpu.shape[1])
         token_indices = torch.from_numpy(token_indices)
         input_ids = torch.empty((total_num_scheduled_tokens, ),
                                 dtype=torch.int32,
@@ -273,9 +274,15 @@ def _prepare_inputs(self, scheduler_output: "SchedulerOutput"):
                            out=input_ids)
 
         # Calculate the slot mapping.
+        # E.g., [0, 1, 0, 1, 2, 3, 4, 0, 1, 2]
+        # -> [0, 0, K, K, K + 1, K + 1, K + 2, 2 * K, 2 * K, 2 * K + 1]
+        # where K is the max_num_blocks_per_req and the block size is 2.
+        # NOTE(woosuk): We can't simply use `token_indices // block_size` here
+        # because M (max_model_len) is not necessarily divisible by block_size.
         block_numbers = self.input_batch.block_table_cpu_tensor.flatten()[
-            token_indices // self.block_size]
-        block_offsets = token_indices % self.block_size
+            req_indices * self.max_num_blocks_per_req +
+            positions_np // self.block_size]
+        block_offsets = torch.from_numpy(positions_np % self.block_size)
         slot_mapping = torch.empty((total_num_scheduled_tokens, ),
                                    dtype=torch.int32,
                                    device="cpu",


Test patch: