[PD][bug fix] fix memleak when last_batch is none (#13144)

Signed-off-by: Xuchun Shang <xuchun.shang@gmail.com>
Co-authored-by: Shangming Cai <csmthu@gmail.com>
This commit is contained in:
Xuchun Shang
2025-11-17 21:22:20 +08:00
committed by GitHub
co-authored by Shangming Cai
parent 7afff8fd1a
commit 80797c2a15
+15 -4
View File
@@ -597,11 +597,9 @@ class SchedulerDisaggregationPrefillMixin:
return transferred_rids return transferred_rids
def process_prefill_chunk(self: Scheduler) -> None: def process_prefill_chunk(self: Scheduler) -> None:
if self.last_batch and self.last_batch.forward_mode.is_extend(): chunked_req_to_exclude = set()
if self.chunked_req: if self.chunked_req:
# Move the chunked request out of the batch so that we can merge chunked_req_to_exclude.add(self.chunked_req)
# only finished requests to running_batch.
self.last_batch.filter_batch(chunked_req_to_exclude=self.chunked_req)
self.tree_cache.cache_unfinished_req(self.chunked_req, chunked=True) self.tree_cache.cache_unfinished_req(self.chunked_req, chunked=True)
if self.enable_overlap: if self.enable_overlap:
# Delay KV transfer to process_batch_result_disagg_prefill when overlap is enabled to ensure results are resolved # Delay KV transfer to process_batch_result_disagg_prefill when overlap is enabled to ensure results are resolved
@@ -620,6 +618,19 @@ class SchedulerDisaggregationPrefillMixin:
self.req_to_token_pool.free(self.chunked_req.req_pool_idx) self.req_to_token_pool.free(self.chunked_req.req_pool_idx)
self.running_batch.batch_is_full = False self.running_batch.batch_is_full = False
if self.last_batch and self.last_batch.forward_mode.is_extend():
if self.last_batch.chunked_req:
# In the context pipeline parallelism, after the last chunk, the current microbatch still track outdated chunked_req.
# We need to discard it.
chunked_req_to_exclude.add(self.last_batch.chunked_req)
last_bs = self.last_batch.batch_size()
self.last_batch.filter_batch(
chunked_req_to_exclude=list(chunked_req_to_exclude)
)
if self.last_batch.batch_size() < last_bs:
self.running_batch.batch_is_full = False
def send_kv_chunk( def send_kv_chunk(
self: Scheduler, self: Scheduler,
req: Req, req: Req,