ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">最近在折腾双4090GPU,近200g内存服务器vllm部署70b的实验。使用ragflow知识库。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">按照我之前使用ollama的理解,我觉的部署70b应该没啥问题,然后一个个的坑。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">先说下ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;text-indent: -1em;display: block;margin: 0.5em 8px;color: rgb(63, 63, 63);">• 部署30b,还是很流畅的,但是推理能力确实比较弱ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;text-indent: -1em;display: block;margin: 0.5em 8px;color: rgb(63, 63, 63);">• 部署70b,通过不断地优化参数,最大tokens,4096 tokens没问题(还部署了一个bge-m3)ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;text-indent: -1em;display: block;margin: 0.5em 8px;color: rgb(63, 63, 63);">• 但是在ragflow中使用的时候,由于超出最大tokens,经常报oom,因此给ragflow的官方提交了一个issue。官方很快就修复了,这块还是很赞的。 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">越折腾疑问越多,然后我就了解下了一些知识点,有了这篇水文。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">我们以RTX3060 12G显存为例拆解下。ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(250, 81, 81);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;">DeepSeek-R1-8B的显存解剖ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;padding-left: 12px;color: rgb(63, 63, 63);">原始显存需求- •权重(直接成本):8B参数 × 2字节(FP16)= 16 GB
- • 动态增长:
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权重动态加载至内存 - • 但显存需求直降40%(从10.5GB→6.2GB)
自适应序列切片- •长文本处理:当输入超过512 tokens时,自动拆分为多段并行处理
- •显存优化效果:2048 tokens输入时,峰值显存降低32%
vLLM为何“宁死不做越级部署”?设计目标的根本冲突- •vLLM的核心使命:服务化场景下的高吞吐、低延迟(如百人同时访问的API)
- • CPU-GPU数据传输会严重拖慢并发请求的处理速度
- • 显存碎片化可能破坏连续内存分配机制(vLLM依赖的PagedAttention技术)
量化支持的局限性- •仅支持静态INT8:无法像Ollama混合使用4/6-bit,导致显存压缩率不足
- •校准数据固化:vLLM要求离线量化,而Ollama支持运行时动态调整
硬件兼容性差异- • 为兼容消费级显卡(如RTX 3060),允许牺牲速度换取显存
- • 甚至支持通过系统内存模拟显存(性能下降但能运行)
- • 仅优化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等专业显卡,追求极致吞吐量
终极避坑建议- •警惕“虚假越级”:部分工具声称支持低显存运行,实则大幅裁剪模型参数(如DeepSeek-8B被阉割成6B)
- •验证量化完整性:使用
llm-int8工具检查Attention层是否真的保留高精度 - •压测保平安:对Ollama需测试长时生成的显存泄漏问题(部分版本存在累积占用bug)
结语:没有神话,只有取舍Ollama的“越级”本质是技术民主化——让更多人用上大模型,哪怕牺牲速度;vLLM的“高冷”则是商业现实的抉择。未来二者的融合或许会出现(如vLLM引入动态卸载),但在此之前,开发者仍需认清需求,选择最适合的战场。 相关术语内存(RAM)与显存(VRAM)- •系统内存(RAM):由CPU直接管理的主内存,通常称为“内存”,物理上通过主板插槽连接,供所有系统进程共享。
- •显存(VRAM):GPU专用内存,通过PCIe总线与CPU通信,专为高吞吐并行计算设计。
- • CPU不直接拥有内存,而是通过内存控制器访问RAM;
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。
|