@@ -1414,26 +1414,33 @@ def update_from_output(
14141414 scheduled_spec_token_ids = (
14151415 scheduler_output .scheduled_spec_decode_tokens .get (req_id )
14161416 )
1417+ num_draft_tokens = 0
1418+ num_accepted_tokens = 0
1419+ num_invalid_spec_tokens = 0
14171420 if scheduled_spec_token_ids and generated_token_ids :
14181421 num_draft_tokens = len (scheduled_spec_token_ids )
1419- num_accepted = len (generated_token_ids ) - 1
1420- num_rejected = num_draft_tokens - num_accepted
1422+ num_accepted_tokens = len (generated_token_ids ) - 1
1423+ num_rejected_tokens = num_draft_tokens - num_accepted_tokens
1424+ if scheduler_output .num_invalid_spec_tokens :
1425+ num_invalid_spec_tokens = (
1426+ scheduler_output .num_invalid_spec_tokens .get (req_id , 0 )
1427+ )
14211428 # num_computed_tokens represents the number of tokens
14221429 # processed in the current step, considering scheduled
14231430 # tokens and rejections. If some tokens are rejected,
14241431 # num_computed_tokens is decreased by the number of rejected
14251432 # tokens.
14261433 if request .num_computed_tokens > 0 :
1427- request .num_computed_tokens -= num_rejected
1434+ request .num_computed_tokens -= num_rejected_tokens
14281435 # If async scheduling, num_output_placeholders also includes
14291436 # the scheduled spec tokens count and so is similarly adjusted.
14301437 if request .num_output_placeholders > 0 :
1431- request .num_output_placeholders -= num_rejected
1438+ request .num_output_placeholders -= num_rejected_tokens
14321439 spec_decoding_stats = self .make_spec_decoding_stats (
14331440 spec_decoding_stats ,
14341441 num_draft_tokens = num_draft_tokens ,
1435- num_accepted_tokens = num_accepted ,
1436- num_invalid_spec_tokens = scheduler_output . num_invalid_spec_tokens ,
1442+ num_accepted_tokens = num_accepted_tokens ,
1443+ num_invalid_spec_tokens = num_invalid_spec_tokens ,
14371444 request_id = req_id ,
14381445 )
14391446
@@ -1565,6 +1572,9 @@ def update_from_output(
15651572 trace_headers = request .trace_headers ,
15661573 routed_experts = routed_experts ,
15671574 num_nans_in_logits = request .num_nans_in_logits ,
1575+ num_draft_tokens = num_draft_tokens ,
1576+ num_accepted_tokens = num_accepted_tokens ,
1577+ num_invalid_spec_tokens = num_invalid_spec_tokens ,
15681578 )
15691579 )
15701580 else :
@@ -2063,15 +2073,14 @@ def make_spec_decoding_stats(
20632073 spec_decoding_stats : SpecDecodingStats | None ,
20642074 num_draft_tokens : int ,
20652075 num_accepted_tokens : int ,
2066- num_invalid_spec_tokens : dict [ str , int ] | None ,
2076+ num_invalid_spec_tokens : int ,
20672077 request_id : str ,
20682078 ) -> SpecDecodingStats | None :
20692079 if not self .log_stats or not num_draft_tokens :
20702080 return None
20712081 if spec_decoding_stats is None :
20722082 spec_decoding_stats = SpecDecodingStats .new (self .num_spec_tokens )
2073- if num_invalid_spec_tokens :
2074- num_draft_tokens -= num_invalid_spec_tokens .get (request_id , 0 )
2083+ num_draft_tokens -= num_invalid_spec_tokens
20752084 spec_decoding_stats .observe_draft (
20762085 num_draft_tokens = num_draft_tokens , num_accepted_tokens = num_accepted_tokens
20772086 )
0 commit comments