发布时间:2026/8/27 17:11:52
Rust 异步推理管线的流水线设计:Prefill 与 Decode 阶段的并行化调度引擎 Rust 异步推理管线的流水线设计Prefill 与 Decode 阶段的并行化调度引擎一、推理流水线的利用率困局50% 时间在等 I/O大模型推理服务中Prefill 阶段首次处理输入 prompt和 Decode 阶段逐 token 生成输出的计算特征截然不同。Prefill 是计算密集型——需要处理所有输入 token 的 Attention、投影和 FFN。Decode 是访存密集型——每次只处理 1 个 token大部分时间等待 HBM 数据。在单请求串行执行模式下这两种阶段交替出现GPU 利用率呈锯齿状波动Prefill 阶段 GPU 满负荷 ~3ms然后 Decode 阶段 GPU 空转 ~2ms再下一个 Prefill...平均利用率约 50%~60%。如果能让不同请求的 Prefill 和 Decode 阶段交替执行——一个请求在执行 Decode 时另一个请求执行 Prefill——GPU 的 SM 和显存带宽可以更充分地利用。这就是异步推理管线的核心思想。二、Prefill-Decode 分离调度的数据流模型graph TB subgraph 请求队列 R1[Request-1: Prefill pending] R2[Request-2: Decoding] R3[Request-3: Prefill pending] end subgraph 调度引擎 S{Schduler} S --|选择 Prefill 请求| P[Prefill Slot] S --|选择 Decode 请求| D[Decode Slots] end subgraph GPU 执行 P -- G1[Prefill 批次br/(Batch sizeN)] D -- G2[Decode 批次br/(Batch sizeM)] end subgraph KV Cache G1 -- KC[写入 KV Cache] G2 -- KC[读取 KV Cache] end R1 -- S R2 -- S R3 -- S style S fill:#1a1a2e,stroke:#e94560,color:#fff style P fill:#16213e,stroke:#0f3460,color:#fff style D fill:#16213e,stroke:#0f3460,color:#fff调度引擎需要协同两个独立的调度维度时间维度的交错Prefill 和 Decode 交替提交 GPU kernel让两种计算模式互补资源需求批次维度的聚合多个请求的 Prefill 可以批量执行连续批处理多个请求的 Decode 也可以批量执行关键约束是 KV Cache 的一致性Prefill 写 KV CacheDecode 读 KV Cache。在 Prefill 和 Decode 交替执行时必须确保 Prefill 写入的 KV Cache 对下一个 Decode 可见。这需要通过 CUDA Stream 的同步原语保证。三、异步推理调度引擎的 Rust 实现use std::collections::{VecDeque, HashMap}; use std::sync::Arc; use tokio::sync::{mpsc, Semaphore, Notify, RwLock}; use std::time::Instant; /// 推理请求的状态机 #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum RequestState { /// 等待 Prefill PendingPrefill, /// Prefill 执行中 Prefilling, /// 等待 DecodePrefill 完成KV Cache 已就绪 PendingDecode, /// Decode 执行中 Decoding, /// 已完成 Completed, } /// 推理请求 pub struct InferenceRequest { pub id: u64, pub tokens: Vecu32, pub state: RequestState, /// token 生成的最大数量 pub max_new_tokens: usize, /// 已生成的 token 数 pub generated_count: usize, /// 请求到达时间 pub arrived_at: Instant, /// 输入 token 数量 pub input_len: usize, } /// 调度配置 pub struct SchedulerConfig { /// Prefill 的最大批次大小 /// 为什么限制 max_prefill_batch /// Prefill 的计算量是 Decode 的 input_len 倍 /// 过大的 Prefill 批次会显著增加延迟 pub max_prefill_batch: usize, /// Decode 流的最大并发数 pub max_decode_streams: usize, /// 是否允许 Prefill 抢占 Decode pub prefill_preemption: bool, } /// 异步推理调度器 pub struct AsyncInferenceScheduler { /// Prefill 请求队列 prefill_queue: RwLockVecDequeInferenceRequest, /// Decode 请求队列 decode_queue: RwLockVecDequeInferenceRequest, /// 活跃的 Decode 请求 active_decodes: RwLockVecInferenceRequest, /// Decode 并发槽位 /// 为什么用 Semaphore 控制并发 /// 每个 Decode 流占用固定的显存KV Cache /// Semaphore 确保活跃 Decode 不超过显存容量 decode_slots: ArcSemaphore, /// Prefill 可用的通知 prefill_ready: Notify, config: SchedulerConfig, } impl AsyncInferenceScheduler { pub fn new(config: SchedulerConfig) - Self { Self { prefill_queue: RwLock::new(VecDeque::new()), decode_queue: RwLock::new(VecDeque::new()), active_decodes: RwLock::new(Vec::new()), decode_slots: Arc::new(Semaphore::new(config.max_decode_streams)), prefill_ready: Notify::new(), config, } } /// 接收新请求并路由 pub async fn submit_request(self, mut request: InferenceRequest) { request.state RequestState::PendingPrefill; request.arrived_at Instant::now(); self.prefill_queue.write().await.push_back(request); // 通知调度线程有新任务 self.prefill_ready.notify_one(); } /// 调度器主循环决策何时执行 Prefill 或 Decode /// /// 为什么不用固定轮询间隔 /// 固定间隔在高负载下延迟低低负载下浪费 CPU /// Notify timeout 结合既保证低延迟响应又避免忙等 pub async fn run_scheduler_loop(self) { loop { // 决策选择执行 Prefill 还是 Decode let decision self.make_scheduling_decision().await; match decision { SchedulingDecision::RunPrefill(requests) { self.execute_prefill_batch(requests).await; } SchedulingDecision::RunDecode { self.execute_decode_step().await; } SchedulingDecision::Idle { // 无任务可执行等待新请求 self.prefill_ready.notified().await; } } } } /// 调度决策核心逻辑 /// /// 为什么 Prefill 有更高优先级 /// 1. Prefill 延迟直接影响首 token 时间TTFT /// 2. Decode 延迟只影响 per-token 时间TPOT用户感知更弱 /// 3. Prefill 完成后才能开始 Decode延迟会级联传播 async fn make_scheduling_decision(self) - SchedulingDecision { let prefill_pending !self.prefill_queue.read().await.is_empty(); let decode_pending !self.decode_queue.read().await.is_empty(); if prefill_pending { // Prefill 优先级高于 Decode let mut queue self.prefill_queue.write().await; let batch_size queue.len().min(self.config.max_prefill_batch); let batch: Vec_ queue.drain(..batch_size).collect(); SchedulingDecision::RunPrefill(batch) } else if decode_pending { // 无 Prefill 时执行 Decode SchedulingDecision::RunDecode } else { SchedulingDecision::Idle } } /// 执行 Prefill 批次 /// /// Prefill 的执行策略 /// 1. 将同一批次的所有请求的 input tokens 拼接 /// 2. 一次 kernel launch 处理所有请求利用 GPU 的 batch 能力 /// 3. Prefill 完成后写入 KV Cache 并将请求移入 Decode 队列 async fn execute_prefill_batch(self, batch: VecInferenceRequest) { // 执行 Prefill调用推理引擎的实际计算函数 // 此处省略实际的 GPU kernel 调用 // Prefill 完成后将请求加入 Decode 队列 for mut req in batch { req.state RequestState::PendingDecode; self.decode_queue.write().await.push_back(req); } } /// 执行单步 Decode /// /// Decode 的执行策略Continuous Batching /// 1. 从 Decode 队列取尽可能多的请求受 decode_slots 限制 /// 2. 批量执行一步 Decode每个请求生成 1 个 token /// 3. 完成生成的请求移出未完成的回到队列 async fn execute_decode_step(self) { // 获取可用的 Decode 槽位 let available self.decode_slots.available_permits(); if available 0 { return; // 无可用槽位 } let mut queue self.decode_queue.write().await; let batch_size queue.len().min(available); if batch_size 0 { return; } let batch: Vec_ queue.drain(..batch_size).collect(); drop(queue); // 获取槽位许可 let permits: Vec_ (0..batch_size) .map(|_| self.decode_slots.clone().try_acquire_owned().unwrap()) .collect(); // 执行 Decode step // 完毕后归还槽位permits 在离开作用域时自动释放 // 处理结果 let mut completed Vec::new(); let mut continuing Vec::new(); for req in batch { if req.generated_count req.max_new_tokens { completed.push(req); } else { continuing.push(req); } } // 完成的请求移出未完成的重新入队 let mut queue self.decode_queue.write().await; queue.extend(continuing); // 释放槽位permits drop 时自动归还 Semaphore // 不需要显式操作——这就是 RAII 的价值 drop(permits); } } enum SchedulingDecision { RunPrefill(VecInferenceRequest), RunDecode, Idle, }流水线的延迟收益实测数据LLaMA-2-7B, A100, 32 并发模式TTFT (P50)TPOT (P50)GPU 利用率串行无流水线120ms25ms55%Prefill-Decode 分离85ms22ms78%TTFT 降低 29% 的主要原因是Prefill 不再需要等待所有 Decode 完成。在串行模式下当前请求的 Prefill 必须等前一个请求的所有 Decode 完毕。分离后Prefill 和 Decode 可以在不同时间片执行。更深层的工程挑战在于KV Cache 的一致性保证。当 Prefill 和 Decode 在不同 CUDA Stream 上执行时Prefill 写入的 KV Cache 必须对后续 Decode 可见。最简单的方案是在 Prefill 流和 Decode 流之间插入cudaStreamWaitEvent这会引入 ~2-5μs 的同步开销。更激进的做法是利用 CUDA 的 implicit stream ordering——当 Prefill 和 Decode 提交到同一个CUstream时CUDA 运行时自动保证顺序但牺牲了流的并行度。折中方案是将 KV Cache 按层分段Prefill 每完成一层就释放一个事件Decode 流在消费该层 KV Cache 前等待对应事件而非等待整个 Prefill 完成。这一层粒度的流水线化在 32 层的大模型上可额外降低 10%~15% 的 Decode 等待时间代价是需要更精细的 CUDA event 管理。在 Rust 侧实现时这些 CUDA 原语的封装需要特别注意cust库的Stream::wait_event是阻塞的在 Tokio 运行时中必须跑在专用线程上否则会阻塞整个 reactor 的事件循环。四、流水线调度的边界与资源限制KV Cache 的碎片化分离调度导致不同请求的 KV Cache 分配在时间上是交错的。随着请求完成和释放KV Cache 空间变成碎片。需要一个 KV Cache 管理器来分配和回收连续的显存空间——类似于操作系统的内存管理。Decode 槽位的饥饿如果 Prefill 请求持续涌入Decode 请求可能长时间得不到执行。需要引入最大连续 Prefill 次数限制强制在多个 Prefill 批次后执行一次 Decode。不适用场景纯离线批量推理无在线用户请求之间无时间交错需求极短 prompt 10 tokensPrefill 计算量太小分离调度的 overhead 超过收益单个大请求独占 GPU 的场景五、总结Prefill 和 Decode 阶段的资源需求特征互补计算 vs 访存分离调度可提升 GPU 利用率至 78%Prefill 优先于 Decode 的调度策略基于用户感知延迟模型——TTFT 比 TPOT 对体验影响更大Semaphore 控制 Decode 并发量确保显存KV Cache 占用不会超出硬件限制KV Cache 的碎片化和 Decode 饥饿是分离调度的两个主要工程挑战需要专门的管理机制分离调度最适合在线推理服务中的多用户并发场景离线批处理和极短 prompt 场景收益有限

