Skip to content

[FIX] fix wrong indexing for hidden states when prefix-cache take effect #6551

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

Dutch-voyage
Copy link

Motivation

return_hidden_states=True does not return prefilled hidden_states as expected.
see relevant issue #4997

Modifications

In scheduler_output_processor_mixin.py:116
change

req.hidden_states.append(
    logits_output.hidden_states[
        hidden_state_offset : (
            hidden_state_offset := hidden_state_offset
            + len(req.origin_input_ids)
        )
    ]
    .cpu()
    .clone()
    .tolist()
)

to

req.hidden_states.append(
    logits_output.hidden_states[
        hidden_state_offset : (
            hidden_state_offset := hidden_state_offset
            + req.extend_input_len
        )
    ]
    .cpu()
    .clone()
    .tolist()
)

Checklist

@Dutch-voyage Dutch-voyage changed the title [FIX] fix wrong indeing for hidden states when prefix-cache take effect [FIX] fix wrong indexing for hidden states when prefix-cache take effect May 23, 2025
@Dutch-voyage Dutch-voyage reopened this May 29, 2025
@xiangchensong
Copy link

The proposed modification may still face the same issue. After patching the code, if you try to pass the same query multiple times, the hidden states shape is still not correct.

Try the following code and send the same request multiple times, and the prefilled hidden_states shape will become [1, llm_dim].

python -m sglang.launch_server \
  --model-path Qwen/QwQ-32B \
  --enable-return-hidden-states \
  --host 0.0.0.0 \
  --port 30000 \
  --tp 4 
PORT = 30000
prompts = [
    "Hello, my name is",
    "The president of the United States is",
    "The capital of France is",
    "The future of AI is",
]

sampling_params = {
    "temperature": 0.6,
    "top_p": 0.95,
    "max_new_tokens": 10,
}

json_data = {
    "text": prompts,
    "sampling_params": sampling_params,
    "return_hidden_states": True,
}
for _ in range(3):
    print("Sending request to the server...")
    response = requests.post(
        f"http://localhost:{PORT}/generate",
        json=json_data,
    )
    outputs = response.json()
    for prompt, output in zip(prompts, outputs):
        for i in range(len(output["meta_info"]["hidden_states"])):
            output["meta_info"]["hidden_states"][i] = torch.tensor(
                output["meta_info"]["hidden_states"][i]
            )
        print("===============================")
        print(
            f"Prompt: {prompt}\n"
            f"Prompt_Tokens: {output['meta_info']['prompt_tokens']}\t"
            f"Completion_tokens: {output['meta_info']['completion_tokens']}"
        )
        shapes = [torch.tensor(i.shape).tolist() for i in output["meta_info"]["hidden_states"]]
        print(f"Hidden States Shape: {shapes}")

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants