Enhance runtime memory check in CI (#15192)
This commit is contained in:
@@ -5,6 +5,7 @@ import signal
|
|||||||
import sys
|
import sys
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
import warnings
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
import psutil
|
import psutil
|
||||||
@@ -175,6 +176,13 @@ class SchedulerRuntimeCheckerMixin:
|
|||||||
if current_batch is None:
|
if current_batch is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
spec_topk = self.server_args.speculative_eagle_topk or 1
|
||||||
|
if spec_topk > 1:
|
||||||
|
warnings.warn(
|
||||||
|
"Runtime memory check (busy) is not supported when speculation topk > 1."
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
_, _, available_size, evictable_size = self._get_token_info()
|
_, _, available_size, evictable_size = self._get_token_info()
|
||||||
protected_size = self.tree_cache.protected_size()
|
protected_size = self.tree_cache.protected_size()
|
||||||
|
|
||||||
|
|||||||
@@ -51,14 +51,11 @@ class ChunkCache(BasePrefixCache):
|
|||||||
]
|
]
|
||||||
self.req_to_token_pool.free(req.req_pool_idx)
|
self.req_to_token_pool.free(req.req_pool_idx)
|
||||||
self.token_to_kv_pool_allocator.free(kv_indices)
|
self.token_to_kv_pool_allocator.free(kv_indices)
|
||||||
self.protected_size_ -= len(req.prefix_indices)
|
|
||||||
|
|
||||||
def cache_unfinished_req(self, req: Req, chunked=False):
|
def cache_unfinished_req(self, req: Req, chunked=False):
|
||||||
kv_indices = self.req_to_token_pool.req_to_token[
|
kv_indices = self.req_to_token_pool.req_to_token[
|
||||||
req.req_pool_idx, : len(req.fill_ids)
|
req.req_pool_idx, : len(req.fill_ids)
|
||||||
]
|
]
|
||||||
self.protected_size_ += len(kv_indices) - len(req.prefix_indices)
|
|
||||||
|
|
||||||
# `req.prefix_indices` will be used in `PrefillAdder::add_chunked_req` later
|
# `req.prefix_indices` will be used in `PrefillAdder::add_chunked_req` later
|
||||||
req.prefix_indices = kv_indices.to(dtype=torch.int64, copy=True)
|
req.prefix_indices = kv_indices.to(dtype=torch.int64, copy=True)
|
||||||
|
|
||||||
@@ -72,7 +69,8 @@ class ChunkCache(BasePrefixCache):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def protected_size(self):
|
def protected_size(self):
|
||||||
return self.protected_size_
|
# NOTE: no protected size in chunk cache. Chunk cache's eviction is the same with request's lifecycle.
|
||||||
|
return 0
|
||||||
|
|
||||||
def pretty_print(self):
|
def pretty_print(self):
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
@@ -114,8 +114,6 @@ class EagleVerifyInput(SpecInput, EagleVerifyInputV2Mixin):
|
|||||||
len(batch.input_ids),
|
len(batch.input_ids),
|
||||||
)
|
)
|
||||||
end_offset = batch.seq_lens + self.draft_token_num
|
end_offset = batch.seq_lens + self.draft_token_num
|
||||||
for req in batch.reqs:
|
|
||||||
req.kv_allocated_len += 1
|
|
||||||
else:
|
else:
|
||||||
prefix_lens = batch.seq_lens
|
prefix_lens = batch.seq_lens
|
||||||
prefix_lens_cpu = batch.seq_lens_cpu
|
prefix_lens_cpu = batch.seq_lens_cpu
|
||||||
|
|||||||
@@ -382,8 +382,6 @@ class EAGLEWorker(TpModelWorker):
|
|||||||
# [ topk 0 ] [ topk 1 ]
|
# [ topk 0 ] [ topk 1 ]
|
||||||
# [iter=0, iter=1, iter=2] [iter=0, iter=1, iter=2]
|
# [iter=0, iter=1, iter=2] [iter=0, iter=1, iter=2]
|
||||||
if self.page_size == 1:
|
if self.page_size == 1:
|
||||||
for req in batch.reqs:
|
|
||||||
req.kv_allocated_len += self.speculative_num_steps * self.topk
|
|
||||||
# TODO: We only need self.speculative_num_steps - 1 * topk cache loc
|
# TODO: We only need self.speculative_num_steps - 1 * topk cache loc
|
||||||
out_cache_loc, token_to_kv_pool_state_backup = alloc_token_slots(
|
out_cache_loc, token_to_kv_pool_state_backup = alloc_token_slots(
|
||||||
batch.tree_cache,
|
batch.tree_cache,
|
||||||
|
|||||||
@@ -316,6 +316,12 @@ class TestEAGLEServerPageSize(TestEAGLEServerBasic):
|
|||||||
"--attention-backend=flashinfer",
|
"--attention-backend=flashinfer",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
# Runtime check only supported for topk=1, and can help to find a leak.
|
||||||
|
with envs.SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY.override(1):
|
||||||
|
super().setUpClass()
|
||||||
|
|
||||||
|
|
||||||
class TestEAGLEServerPageSizeTopk(TestEAGLEServerBasic):
|
class TestEAGLEServerPageSizeTopk(TestEAGLEServerBasic):
|
||||||
# default topk=8 and tokens=64
|
# default topk=8 and tokens=64
|
||||||
|
|||||||
@@ -57,7 +57,9 @@ class TestEagleServerBase(CustomTestCase, MatchedStopMixin):
|
|||||||
*[str(i) for i in range(1, cls.max_running_requests + 1)],
|
*[str(i) for i in range(1, cls.max_running_requests + 1)],
|
||||||
]
|
]
|
||||||
launch_args.extend(cls.other_launch_args)
|
launch_args.extend(cls.other_launch_args)
|
||||||
with envs.SGLANG_ENABLE_SPEC_V2.override(True):
|
with envs.SGLANG_ENABLE_SPEC_V2.override(
|
||||||
|
True
|
||||||
|
), envs.SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY.override(1):
|
||||||
cls.process = popen_launch_server(
|
cls.process = popen_launch_server(
|
||||||
cls.model,
|
cls.model,
|
||||||
cls.base_url,
|
cls.base_url,
|
||||||
|
|||||||
@@ -84,4 +84,5 @@ class TestRadixCacheNonOverlapLPM(TestRadixCacheFCFS):
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
envs.SGLANG_TEST_RETRACT.set(True)
|
envs.SGLANG_TEST_RETRACT.set(True)
|
||||||
|
envs.SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY.set(1)
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -27,7 +27,9 @@ class TestRetractDecode(CustomTestCase):
|
|||||||
cls.model = DEFAULT_MODEL_NAME_FOR_TEST
|
cls.model = DEFAULT_MODEL_NAME_FOR_TEST
|
||||||
cls.base_url = DEFAULT_URL_FOR_TEST
|
cls.base_url = DEFAULT_URL_FOR_TEST
|
||||||
launch_args = ["--chunked-prefill-size", "128"] + cls.other_args
|
launch_args = ["--chunked-prefill-size", "128"] + cls.other_args
|
||||||
with envs.SGLANG_TEST_RETRACT.override(True):
|
with envs.SGLANG_TEST_RETRACT.override(
|
||||||
|
True
|
||||||
|
), envs.SGLANG_ENABLE_STRICT_MEM_CHECK_DURING_BUSY.override(1):
|
||||||
cls.process = popen_launch_server(
|
cls.process = popen_launch_server(
|
||||||
cls.model,
|
cls.model,
|
||||||
cls.base_url,
|
cls.base_url,
|
||||||
|
|||||||
Reference in New Issue
Block a user