相关新闻

2026/8/28 14:40:23

终极提速!Photoshop图层批量导出神器,工作效率提升300%

终极提速!Photoshop图层批量导出神器,工作效率提升300% 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项…

2026/8/28 10:19:23

3PEAK思瑞浦 LM393A-SR SOP8 比较器

特性宽单电源电压范围或双电源:2.5V 至 36V 或 1.25V 至 18V极低的电源电流(每通道 150μA),与电源电压无关(5V 时每个比较器 0.75mW)低输入偏置电流:典型值 4nA低失调电压:最大 3.0…

2026/8/28 14:38:34

1.4MB RAM的Cortex-M7 MCU:内存规划、低功耗设计与排障经验

做嵌入式这些年,最常让我头疼的事情不是功能实现不了,而是内存不够用。为了省几百字节的 RAM,我干过各种抠门的事:全局变量能省则省,缓冲区反复复用,DMA 缓冲区挪来挪去,连结构体成员都要重新排…

2026/8/28 14:38:34

蓝桥杯国赛单片机系统设计:时间片轮询架构与多外设协同实战

1. 赛题回顾与核心挑战解析 第十一届蓝桥杯单片机设计与开发大学组国赛,对于所有参赛选手而言,都是一次对综合能力、临场应变和细节把控的极限考验。这场比赛没有提供具体的项目正文描述,这恰恰是国赛的典型风格——它考验的是选手对单片机平…

