最近在折腾双4090GPU,近200g内存服务器vllm部署70b的实验。使用ragflow知识库。
按照我之前使用ollama的理解,我觉的部署70b应该没啥问题,然后一个个的坑。
先说下
-
• 部署30b,还是很流畅的,但是推理能力确实比较弱 -
• 部署70b,通过不断地优化参数,最大tokens,4096 tokens没问题(还部署了一个bge-m3) -
• 但是在ragflow中使用的时候,由于超出最大tokens,经常报oom,因此给ragflow的官方提交了一个issue。官方很快就修复了,这块还是很赞的。
越折腾疑问越多,然后我就了解下了一些知识点,有了这篇水文。
我们以RTX3060 12G显存为例拆解下。
DeepSeek-R1-8B的显存解剖
原始显存需求
-
• 权重(直接成本):8B参数 × 2字节(FP16)= 16 GB -
• KV Cache(上下文缓存) -
• 动态增长: 2 × 层数 × 头数 × 头维度 × 序列长度 × 批次大小 × 精度 -
• (以2048 tokens为例): 2(K/V) × 32层 × 32头 × 128头维度 × 2048序列长度 × 2字节 = 1.07 GB -
• 总需求:16 + 1.07 ≈ 17.07 GB(远超RTX 3060的12GB上限)
Ollama的“瘦身魔法
-
• 4-bit GPTQ量化:权重显存降至8B × 0.5字节 = 4 GB -
• 动态卸载策略:将部分权重临时转存至CPU内存,显存占用降至6.2 GB(实测数据) -
• 代价:CPU-GPU数据传输使Token生成速度从45 tokens/s降至28 tokens/s
最疯狂的是,我一个前同事用ollama,在macbook air 8g内存上部署了70b的模型。
vLLM的“显存洁癖"
-
• 设计原则:vllm追求极致吞吐量,拒绝任何可能影响性能的动态卸载 -
• 显存硬门槛:要求权重+KV Cache完全驻留GPU,导致DeepSeek-R1-8B在12GB显卡上无法启动
Ollama越级部署的三大核心技术
混合精度量化(灵活度碾压vLLM)
-
• 层级敏感量化:对底层 MLP层使用4-bit,顶层Attention保留6-bit(减少精度损失) -
• 实测对比(DeepSeek-R1-8B生成任务):
|
|
|
|
|
|
|
|
|
|
|
|
内存-CPU分级存储(vLLM的禁区)
-
• 策略:将FP16的 Attention权重保留在显存,MLP权重动态加载至内存 -
• 技术代价: -
• 每次前向传播增加5-8ms的PCIe传输延迟 -
• 但显存需求直降40%(从10.5GB→6.2GB)
自适应序列切片
-
• 长文本处理:当输入超过512 tokens时,自动拆分为多段并行处理 -
• 显存优化效果:2048 tokens输入时,峰值显存降低32%
vLLM为何“宁死不做越级部署”?
设计目标的根本冲突
-
• vLLM的核心使命:服务化场景下的高吞吐、低延迟(如百人同时访问的API) -
• 拒绝动态卸载的原因: -
• CPU-GPU数据传输会严重拖慢并发请求的处理速度 -
• 显存碎片化可能破坏连续内存分配机制(vLLM依赖的PagedAttention技术)
量化支持的局限性
-
• 仅支持静态INT8:无法像Ollama混合使用4/6-bit,导致显存压缩率不足 -
• 校准数据固化:vLLM要求离线量化,而Ollama支持运行时动态调整
硬件兼容性差异
-
• Ollama的“妥协艺术”: -
• 为兼容消费级显卡(如RTX 3060),允许牺牲速度换取显存 -
• 甚至支持通过系统内存模拟显存(性能下降但能运行) -
• vLLM的“精英主义”: -
• 仅优化Tesla系列显卡(如A100/H100),依赖高带宽显存 -
• 在消费卡上性能反而不如Ollama(RTX 4090实测低15%吞吐量)
实战测试——RTX 3060上的生死对决
测试环境
-
• 显卡:NVIDIA RTX 3060 12GB -
• 测试任务:DeepSeek-R1-8B生成512 tokens回答
结果对比
| 框架 | 显存占用 | 生成速度 | 可用性 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
关键结论
-
• Ollama的生存逻辑:通过量化+动态卸载,将显存需求压缩至硬件的60%以下 -
• vLLM的哲学缺陷:为追求工业级性能,放弃对资源受限场景的适配
开发者选型指南
选Ollama的场景
-
• 个人开发者/小团队:硬件有限(≤24GB显存) -
• 需要快速验证模型效果,对延迟容忍度高 -
• 长文本生成需求(利用切片策略降低峰值显存)
选vLLM的场景
-
• 企业级API服务:需要支持高并发(≥100 QPS) -
• 拥有A100/H800等专业显卡,追求极致吞吐量 -
• 需兼容现有Kubernetes集群调度系统
终极避坑建议
-
• 警惕“虚假越级”:部分工具声称支持低显存运行,实则大幅裁剪模型参数(如DeepSeek-8B被阉割成6B) -
• 验证量化完整性:使用 llm-int8工具检查Attention层是否真的保留高精度 -
• 压测保平安:对Ollama需测试长时生成的显存泄漏问题(部分版本存在累积占用bug)
结语:没有神话,只有取舍
Ollama的“越级”本质是技术民主化——让更多人用上大模型,哪怕牺牲速度;vLLM的“高冷”则是商业现实的抉择。未来二者的融合或许会出现(如vLLM引入动态卸载),但在此之前,开发者仍需认清需求,选择最适合的战场。
相关术语
内存(RAM)与显存(VRAM)
-
• 系统内存(RAM):由CPU直接管理的主内存,通常称为“内存”,物理上通过主板插槽连接,供所有系统进程共享。 -
• 显存(VRAM):GPU专用内存,通过PCIe总线与CPU通信,专为高吞吐并行计算设计。 -
• 关键区别: -
• CPU不直接拥有内存,而是通过内存控制器访问RAM; -
• GPU显存是独立硬件,与CPU内存物理分离。
Ollama显存优化的本质:CPU-GPU异构内存交换
当Ollama声称“将部分权重转存至CPU内存”时,其技术本质是:
将GPU显存中暂时不用的权重数据,通过PCIe总线转移到系统内存(RAM),并在需要时动态加载回显存。
这一过程涉及以下核心技术:
(1)内存分级策略(Memory Tiering)
-
• 热数据:当前计算所需的权重(如正在执行的Attention层)保留在显存。 -
• 冷数据:后续步骤才需要的权重(如下一层的MLP参数)暂存至系统内存。 -
• 交换粒度:通常以层(Layer)为单位,例如将DeepSeek-R1-8B的32层分成多个组按需加载。
(2)预取与缓存(Prefetching & Caching)
-
• 预加载机制:在计算当前层时,异步将下一层权重从系统内存提前传输至显存。 -
• 缓存策略:对频繁使用的权重(如Embedding层)在显存中永久保留副本。
(3)硬件加速传输
-
• Pinned Memory:使用 torch.cuda.Stream配合锁页内存(Pinned Memory),减少CPU-GPU数据传输延迟。 -
• Direct Memory Access(DMA):绕过CPU直接由GPU控制器管理传输,实测带宽可达PCIe 4.0 x16的32GB/s。


