A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 6, 00:45 UTC
[Refactor] Rename `WAITING_FOR_FSM` to `WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR` (#38048)
Signed-off-by: yewentao256 <zhyanwentao@126.com>
Wentao Ye committed
Mar 25, 2026 at 11:41 UTC
1bf2ddd0ee24cf878a87b643536b749676e8f902
5 files changed
+34
-25
tests/v1/core/test_scheduler.py
+24
-19
@@ -3652,7 +3652,7 @@ def test_prepend_skipped_requests_order():
3652
assert waiting_reqs == expected_waiting_reqs
3653
3654
3655
-def test_remote_kv_promotion_keeps_fcfs_with_fsm_prefix():
3655
+def test_remote_kv_promotion_keeps_fcfs_with_grammar_prefix():
3656
scheduler = create_scheduler(max_num_seqs=1)
3657
scheduler.connector = Mock()
3658
scheduler.connector.get_num_new_matched_tokens.return_value = (0, False)
@@ -3661,19 +3661,20 @@ def test_remote_kv_promotion_keeps_fcfs_with_fsm_prefix():
3661
for request in requests:
3662
scheduler.add_request(request)
3663
3664
- req_fsm_1, req_fsm_2, req_remote, req_tail = list(scheduler.waiting)
3664
+ req_grammar_1, req_grammar_2, req_remote, req_tail = list(scheduler.waiting)
3665
3666
- # simulate two FSM requests at the waiting head that become ready now.
3667
- req_fsm_1.status = RequestStatus.WAITING_FOR_FSM
3668
- req_fsm_1.structured_output_request = Mock(grammar=object())
3669
- req_fsm_2.status = RequestStatus.WAITING_FOR_FSM
3670
- req_fsm_2.structured_output_request = Mock(grammar=object())
3666
+ # simulate two structured-output grammar requests at the waiting head
3667
+ # that become ready now.
3668
+ req_grammar_1.status = RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR
3669
+ req_grammar_1.structured_output_request = Mock(grammar=object())
3670
+ req_grammar_2.status = RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR
3671
+ req_grammar_2.structured_output_request = Mock(grammar=object())
3672
3673
# simulate a remote-KV request that is ready to be promoted now.
3674
req_remote.status = RequestStatus.WAITING_FOR_REMOTE_KVS
3674
- scheduler.waiting.remove_requests([req_fsm_1, req_fsm_2, req_remote])
3675
- scheduler.skipped_waiting.add_request(req_fsm_1)
3676
- scheduler.skipped_waiting.add_request(req_fsm_2)
3675
+ scheduler.waiting.remove_requests([req_grammar_1, req_grammar_2, req_remote])
3676
+ scheduler.skipped_waiting.add_request(req_grammar_1)
3677
+ scheduler.skipped_waiting.add_request(req_grammar_2)
3678
scheduler.skipped_waiting.add_request(req_remote)
3679
scheduler.finished_recving_kv_req_ids.add(req_remote.request_id)
3680
scheduler._update_waiting_for_remote_kv = Mock()
@@ -3681,13 +3682,13 @@ def test_remote_kv_promotion_keeps_fcfs_with_fsm_prefix():
3682
output = scheduler.schedule()
3683
3684
assert output.scheduled_new_reqs
3684
- assert output.scheduled_new_reqs[0].req_id == req_fsm_1.request_id
3685
+ assert output.scheduled_new_reqs[0].req_id == req_grammar_1.request_id
3686
waiting_req_ids = [
3687
req.request_id
3688
for req in list(scheduler.skipped_waiting) + list(scheduler.waiting)
3689
]
3690
assert waiting_req_ids == [
3690
- req_fsm_2.request_id,
3691
+ req_grammar_2.request_id,
3692
req_remote.request_id,
3693
req_tail.request_id,
3694
]
@@ -3700,28 +3701,32 @@ def test_fcfs_mixed_skipped_waiting_types_keep_order():
3701
mk_req = lambda req_id, num_tokens=1: create_requests( # noqa: E731
3702
num_requests=1, num_tokens=num_tokens, req_ids=[req_id]
3703
)[0]
3703
- req_fsm, req_remote, req_stream = mk_req("fsm"), mk_req("remote"), mk_req("stream")
3704
+ req_grammar, req_remote, req_stream = (
3705
+ mk_req("grammar"),
3706
+ mk_req("remote"),
3707
+ mk_req("stream"),
3708
+ )
3709
req_regular, req_tail = mk_req("regular", 20), mk_req("tail")
3705
- req_fsm.status = RequestStatus.WAITING_FOR_FSM
3706
- req_fsm.structured_output_request = Mock(grammar=None)
3710
+ req_grammar.status = RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR
3711
+ req_grammar.structured_output_request = Mock(grammar=None)
3712
req_remote.status = RequestStatus.WAITING_FOR_REMOTE_KVS
3713
req_stream.status = RequestStatus.WAITING_FOR_STREAMING_REQ
3714
3710
- for req in (req_fsm, req_remote, req_stream, req_regular, req_tail):
3715
+ for req in (req_grammar, req_remote, req_stream, req_regular, req_tail):
3716
scheduler.add_request(req)
3717
scheduler.schedule()
3713
- assert list(scheduler.skipped_waiting) == [req_fsm, req_remote, req_stream]
3718
+ assert list(scheduler.skipped_waiting) == [req_grammar, req_remote, req_stream]
3719
3720
scheduler.finish_requests(req_regular.request_id, RequestStatus.FINISHED_ABORTED)
3721
assert not scheduler.running
3722
3718
- req_fsm.structured_output_request = Mock(grammar=object())
3723
+ req_grammar.structured_output_request = Mock(grammar=object())
3724
scheduler.finished_recving_kv_req_ids.add(req_remote.request_id)
3725
req_stream.status = RequestStatus.WAITING
3726
3727
second_output = scheduler.schedule()
3728
expected_order = [
3724
- req_fsm.request_id,
3729
+ req_grammar.request_id,
3730
req_remote.request_id,
3731
req_stream.request_id,
3732
req_tail.request_id,
tests/v1/test_request.py
+4
-1
@@ -6,7 +6,10 @@ from vllm.v1.request import RequestStatus
6
def test_request_status_fmt_str():
7
"""Test that the string representation of RequestStatus is correct."""
8
assert f"{RequestStatus.WAITING}" == "WAITING"
9
- assert f"{RequestStatus.WAITING_FOR_FSM}" == "WAITING_FOR_FSM"
9
+ assert (
10
+ f"{RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR}"
11
+ == "WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR"
12
+ )
13
assert f"{RequestStatus.WAITING_FOR_REMOTE_KVS}" == "WAITING_FOR_REMOTE_KVS"
14
assert f"{RequestStatus.WAITING_FOR_STREAMING_REQ}" == "WAITING_FOR_STREAMING_REQ"
15
assert f"{RequestStatus.RUNNING}" == "RUNNING"
vllm/v1/core/sched/scheduler.py
+2
-2
@@ -1550,7 +1550,7 @@ class Scheduler(SchedulerInterface):
1550
@staticmethod
1551
def _is_blocked_waiting_status(status: RequestStatus) -> bool:
1552
return status in (
1553
- RequestStatus.WAITING_FOR_FSM,
1553
+ RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR,
1554
RequestStatus.WAITING_FOR_REMOTE_KVS,
1555
RequestStatus.WAITING_FOR_STREAMING_REQ,
1556
)
@@ -2084,7 +2084,7 @@ class Scheduler(SchedulerInterface):
2084
request.status = RequestStatus.WAITING
2085
return True
2086
2087
- if request.status == RequestStatus.WAITING_FOR_FSM:
2087
+ if request.status == RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR:
2088
structured_output_req = request.structured_output_request
2089
if not (structured_output_req and structured_output_req.grammar):
2090
return False
vllm/v1/request.py
+2
-2
@@ -102,7 +102,7 @@ class Request:
102
assert sampling_params.max_tokens is not None
103
self.max_tokens = sampling_params.max_tokens
104
if self.structured_output_request is not None:
105
- self.status = RequestStatus.WAITING_FOR_FSM
105
+ self.status = RequestStatus.WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR
106
107
if sampling_params.extra_args is not None:
108
self.kv_transfer_params = sampling_params.extra_args.get(
@@ -296,7 +296,7 @@ class RequestStatus(enum.IntEnum):
296
"""Status of a request."""
297
298
WAITING = enum.auto()
299
- WAITING_FOR_FSM = enum.auto()
299
+ WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR = enum.auto()
300
WAITING_FOR_REMOTE_KVS = enum.auto()
301
WAITING_FOR_STREAMING_REQ = enum.auto()
302
RUNNING = enum.auto()
vllm/v1/structured_output/__init__.py
+2
-1
@@ -42,7 +42,8 @@ class StructuredOutputManager:
42
43
# When in external_launcher mode, async grammar compilation causes deadlocks
44
# due to external_launcher mode having a scheduler for each TP rank.
45
- # Async grammar compilation causes the WAITING_FOR_FSM → WAITING transition to
45
+ # Async grammar compilation causes the
46
+ # WAITING_FOR_STRUCTURED_OUTPUT_GRAMMAR → WAITING transition to
47
# happen at different times on different TP ranks,
48
# breaking the determinism assumption that external_launcher relies on.
49
self._use_async_grammar_compilation = (