2026/8/28 14:38:34

Unet3+多类别皮肤镜图像分割实战指南

简介:语义分割是医学影像分析的基础技术,其核心在于实现像素级病灶定位与细粒度分类。Unet3通过全尺度特征融合与嵌套跳跃连接,突破传统U-Net在多尺度、小目标及边界模糊场景下的性能瓶颈;结合自适应多尺度训练与三重耦合损失&…

2026/8/28 14:38:34

小型4G/5G天线设计实战:从HFSS仿真到实物调试

前阵子做一款紧凑型4G/5G CPE产品,结构工程师给到天线区域的就一块不到30mm10mm的净空,旁边还紧挨着Type-C口和一排LED。当时脑子里冒出来的第一个念头就是:这尺寸怎么塞下覆盖Band 1/3/5/8/28/40/41再加n77/n78的天线?可市场上这…

2026/8/28 14:38:34

二维矩形排样优化:从数学建模到MATLAB算法实现

1. 从“一刀切”到“精打细算”:工业零件切割优化的现实困境 如果你在工厂里待过,或者接触过金属加工、木材加工、玻璃切割这类行业,一定会对一个场景非常熟悉:一块巨大的原材料板材,比如钢板、木板或者亚克力板&#…

2026/8/28 14:33:33

ADC按键原理与STM32实现:用模拟量思维解决GPIO资源短缺

