Moondream推理引擎Photon:消除GPU空泡,解码吞吐量最高提升35%!

Moondream推理引擎Photon:消除GPU空泡,解码吞吐量最高提升35%!
Moondream消除GPU空泡的探索Moondream的推理引擎Photon实现了近乎实时的视觉语言模型VLM推理在NVIDIA B200上约33毫秒。如何让AI模型尽可能快地运行这是Moondream总部一直思索的问题。GPU负责处理模型推理中的数学运算但常因CPU未告知下一步而闲置这种现象被称为“GPU空泡”。GPU空泡的成因当AI模型生成文本时标记逐个生成具有自回归特性生成过程顺序进行。解码循环涉及CPU和GPU往返GPU承担大部分模型运行工作CPU也承担不少管理工作。由于一个标记的GPU工作量小而CPU管理工作是固定成本若GPU等待CPU管理工作完成就会产生空泡。Photon的解决方案流水线解码Photon使用“流水线解码”技术消除空泡核心是将CPU和GPU工作重叠在CPU处理上一个标记时开始GPU对下一个标记的处理。空泡问题的本质与解决阻塞式解码中每一步像接力棒传递GPU会闲置等待CPU工作。解决方法是对循环进行流水线处理前向传播连续运行CPU工作重叠进行。因为采样标记不必离开GPU下一次前向传播可直接读取管理工作可后台进行避免等待消除了空泡。要确保过程安全需避免步骤缓冲区冲突、确保受限解码采样顺序正确、请求完成后清理。机制1乒乓插槽GPU执行解码步骤需一组工作缓冲区两端保留固定主机缓冲区避免运行时GPU内存分配。这组缓冲区称为DecodeSlot。但该方法阻碍流水线处理为使两个步骤重叠设置两个插槽交替使用。启动操作时内核排入流同一流工作顺序执行不同流可重叠。前向传播操作共享计算流复制操作放单独复制流复制操作锚定事件不等待后续任务。插槽在结果读取后才可用提交操作完成后释放。机制2先前向传播后采样下一次前向传播可提前运行不依赖CPU对最后标记的操作。但下一个步骤的序列批次和允许采样标记依赖上一步提交结果。这源于受限解码Moondream空间技能返回结构化输出通过限制标记得分获得结果。依赖关系在于采样而非前向传播。每个调度器周期有启动、提交和最终确定三个阶段采样在提交后进行确保掩码正确GPU在提交和最终确定时运行前向传播提交操作从关键路径消失。纯文本无前向传播和采样限制受限序列前向传播可提前采样需等待提交一个循环可处理两种情况。机制3僵尸请求提前完成延迟释放启动步骤t1需确定批次当序列在t时刻完成但已包含在t1前向传播中无法取消GPU工作该序列成为“僵尸请求”。Photon通过序列的finalized和inflight_refs字段处理当步骤t提交检测到EOS序列标记为finalized并输出结果但不销毁步骤t1提交时跳过只有inflight_refs为0时释放资源。这种操作避免大量特殊情况。预填充也使用相同的流水线实际服务循环有预填充和解码两种工作Photon将预填充作为双插槽流水线中的另一个启动操作。流水线不关心上一次工作类型可在解码步骤提交时启动预填充反之亦然。相同提交顺序和inflight_refs管理确保两种工作正确性短输出请求时共享流水线使工作与CPU管理工作重叠。空泡的成本模型流水线处理提升效果可根据解码步骤各部分预测并与实际测量对比。解码步骤包括前向传播、采样和管理工作阻塞式循环中GPU在管理工作时闲置流水线处理将管理工作放在前向传播和采样下方缩短周期消除空泡。测量结果显示采用流水线处理GPU基本处于忙碌状态。消除空泡的提升取决于隐藏管理工作和提前运行代价加速比公式为“加速比 T_阻塞 / T_流水线 × (1 - z)”z为僵尸请求成本。数据显示GPU速度越快提升越大僵尸请求成本可分摊只有空泡可隐藏时才有收益。成功并非只靠一招Photon通过乒乓插槽、分开前向传播和采样、处理僵尸请求等技术使GPU无需等待CPU性能提升幅度从几个百分点到三分之一不等。但Photon的快速并非依赖单一技术而是服务栈各层面细节叠加的结果。后续会继续介绍这些细节同时留意即将推出的Photon 2.0。Moondream产品与相关信息Moondream是一款面向生产环境的视觉语言模型由M87 Labs打造。产品包括开放模型、Lens、Photon、Moondream云、支持等开发者可查看文档、演示区、GitHub、Hugging Face公司信息有关于我们、博客、招聘信息、媒体联系、联系我们法律信息包括隐私政策、使用条款、模型许可。