发布时间:2026/8/25 23:14:27
[代码学习] vLLM 如何把大模型权重临时搬到 CPU:PR #51710 源码阅读 最近读了 vLLM 的 PR #51710。这个 PR 解决的问题很直接MoE 模型太大专家权重放不进显存怎么办它给出的答案是先把一部分权重放在 CPU 内存里GPU 快用到它们时再提前拷贝回来。只要拷贝和计算重叠得足够好就能用一些 PCIe 流量换取几十 GB 显存。先弄清楚它在搬什么MoE 模型的每一层里通常有很多专家。虽然一次推理只会选中部分专家但所有专家的权重往往都要常驻显存。DeepSeek-V4 这类模型的专家权重非常大多卡切分以后每张卡仍然可能放不下。这里搬的是模型权重不是 KV Cache也不是请求数据。权重平时放在 pinned CPU memory 中某层快要执行时vLLM 把对应权重异步复制到 GPU 的临时缓冲区。CPU第2、5、8、11 层的专家权重 GPU固定大小的临时权重缓冲区 GPU 计算第2层时后台复制第5层 GPU 计算第5层时后台复制第8层哪些层会被卸载核心判断其实很朴素ifmodule_index%group_sizegroup_size-num_in_group:# 选择这一层进行 offload假设group_size3、num_in_group1代码会把每三个模块分成一组然后选择每组最后一个模块模块012|345|678卸载 √|√|√接着代码还会根据参数名做一次筛选。比如只卸载experts.w13_weight和experts.w2_weight而保留attention和其他小参数。匹配时在名字两边补上 .是为了让w2_weight不会误匹配到w2_weight_scale。GPU 缓冲区为什么要循环使用如果每次预取都重新申请显存开销会很大也很难放进 CUDA Graph。PR 使用StaticBufferPool提前申请固定缓冲区常驻 GPU 的权重不走这套逻辑slot_idxlayer_idx%prefetch_stepbufferbuffers[slot_idx]例如prefetch_step3GPU 只准备三组槽位offload unit0-slot0offload unit1-slot1offload unit2-slot2offload unit3-slot0前面的层用完后后面的层继续覆盖同一块显存。参数对象会提前指向这些静态 buffer因此 forward 时不需要反复替换参数也不需要动态申请 tensor。需要注意buffer 不能只按 tensor shape 复用。量化后的权重可能有不同的 stride 和 dtype所以实际 key 中包含参数名、shape、stride 和 dtype。预取是怎么插进 forward 的PR 给选中的模块包了一层 forward hook。简化以后大致是这样defforward(*args,**kwargs):wait_prefetch(current_layer)outputoriginal_forward(*args,**kwargs)start_prefetch(current_layerprefetch_step)returnoutput执行当前层之前计算 stream 等待该层权重复制完成。当前层算完后马上在单独的 copy stream 上预取后面的权重。理想情况下H2D copy 会被中间几层的计算时间盖住。这里的prefetch_step不是越大越好。太小权重可能来不及搬完GPU 只能停下来等太大又需要更多 GPU buffer节省的显存会变少。为什么还要处理 CUDA Graphcopy stream 和 compute stream 是两条不同的 CUDA stream。CUDA Graph capture 结束时如果 copy stream 启动了任务却没有重新汇合到当前 stream就会报cudaErrorStreamCaptureUnjoined所以 PR 增加了join_after_forward()。它会检查哪些预取任务是在 capture 期间启动、但还没有被等待然后通过 CUDA event 把这些任务重新接回当前 stream。这部分看起来只是同步细节但很关键。作者的 baseline 可以完成权重加载却会在 CUDA Graph capture 阶段失败补上这个生命周期以后服务才能真正启动。H2D copy 为什么会拖慢 TP在 PCIe 机器上CPU 到 GPU 的权重复制和 GPU 之间的 TP collective 可能争抢同一批链路。一笔很大的权重复制占着链路时all-reduce 或 all-gather 会变慢而 TP 中所有 rank 都在等它。PR 因此加入--offload-comm-aware把大 copy 切成小块collective 开始时暂缓复制collective 完成后再继续。这个逻辑只在 TP 1 时启用。作者在 TP8 的 DeepSeek-V4-Pro 上测得开启这项控制后 TTFT 降低约 9.7%吞吐提高约 10.9%。这说明预取不只是“尽量早搬”还要知道什么时候应该让路。Schedule Planner 是干什么的三个参数可以组合出很多方案。以前只能换一组参数、启动一次模型然后看是否 OOM。这个 PR 允许第一次启动时输出 manifest记录每个位置的权重大小、buffer layout 和实际卸载结果VLLM_PREFETCH_LOG_SCHEDULE1vllm serve...随后可以离线运行 plannerpython-m vllm.benchmarks.weight_offload.plannerplanner 会计算每个方案剩余多少常驻权重、需要多大的运行时 buffer以及每次 forward 要重新传输多少字节。它只计算内存不预测延迟因为真实延迟还取决于 PCIe 带宽、每层计算时间和 TP 通信竞争。实际效果和限制作者在 DeepSeek-V4-Pro、TP8、RTX PRO 6000 上每个 rank 卸载约 31.38 GiB 权重使用约 4.71 GiB GPU 临时 buffer最终净释放约 26.67 GiB 显存。每次 forward 需要重新搬运约 33.69 GB但超过 99.8% 的复制时间被计算覆盖。它也不是免费的CPU 必须有足够大的 pinned memoryPCIe 必须有足够带宽还要给 fused-MoE workspace 留出显存。

