vllm-metadata
vllm/vllm/v1/worker/gpu_model_runner.py · ef9339e · L2102–2196 · 固定 commit 上游
这是固定版本源码的只读摘录;可在线阅读,也可通过上游链接查看原文件。
2102 # Update num_computed_tokens on GPU. In async spec decode,
2103 # CPU values are optimistic (all drafts accepted). The kernel
2104 # corrects on GPU using the previous step's
2105 # valid_sampled_token_count_gpu. Otherwise, just copy from CPU.
2106 if (
2107 self.use_async_spec_decode
2108 and self.valid_sampled_token_count_gpu is not None
2109 and prev_req_id_to_index
2110 ):
2111 self.prev_positions.copy_to_gpu(num_reqs)
2112 self.prev_num_draft_tokens.copy_to_gpu()
2113 cpu_values = self.input_batch.num_computed_tokens_cpu_tensor[:num_reqs].to(
2114 device=self.device, non_blocking=True
2115 )
2116 update_num_computed_tokens_for_batch_change(
2117 self.num_computed_tokens,
2118 self.num_accepted_tokens.gpu[:num_reqs],
2119 self.prev_positions.gpu[:num_reqs],
2120 self.valid_sampled_token_count_gpu,
2121 self.prev_num_draft_tokens.gpu,
2122 cpu_values,
2123 )
2124 else:
2125 self.num_computed_tokens[:num_reqs].copy_(
2126 self.input_batch.num_computed_tokens_cpu_tensor[:num_reqs],
2127 non_blocking=True,
2128 )
2129
2130 self.req_indices.np[:total_num_scheduled_tokens] = req_indices
2131 self.req_indices.copy_to_gpu(total_num_scheduled_tokens)
2132 req_indices_gpu = self.req_indices.gpu[:total_num_scheduled_tokens]
2133
2134 self.query_pos.copy_to_gpu(total_num_scheduled_tokens)
2135 self.num_scheduled_tokens.np[:num_reqs] = num_scheduled_tokens
2136 self.num_scheduled_tokens.copy_to_gpu(num_reqs)
2137 num_scheduled_tokens_gpu = self.num_scheduled_tokens.gpu[:num_reqs]
2138 self.positions[:total_num_scheduled_tokens] = (
2139 self.num_computed_tokens[req_indices_gpu].to(torch.int64)
2140 + self.query_pos.gpu[:total_num_scheduled_tokens]
2141 )
2142 self.seq_lens[:num_reqs] = (
2143 self.num_computed_tokens[:num_reqs] + num_scheduled_tokens_gpu
2144 )
2145 self.seq_lens[num_reqs:].fill_(0)
2146
2147 self.input_batch.block_table.compute_slot_mapping(
2148 num_reqs,
2149 self.query_start_loc.gpu[: num_reqs + 1],
2150 self.positions[:total_num_scheduled_tokens],
2151 )
2152
2153 # Copy the tensors to the GPU.
2154 self._prepare_input_ids(
2155 scheduler_output,
2156 num_reqs,
2157 total_num_scheduled_tokens,
2158 cu_num_tokens,
2159 )
2160
2161 if self.uses_mrope:
2162 # Only relevant for models using M-RoPE (e.g, Qwen2-VL)
2163 # Copy one row at a time. mrope_positions is allocated as
2164 # [num_dims, max_num_tokens + 1] with a dummy trailing column to keep it
2165 # non-contiguous for torch.compile, so cpu[:, :N] is a strided view.
2166 # copy_() cannot express a strided source as a single
2167 # cudaMemcpyAsync, so it first gathers into a contiguous *pageable*
2168 # temporary, and a pageable H2D ignores non_blocking=True and
2169 # synchronizes the stream before the transfer starts. Each row is
2170 # contiguous within the pinned allocation, so per-row copies stay on
2171 # the pinned path and are genuinely asynchronous.
2172 for row in range(self.mrope_positions.gpu.shape[0]):
2173 self.mrope_positions.gpu[row, :total_num_scheduled_tokens].copy_(
2174 self.mrope_positions.cpu[row, :total_num_scheduled_tokens],
2175 non_blocking=True,
2176 )
2177 if self.use_async_spec_decode and self.uses_mrope:
2178 drift = self.num_computed_tokens[req_indices_gpu].to(
2179 torch.int64
2180 ) - async_tensor_h2d(
2181 self.input_batch.num_computed_tokens_cpu_tensor[req_indices],
2182 device=self.device,
2183 dtype=torch.int64,
2184 )
2185 self.mrope_positions.gpu[:, :total_num_scheduled_tokens] += drift
2186
2187 use_spec_decode = self.speculative_config is not None
2188 if not use_spec_decode:
2189 # NOTE(woosuk): Due to chunked prefills, the batch may contain
2190 # partial requests. While we should not sample any token
2191 # from these partial requests, we do so for simplicity.
2192 # We will ignore the sampled tokens from the partial requests.
2193 # TODO: Support prompt logprobs.
2194 logits_indices = query_start_loc[1:] - 1
2195 spec_decode_metadata = None
2196 num_sampled_tokens = np.ones(num_reqs, dtype=np.int32)