nano-engine-step

nano-vllm/nanovllm/engine/llm_engine.py · bb823b3 · L49–90 · 固定 commit 上游

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

49    def step(self):
50        seqs, is_prefill = self.scheduler.schedule()
51        num_tokens = sum(seq.num_scheduled_tokens for seq in seqs) if is_prefill else -len(seqs)
52        token_ids = self.model_runner.call("run", seqs, is_prefill)
53        self.scheduler.postprocess(seqs, token_ids, is_prefill)
54        outputs = [(seq.seq_id, seq.completion_token_ids) for seq in seqs if seq.is_finished]
55        return outputs, num_tokens
56
57    def is_finished(self):
58        return self.scheduler.is_finished()
59
60    def generate(
61        self,
62        prompts: list[str] | list[list[int]],
63        sampling_params: SamplingParams | list[SamplingParams],
64        use_tqdm: bool = True,
65    ) -> list[str]:
66        pbar = tqdm(total=len(prompts), desc="Generating", dynamic_ncols=True, disable=not use_tqdm)
67        if not isinstance(sampling_params, list):
68            sampling_params = [sampling_params] * len(prompts)
69        for prompt, sp in zip(prompts, sampling_params):
70            self.add_request(prompt, sp)
71        outputs = {}
72        prefill_throughput = decode_throughput = 0.
73        while not self.is_finished():
74            t = perf_counter()
75            output, num_tokens = self.step()
76            if num_tokens > 0:
77                prefill_throughput = num_tokens / (perf_counter() - t)
78            else:
79                decode_throughput = -num_tokens / (perf_counter() - t)
80            pbar.set_postfix({
81                "Prefill": f"{int(prefill_throughput)}tok/s",
82                "Decode": f"{int(decode_throughput)}tok/s",
83            })
84            for seq_id, token_ids in output:
85                outputs[seq_id] = token_ids
86                pbar.update(1)
87        pbar.close()
88        outputs = [outputs[seq_id] for seq_id in sorted(outputs.keys())]
89        outputs = [{"text": self.tokenizer.decode(token_ids), "token_ids": token_ids} for token_ids in outputs]
90        return outputs