deepinfer-metadata

deepinfer/csrc/engine/scheduler.hpp · a679bb8 · L667–734 · 固定 commit 上游

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

667    py::tuple schedule(SequenceMetadataPool *sequence_metadata_pool) {
668        auto p_scheduler_outputs = _schedule();
669        auto &scheduler_outputs = *p_scheduler_outputs;
670
671        TORCH_CHECK(scheduler_outputs.num_batched_tokens <= max_num_batched_tokens,
672            "调度的请求 token 数量超过了 max_num_batched_tokens, 不应该", "max_num_batched_tokens: ", max_num_batched_tokens,
673            " scheduler_outputs.num_batched_tokens: ", scheduler_outputs.num_batched_tokens);
674
675        schedule_counter += 1;
676        if (scheduler_outputs.prompt_run) {
677            decode_step = 0;
678        } else {
679            running = scheduler_outputs.scheduled_seqs;
680            decode_step += 1;
681            if (nextn > 0) {
682                TORCH_CHECK(get_num_used_mtp_info_slots() == static_cast<int64_t>(running.size()),
683                    "The number of used MTP info slots must match the running queue size: used=", get_num_used_mtp_info_slots(),
684                    ", running=", running.size());
685            }
686        }
687
688        py::list seq_metadata_list(scheduler_outputs.scheduled_seqs.size());
689        int max_seqlen_q = nextn + 1;
690        int64_t attn_flops = 0, total_flops = 0;
691        int i = 0;
692        for (auto &&p_seq : scheduler_outputs.scheduled_seqs) {
693            auto &&seq = p_seq.get();
694            seq->mtp.schedule_cnt += 1;
695            auto golden_token = seq->mtp.next_golden_tokens(seq->get_output_len(), nextn);
696            int seqlen_q = scheduler_outputs.seqlens_q[i];
697            int seqlen_k = seq->cache.num_tokens + seq->schedule.total_inflight_tokens + seqlen_q;
698            // 本步 position 的开区间上界:prefill 止于 seqlen_k;decode 的 seqlen_q 在 GPU 上至多补到 max_seqlen_q(同 zos.cpp 的
699            // max_k),DFlash draft 再往后 nextn。RoPE cache 等按 position 索引的 buffer 都只有 runtime_max_model_len 行。
700            int position_end = scheduler_outputs.prompt_run ? seqlen_k : seqlen_k - seqlen_q + max_seqlen_q + nextn;
701            TORCH_CHECK(position_end <= runtime_max_model_len,
702                std::format("position_end={} exceeds runtime_max_model_len={}: request_id={} branch={} len={} num_tokens={} inflight={} "
703                            "seqlen_q={} prompt_run={}",
704                    position_end, runtime_max_model_len, seq->request.request_id, seq->schedule.branch_id, seq->get_len(),
705                    seq->cache.num_tokens, seq->schedule.total_inflight_tokens, seqlen_q, scheduler_outputs.prompt_run));
706            auto &&p_metadata =
707                sequence_metadata_pool->allocate(seq, scheduler_outputs.prompt_run, seqlen_q, seqlen_k, std::move(golden_token));
708
709            scheduler_outputs.sum_seqlen_qxk += static_cast<int64_t>(seqlen_q) * seqlen_k;
710            scheduler_outputs.max_seqlen_k = std::max(scheduler_outputs.max_seqlen_k, seqlen_k);
711
712            if (log_stats) {
713                const bool is_prompt = scheduler_outputs.prompt_run;
714                const int full_len = seq->input.tokens.get_len();
715                const auto [attn, total] =
716                    flops_estimator->calc_flops(seqlen_q, seqlen_k, is_prompt, full_len, is_prompt ? seq->cache.swa_valid_start : 0);
717                attn_flops += attn;
718                total_flops += total;
719            }
720
721            if (scheduler_outputs.min_seqlen_k == 0 || scheduler_outputs.min_seqlen_k > seqlen_k) {
722                scheduler_outputs.min_seqlen_k = seqlen_k;
723            }
724
725            seq_metadata_list[i] = std::move(p_metadata);
726            seq->schedule.start_inflight_step(max_seqlen_q);
727
728            i += 1;
729        }
730        scheduler_outputs.attn_tflops = attn_flops / 1e12;
731        scheduler_outputs.total_tflops = total_flops / 1e12;
732        last_step_num_batched_tokens = scheduler_outputs.num_batched_tokens;
733        last_step_cached_tokens = scheduler_outputs.num_cached_tokens_gpu;
734