# PD分离，D端也会做prefill?

**URL:** <https://discuss.vllm.ai/t/pd-d-prefill/1893>\
**Category:** General\
**Created:** [November 13, 2025, 1:12am UTC](https://discuss.vllm.ai/t/pd-d-prefill/1893 "2025-11-13T01:12:01Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![yangshanjun](https://yyz2.discourse-cdn.com/flex036/user_avatar/discuss.vllm.ai/yangshanjun/32/900_2.png) [@yangshanjun](https://discuss.vllm.ai/u/yangshanjun)\
**Post date:** [November 13, 2025, 1:12am UTC](https://discuss.vllm.ai/t/pd-d-prefill/1893/1 "2025-11-13T01:12:01Z")

</div>

![image](https://canada1.discourse-cdn.com/flex036/uploads/vllm/original/1X/87408d0b7ecc19fbc7c0a0e5246244855c40ee4f.png)

这个地方，为什么会将num\_computed\_tokens - 1, deepseek的模型，在判断要不要走Prefill的时候，是根据num\_computed\_tokens \< num\_prompt\_tokens 判断的，那条件岂不是成立？

 ![image](https://canada1.discourse-cdn.com/flex036/uploads/vllm/original/1X/48e3b1d04c0bc4721998d2a3af2addb82e6cfdf4.png)

---

<div class="post-metadata">

**Author:** ![RunLLM](https://yyz2.discourse-cdn.com/flex036/user_avatar/discuss.vllm.ai/runllm/32/233_2.png) [@RunLLM](https://discuss.vllm.ai/u/RunLLM)\
**Post date:** [November 13, 2025, 1:13am UTC](https://discuss.vllm.ai/t/pd-d-prefill/1893/2 "2025-11-13T01:13:41Z")

</div>

vLLM中，`num_computed_tokens` 代表已完成计算（prefill）的token数。由于在prefill阶段，最后一个token通常需要重新计算以获得logits（即不能直接用缓存），所以当`num_computed_tokens == num_prompt_tokens`时，实际上最后一个token还未真正“prefill”完成。因此，代码中会有`if num_computed_tokens == request.num_tokens: num_computed_tokens -= 1`的处理，确保只缓存到倒数第二个token，最后一个token要重新计算（见[源码](https://github.com/vllm-project/vllm/blob/main/vllm/v1/core/sched/scheduler.py)和[官方文档说明](https://docs.vllm.ai/en/latest/api/vllm/v1/core/sched/scheduler/#__span-0-1280)）。

所以，deepseek等模型用`num_computed_tokens < num_prompt_tokens`判断是否需要prefill是合理的。因为即使`num_computed_tokens == num_prompt_tokens`，最后一个token也需要重新prefill，条件本质上是成立的。详细解释见[官方文档](https://docs.vllm.ai/en/latest/api/vllm/v1/core/kv_cache_manager/#__code_43)。

需要更详细的原理或代码流程说明吗？

Sources:

- [https://github.com/vllm-project/vllm/blob/main/vllm/v1/core/sched/scheduler.py](https://github.com/vllm-project/vllm/blob/main/vllm/v1/core/sched/scheduler.py)
- [https://docs.vllm.ai/en/latest/api/vllm/v1/core/sched/scheduler/#\_\_span-0-1280](https://docs.vllm.ai/en/latest/api/vllm/v1/core/sched/scheduler/#__span-0-1280)
- [https://docs.vllm.ai/en/latest/api/vllm/v1/core/kv\_cache\_manager/#\_\_code\_43](https://docs.vllm.ai/en/latest/api/vllm/v1/core/kv_cache_manager/#__code_43)

Hint: Mention @RunLLM in the post for followups.

---

<div class="post-metadata">

**Author:** ![yangshanjun](https://yyz2.discourse-cdn.com/flex036/user_avatar/discuss.vllm.ai/yangshanjun/32/900_2.png) [@yangshanjun](https://discuss.vllm.ai/u/yangshanjun)\
**Post date:** [November 13, 2025, 1:19am UTC](https://discuss.vllm.ai/t/pd-d-prefill/1893/3 "2025-11-13T01:19:30Z")

</div>

![image](https://canada1.discourse-cdn.com/flex036/uploads/vllm/original/1X/760c4435943887ba9e91d14870a2a80596cca243.png)

但是这样不是会走到这个\_forward\_prefill 里面来吗

---

<div class="post-metadata">

**Author:** ![yangshanjun](https://yyz2.discourse-cdn.com/flex036/user_avatar/discuss.vllm.ai/yangshanjun/32/900_2.png) [@yangshanjun](https://discuss.vllm.ai/u/yangshanjun)\
**Post date:** [November 13, 2025, 1:27am UTC](https://discuss.vllm.ai/t/pd-d-prefill/1893/4 "2025-11-13T01:27:10Z")

</div>

由于在prefill阶段，最后一个token通常需要重新计算以获得logits（即不能直接用缓存） – 这个没太理解，能详细讲一下吗
