vllm-budget
vllm/vllm/v1/core/sched/scheduler.py · ef9339e · L800–871 · 固定 commit 上游
这是固定版本源码的只读摘录;可在线阅读,也可通过上游链接查看原文件。
800 # First, schedule the RUNNING requests.
801 req_index = 0
802 while req_index < len(self.running) and token_budget > 0:
803 request = self.running[req_index]
804 if input_budget <= draft_slots:
805 break
806
807 if (
808 request.num_output_placeholders > 0
809 # This is (num_computed_tokens + 1) - (num_output_placeholders - 1).
810 # Since output placeholders are also included in the computed tokens
811 # count, we subtract (num_output_placeholders - 1) to remove any draft
812 # tokens, so that we can be sure no further steps are needed even if
813 # they are all rejected.
814 and request.num_computed_tokens + 2 - request.num_output_placeholders
815 >= request.num_prompt_tokens + request.max_tokens
816 ):
817 # Async scheduling: Avoid scheduling an extra step when we are sure that
818 # the previous step has reached request.max_tokens. We don't schedule
819 # partial draft tokens since this prevents uniform decode optimizations.
820 req_index += 1
821 continue
822
823 if self.current_step < request.next_decode_eligible_step:
824 # V2+PP+async: enforce `pp_size` steps between same-req decodes
825 # to match worker-side sampled-tokens broadcast slot ring cadence.
826 req_index += 1
827 continue
828
829 if defer_prefills and request.is_prefill_chunk:
830 # DP prefill balancing: defer this in-progress prefill chunk to a
831 # cadence-aligned step; decodes still run to fill this step.
832 req_index += 1
833 continue
834
835 if (
836 self.ec_connector is not None
837 and request.mm_features
838 and not self.ec_connector.ensure_cache_available(
839 request,
840 request.num_computed_tokens - request.num_output_placeholders,
841 )
842 ):
843 req_index += 1
844 continue
845
846 num_new_tokens = (
847 request.num_tokens_with_spec
848 + request.num_output_placeholders
849 - request.num_computed_tokens
850 )
851 if 0 < long_prefill_token_threshold < num_new_tokens:
852 num_new_tokens = long_prefill_token_threshold
853 num_new_tokens = min(
854 num_new_tokens, token_budget, input_budget - draft_slots
855 )
856
857 # Make sure the input position does not exceed the max model len.
858 # This is necessary when using spec decoding.
859 num_new_tokens = min(
860 num_new_tokens,
861 self.max_model_len
862 - request.num_computed_tokens
863 - self.num_sampled_tokens_per_step,
864 )
865
866 # Apply Mamba alignment before encoder caps.
867 if self.need_mamba_block_aligned_split:
868 num_new_tokens = self._mamba_block_aligned_split(
869 request, num_new_tokens
870 )
871