Refactor: observability code cleanup (#17862)
Signed-off-by: Feng Su <sufeng@linux.alibaba.com>
This commit is contained in:
@@ -21,7 +21,6 @@ Life cycle of a request in the decode server
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import time
|
||||
from collections import deque
|
||||
from dataclasses import dataclass
|
||||
from http import HTTPStatus
|
||||
@@ -48,7 +47,7 @@ from sglang.srt.disaggregation.utils import (
|
||||
prepare_abort,
|
||||
)
|
||||
from sglang.srt.layers.dp_attention import get_attention_tp_size
|
||||
from sglang.srt.managers.schedule_batch import FINISH_ABORT, RequestStage, ScheduleBatch
|
||||
from sglang.srt.managers.schedule_batch import FINISH_ABORT, ScheduleBatch
|
||||
from sglang.srt.managers.utils import GenerationBatchResult
|
||||
from sglang.srt.mem_cache.allocator import BaseTokenToKVPoolAllocator
|
||||
from sglang.srt.mem_cache.base_prefix_cache import BasePrefixCache
|
||||
@@ -61,7 +60,10 @@ from sglang.srt.mem_cache.memory_pool import (
|
||||
ReqToTokenPool,
|
||||
)
|
||||
from sglang.srt.mem_cache.swa_memory_pool import SWAKVPool
|
||||
from sglang.srt.tracing.trace import trace_event_batch, trace_slice_end
|
||||
from sglang.srt.observability.req_time_stats import (
|
||||
set_schedule_time_batch,
|
||||
set_time_batch,
|
||||
)
|
||||
from sglang.srt.utils import get_int_env_var
|
||||
from sglang.srt.utils.torch_memory_saver_adapter import TorchMemorySaverAdapter
|
||||
|
||||
@@ -392,8 +394,6 @@ class DecodePreallocQueue:
|
||||
prefill_dp_rank=dp_rank,
|
||||
)
|
||||
|
||||
req.add_latency(RequestStage.DECODE_PREPARE)
|
||||
trace_slice_end(RequestStage.DECODE_PREPARE, req.rid, auto_next_anon=True)
|
||||
self.queue.append(
|
||||
DecodeRequest(req=req, kv_receiver=kv_receiver, waiting_for_input=False)
|
||||
)
|
||||
@@ -669,13 +669,7 @@ class DecodePreallocQueue:
|
||||
)
|
||||
preallocated_reqs.append(decode_req)
|
||||
indices_to_remove.add(i)
|
||||
decode_req.req.time_stats.decode_transfer_queue_entry_time = (
|
||||
time.perf_counter()
|
||||
)
|
||||
decode_req.req.add_latency(RequestStage.DECODE_BOOTSTRAP)
|
||||
trace_slice_end(
|
||||
RequestStage.DECODE_BOOTSTRAP, decode_req.req.rid, auto_next_anon=True
|
||||
)
|
||||
decode_req.req.time_stats.set_decode_transfer_queue_entry_time()
|
||||
|
||||
self.queue = [
|
||||
entry for i, entry in enumerate(self.queue) if i not in indices_to_remove
|
||||
@@ -884,12 +878,7 @@ class DecodeTransferQueue:
|
||||
|
||||
decode_req.kv_receiver.clear()
|
||||
decode_req.kv_receiver = None
|
||||
trace_slice_end(
|
||||
RequestStage.DECODE_TRANSFERRED,
|
||||
decode_req.req.rid,
|
||||
auto_next_anon=True,
|
||||
)
|
||||
decode_req.req.time_stats.wait_queue_entry_time = time.perf_counter()
|
||||
decode_req.req.time_stats.set_wait_queue_entry_time()
|
||||
return True
|
||||
|
||||
def pop_transferred(self, rids_to_check: Optional[List[str]] = None) -> List[Req]:
|
||||
@@ -953,7 +942,6 @@ class DecodeTransferQueue:
|
||||
for i in indices_to_remove:
|
||||
idx = self.queue[i].metadata_buffer_index
|
||||
assert idx != -1
|
||||
self.queue[i].req.add_latency(RequestStage.DECODE_TRANSFERRED)
|
||||
self.req_to_metadata_buffer_idx_allocator.free(idx)
|
||||
|
||||
self.queue = [
|
||||
@@ -1076,7 +1064,7 @@ class SchedulerDisaggregationDecodeMixin:
|
||||
ret = self.maybe_prepare_mlp_sync_batch(ret)
|
||||
|
||||
if ret:
|
||||
trace_event_batch("schedule", ret.reqs)
|
||||
set_schedule_time_batch(ret)
|
||||
return ret
|
||||
|
||||
def get_new_prebuilt_batch(self: Scheduler) -> Optional[ScheduleBatch]:
|
||||
@@ -1104,7 +1092,6 @@ class SchedulerDisaggregationDecodeMixin:
|
||||
# we can only add at least `num_not_used_batch` new batch to the running queue
|
||||
if i < num_not_used_batch:
|
||||
can_run_list.append(req)
|
||||
req.add_latency(RequestStage.DECODE_WAITING)
|
||||
req.init_next_round_input(self.tree_cache)
|
||||
else:
|
||||
waiting_queue.append(req)
|
||||
@@ -1113,8 +1100,7 @@ class SchedulerDisaggregationDecodeMixin:
|
||||
if len(can_run_list) == 0:
|
||||
return None
|
||||
|
||||
for req in can_run_list:
|
||||
req.time_stats.forward_entry_time = time.perf_counter()
|
||||
set_time_batch(can_run_list, "set_forward_entry_time")
|
||||
|
||||
# construct a schedule batch with those requests and mark as decode
|
||||
new_batch = ScheduleBatch.init_new(
|
||||
|
||||
@@ -20,7 +20,6 @@ Life cycle of a request in the prefill server
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
import time
|
||||
from collections import deque
|
||||
from http import HTTPStatus
|
||||
from typing import TYPE_CHECKING, List, Optional
|
||||
@@ -43,16 +42,11 @@ from sglang.srt.disaggregation.utils import (
|
||||
poll_and_all_reduce,
|
||||
prepare_abort,
|
||||
)
|
||||
from sglang.srt.managers.schedule_batch import (
|
||||
FINISH_LENGTH,
|
||||
Req,
|
||||
RequestStage,
|
||||
ScheduleBatch,
|
||||
)
|
||||
from sglang.srt.managers.schedule_batch import FINISH_LENGTH, Req, ScheduleBatch
|
||||
from sglang.srt.mem_cache.common import release_kv_cache
|
||||
from sglang.srt.mem_cache.memory_pool import HybridLinearKVPool, NSATokenToKVPool
|
||||
from sglang.srt.mem_cache.swa_memory_pool import SWAKVPool
|
||||
from sglang.srt.tracing.trace import trace_event_batch, trace_slice, trace_slice_end
|
||||
from sglang.srt.observability.req_time_stats import set_schedule_time_batch
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from torch.distributed import ProcessGroup
|
||||
@@ -228,9 +222,7 @@ class PrefillBootstrapQueue:
|
||||
pp_rank=self.pp_rank,
|
||||
)
|
||||
self._process_req(req)
|
||||
req.add_latency(RequestStage.PREFILL_PREPARE)
|
||||
self.queue.append(req)
|
||||
trace_slice_end(RequestStage.PREFILL_PREPARE, req.rid, auto_next_anon=True)
|
||||
|
||||
def extend(self, reqs: List[Req], num_kv_heads: int) -> None:
|
||||
for req in reqs:
|
||||
@@ -240,6 +232,7 @@ class PrefillBootstrapQueue:
|
||||
if len(req.origin_input_ids) > self.max_total_num_tokens:
|
||||
message = f"Request {req.rid} exceeds the maximum number of tokens: {len(req.origin_input_ids)} > {self.max_total_num_tokens}"
|
||||
logger.error(message)
|
||||
req.time_stats.trace_ctx.abort(abort_info={"reason": message})
|
||||
prepare_abort(req, message, status_code=HTTPStatus.BAD_REQUEST)
|
||||
self.scheduler.stream_output([req], req.return_logprob)
|
||||
return True
|
||||
@@ -292,6 +285,7 @@ class PrefillBootstrapQueue:
|
||||
except Exception as e:
|
||||
error_message += f" with exception {e}"
|
||||
logger.error(error_message)
|
||||
req.time_stats.trace_ctx.abort(abort_info={"reason": error_message})
|
||||
prepare_abort(
|
||||
req, error_message, status_code=HTTPStatus.INTERNAL_SERVER_ERROR
|
||||
)
|
||||
@@ -320,12 +314,7 @@ class PrefillBootstrapQueue:
|
||||
|
||||
bootstrapped_reqs.append(req)
|
||||
indices_to_remove.add(i)
|
||||
req.time_stats.wait_queue_entry_time = time.perf_counter()
|
||||
req.add_latency(RequestStage.PREFILL_BOOTSTRAP)
|
||||
|
||||
trace_slice_end(
|
||||
RequestStage.PREFILL_BOOTSTRAP, req.rid, auto_next_anon=True
|
||||
)
|
||||
req.time_stats.set_wait_queue_entry_time()
|
||||
|
||||
self.queue = [
|
||||
entry for i, entry in enumerate(self.queue) if i not in indices_to_remove
|
||||
@@ -355,7 +344,7 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
batch = self.maybe_prepare_mlp_sync_batch(batch)
|
||||
|
||||
if batch:
|
||||
trace_event_batch("schedule", batch.reqs)
|
||||
set_schedule_time_batch(batch)
|
||||
|
||||
return batch
|
||||
|
||||
@@ -470,14 +459,11 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
zip(batch.reqs, next_token_ids, strict=True)
|
||||
):
|
||||
if req.is_chunked <= 0:
|
||||
if req.time_stats.prefill_finished_ts == 0.0:
|
||||
req.time_stats.prefill_finished_ts = time.time()
|
||||
req.time_stats.set_prefill_finished_time()
|
||||
|
||||
# There is no output_ids for prefill
|
||||
req.output_ids.append(next_token_id)
|
||||
self.tree_cache.cache_unfinished_req(req) # update the tree and lock
|
||||
req.add_latency(RequestStage.PREFILL_FORWARD)
|
||||
trace_slice(RequestStage.PREFILL_FORWARD, req.rid, auto_next_anon=True)
|
||||
self.disagg_prefill_inflight_queue.append(req)
|
||||
if self.spec_algorithm.is_eagle() and batch.spec_info is not None:
|
||||
req.output_topk_p = batch.spec_info.topk_p[i]
|
||||
@@ -503,7 +489,7 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
)
|
||||
logprob_pt += num_input_logprobs
|
||||
self.send_kv_chunk(req, last_chunk=True)
|
||||
req.time_stats.prefill_transfer_queue_entry_time = time.perf_counter()
|
||||
req.time_stats.set_prefill_transfer_queue_entry_time()
|
||||
|
||||
if req.grammar is not None:
|
||||
# FIXME: this try-except block is for handling unexpected xgrammar issue.
|
||||
@@ -542,9 +528,7 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
|
||||
if self.enable_overlap:
|
||||
self.send_kv_chunk(req, last_chunk=False, end_idx=req.tmp_end_idx)
|
||||
trace_slice(
|
||||
RequestStage.PREFILL_CHUNKED_FORWARD, req.rid, auto_next_anon=True
|
||||
)
|
||||
req.time_stats.set_last_chunked_prefill_finish_time()
|
||||
|
||||
self.maybe_send_health_check_signal()
|
||||
|
||||
@@ -585,6 +569,7 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
if hasattr(req.disagg_kv_sender, "clear"):
|
||||
req.disagg_kv_sender.clear()
|
||||
done_reqs.append(req)
|
||||
req.time_stats.set_prefill_kv_transfer_finish_time()
|
||||
elif poll == KVPoll.Failed:
|
||||
error_message = f"Prefill transfer failed for request rank={self.tp_rank} {req.rid=} {req.bootstrap_room=}"
|
||||
try:
|
||||
@@ -592,6 +577,7 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
except Exception as e:
|
||||
error_message += f" with exception {e}"
|
||||
logger.warning(error_message)
|
||||
req.time_stats.trace_ctx.abort(abort_info={"reason": error_message})
|
||||
release_kv_cache(req, self.tree_cache) # unlock the tree
|
||||
prepare_abort(
|
||||
req, error_message, status_code=HTTPStatus.INTERNAL_SERVER_ERROR
|
||||
@@ -603,7 +589,7 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
assert False, f"Unexpected polling state {poll=}"
|
||||
|
||||
for req in done_reqs:
|
||||
req.time_stats.completion_time = time.perf_counter()
|
||||
req.time_stats.set_completion_time()
|
||||
|
||||
# Stream requests which have finished transfer
|
||||
self.stream_output(
|
||||
@@ -613,13 +599,10 @@ class SchedulerDisaggregationPrefillMixin:
|
||||
)
|
||||
for req in done_reqs:
|
||||
req: Req
|
||||
req.add_latency(RequestStage.PREFILL_TRANSFER_KV_CACHE)
|
||||
|
||||
release_req_to_metadata_buffer(
|
||||
req, self.req_to_metadata_buffer_idx_allocator
|
||||
)
|
||||
trace_slice(
|
||||
RequestStage.PREFILL_TRANSFER_KV_CACHE, req.rid, thread_finish_flag=True
|
||||
)
|
||||
|
||||
self.disagg_prefill_inflight_queue = undone_reqs
|
||||
|
||||
|
||||
Reference in New Issue
Block a user