deepinfer-worker

deepinfer/deepinfer/worker/worker.py · a679bb8 · L89–188 · 固定 commit 上游

这是固定版本源码的只读摘录;可在线阅读,也可通过上游链接查看原文件。

89    def execute_model_step(
90        self,
91        is_prompt: bool,
92        is_placeholder: bool,
93        seq_metadata_list: list[SequenceMetadata] | None = None,
94        scheduler_outputs: SchedulerOutputs | None = None,
95    ) -> np.ndarray[np.uint64]:
96        """The unified entry for model execution: every step (prompt/decode, ZOS on/off,
97        placeholder) goes through this Forward-Post_process-Sample round.
98          1. Forward current step (main model)
99          2. Post-process previous step
100          3. Sample current step
101          4. Post-process current step: in place for prompt / non-ZOS steps;
102             ZOS decode steps defer it to the next step to overlap with forward
103
104        Args:
105            is_prompt: Whether this is a prefill step.
106            is_placeholder: Whether this is a placeholder step (no real seqs).
107            seq_metadata_list: Seqs of this step without padding. If is_placeholder, seq_metadata_list is empty.
108            scheduler_outputs: Scheduler outputs for the current step.
109
110        Returns:
111            Request outputs (serialized as uint64 pointers) ready to send back.
112        """
113        # 1. forward curr step
114        total_q = None
115        correction: _SeqlensCorrection | None = None
116        if self.is_driver_worker and not is_placeholder:
117            total_q = sum(seq.seqlen_q for seq in seq_metadata_list) if is_prompt else scheduler_outputs.num_batched_tokens
118            correction = self._correct_seqlens_qk(seq_metadata_list, is_prompt, total_q)
119
120        metadata_zos = correction.metadata_zos if correction is not None else None
121        if not is_placeholder:
122            main_model_output = self.model_runner.execute_main_model(
123                seq_metadata_list, self.gpu_cache, metadata_zos=metadata_zos, total_q=total_q
124            )
125        else:
126            seq_metadata_list = [self.model_runner._placeholder_seq_metadata(is_prompt)]
127            main_model_output = self.model_runner.execute_main_model(seq_metadata_list, self.gpu_cache, metadata_zos=metadata_zos)
128
129        graph_size = main_model_output.graph_size
130        record_runtime = bool(
131            self.is_driver_worker
132            and envs.DEEPINFER_ENABLE_MTP_VARLEN
133            and self.nextn > 0
134            and not is_prompt
135            and not is_placeholder
136            and graph_size > 0
137        )
138        forward_events = cuda_timer.latest_event_pair("device_forward") if record_runtime else None
139        input_metadata = main_model_output.input_metadata
140        model_output = Movable(main_model_output.model_output)
141        del main_model_output
142
143        # 2. post process prev step
144        request_outputs = self._post_process_step(self.prev_step_state)
145
146        # 3. sample curr step(先用 d2h 回来的 seqlens_q 修正 CPU 侧元数据)
147        if correction is not None:
148            if correction.d2h_evt is not None:
149                correction.d2h_evt.synchronize()
150            scheduler_outputs.update_metadata_for_sampling_zos(
151                seq_metadata_list, correction.seqlens_q_cpu, correction.metadata_zos.remap_cpu, self.nextn
152            )
153
154        sampler_output = self.model_runner.execute_sample(
155            seq_metadata_list,
156            input_metadata,
157            model_output,
158            self.gpu_cache,
159        )
160
161        sample_events = cuda_timer.latest_event_pair("device_sample") if record_runtime else None
162        with cpu_timer.record("pre_sampler_sync"):
163            if self.is_driver_worker:
164                self.engine_callbacks.pre_sampler_sync_fn(scheduler_outputs)
165            self.maybe_gc_collect()
166
167        sample_end_evt = torch.cuda.Event(enable_timing=True)
168        sample_end_evt.record()
169
170        curr_step_state = WorkerStepState(
171            seq_metadata_list=seq_metadata_list,
172            scheduler_outputs=scheduler_outputs,
173            sampler_output=sampler_output,
174            is_prompt=is_prompt,
175            is_placeholder=is_placeholder,
176            sample_end_evt=sample_end_evt,
177            forward_events=forward_events,
178            sample_events=sample_events,
179            graph_size=graph_size,
180        )
181
182        # 4. prompt 步或配置 non-ZOS 时当场 post process;ZOS decode 步留到下一步(与 forward 重叠)
183        if is_prompt or not envs.DEEPINFER_ZERO_OVERHEAD_SCHEDULING:
184            request_outputs = np.concatenate([request_outputs, self._post_process_step(curr_step_state)])
185            self.prev_step_state = None
186        else:
187            self.prev_step_state = curr_step_state
188