相关新闻

2026/8/25 23:14:27

工程项目管理破局:用数字化闭环解决管控乱象

一、工程项目普遍存在的管理痛点:全周期信息断层工程行业从业者普遍有一个共性体验:项目中标初期,整体规划、流程、节点都清晰明确,但随着施工推进,各项工作会逐渐陷入信息不透明、状态不清晰的被动局面。材料进场状态…

2026/8/25 23:14:27

国产AI数据大屏生成工具对比分析与数字孪生大屏选型指南

我们公司最近在筹备一个智慧园区的数字孪生展厅,需要一块能展示园区实时运营数据的大屏。本来打算找外包公司做,但报价动辄几十万,而且后续数据更新还得依赖他们,想想就不划算。于是我开始研究市面上国产的AI数据大屏生成工具&…

2026/8/25 23:09:27

康养中心节能提质改造!智能直流照明打造舒适康养光环境

一、系统概述康养中心作为服务老年群体的特殊公共场景,对光照舒适度、运行安全性、环境稳定性有着极高要求。传统照明系统光线频闪严重、电压不稳定、无法适配老人作息规律,不仅能耗浪费严重,还容易引发老人视觉疲劳、情绪焦躁等问题。同时康…

2026/8/26 1:49:37

技术需求挖掘与全流程追踪需要哪些关键材料?

观点作者:科易网-国家科技成果转化(厦门)示范基地 在全球新一轮科技革命和产业变革深入推进的背景下,科技创新已成为推动经济社会高质量发展的核心引擎。然而,科技成果转化过程中的瓶颈问题依然突出,尤其在…

2026/8/26 1:49:37

产业园区如何提升科技创新服务的系统性与个性化?

观点作者:科易网-国家科技成果转化(厦门)示范基地在新一轮科技革命与产业变革的浪潮中,科技创新已成为驱动区域经济高质量发展的重要引擎,而科技成果转化则是将这一引擎转化为现实生产力的关键环节。作为科技创新活动的…

2026/8/26 1:49:37

Android 11文件访问权限EACCES错误解析与分区存储适配指南

1. 问题根源:为什么Android 11的权限模型变了?如果你是一个从Android 6.0(运行时权限)时代一路走过来的开发者,可能会觉得权限管理已经够麻烦了。但到了Android 11(API 30),当你尝试…

2026/8/26 1:49:36

用 Run BASIC 实现轻量级 Web 数据图表:从数据到 SVG 交互可视化

前阵子一个老同事找我,说想让手头的小库存数据在浏览器里“活”起来,能点能看,团队内部用就行。他给的条件很实际:最好是单文件、能快速改、不要搭一堆前端工程。我想了一圈,最后给他说了 Run BASIC。聊完我突然意识到…

2026/8/26 1:44:36

JTAG调试接口深度解析:协议、状态机与实战排查

1. JTAG到底是一门什么“语言”先聊个场景。你手上有一块新板子,MCU贴上去了,电源、时钟、复位都检查过,唯独就是连不上调试器。报错信息翻来覆去就一句话:Target not found。这种时候,很多人的第一反应是“芯片坏了”…

2026/8/25 1:04:19

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

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

2026/8/25 11:48:27

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

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

2026/8/25 16:56:43

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

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

2026/8/26 0:04:32

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 1:19:35

JSON总结

JSON概念 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,主要用于跟服务器进行交换数据。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C、C#、Java、JavaScr…

2026/8/26 1:19:35

保存连接sse 是什么原理,为什么不会一直请求

“保持连接”用的是 SSE(Server-Sent Events),本质是一个没有马上结束的 HTTP 请求。 过程是: 拷贝机发送一次请求: GET /api/code-sync/events服务器返回: Content-Type: text/event-stream但不关闭响应&…

2026/8/24 13:42:17

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

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

2026/8/24 18:13:48

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

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

2026/8/25 1:08:14

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

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