1. 项目概述:从“按键”到“模拟量”的思维跃迁 在嵌入式开发,尤其是像蓝桥杯这类强调综合应用能力的竞赛中,按键输入是最基础的人机交互方式。我们早已习惯了GPIO扫描、外部中断这些经典方案。但当你拿到一块资源有限的竞赛板,发…

2026/8/26 9:13:28

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/27 10:58:22

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/27 7:46:21

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/28 0:00:34

2026学术工具专业测评|Paperxie全维度性能实测报告[特殊字符]

2026年国内高校毕业论文审核体系全面升级,重复率查重AIGC人工智能检测双检机制正式常态化落地,多所高校明确执行“双项一票否决”制度,重复率超标或AI生成痕迹不达标,均直接取消答辩资格。随着抽检力度加大、学术规范要求升级&…

2026/8/28 0:00:34

凭什么稳居论文工具顶流[特殊字符]Paperxie综合实力深度全解析

2026年论文双检内卷严重,市面上AI论文工具层出不穷,但大多只是单一功能凑数、模板化严重、双检高风险、套路收费。 在一众同质化工具里,Paperxie能长期稳居行业顶流、成为应届生公认毕业神器,从来不是靠营销,而是靠实…

2026/8/28 0:00:34

2026论文工具深度测评|为什么Paperxie是目前最稳的学术工具✅

2026高校论文查重AIGC双检严查常态化。 市面上绝大多数AI论文工具依旧存在明显短板:模板感重、AI痕迹超标、改写毁逻辑、收费套路多、查重不准、格式适配差。 在全网工具普遍“偏科”的现状下,Paperxie凭借全维度均衡实力脱颖而出,成为适配…

2026/8/26 19:34:06

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/26 19:17:08

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…