Ollama的崛起与困境
当我在NAS上测试本地部署方案时,Ollama最初的表现堪称惊艳。它通过Docker一键部署的便捷性、对超大上下文窗口的支持,完美匹配了GraphRAG的需求——尤其是搭配谷歌开源的Gemma3模型时,128K tokens的上下文处理能力简直是为长文档解析量身定做。那时我以为找到了终极解决方案,直到真正将其推向生产级负载。
第一个警报来自上下文窗口的诡异表现。配置明明是128K,实际运行时却经常出现35,567这样随机的数值,导致模型在处理复杂任务时频繁卡顿。日志里27分钟的无响应记录越来越多,随着请求量增长,Ollama开始频繁锁死、丢失上下文,每天手动重启成了例行公事。我尝试过自定义适配器来强制管理上下文窗口,效果却如同用创可贴堵堤坝——能暂时缓解却无法根治。最荒谬的是,它的超时设置竟长达48小时,一旦锁死就意味着两天的服务中断。显然,Ollama的设计更适合轻量实验,而非生产环境的持续负载。
转向vLLM:生产级需求下的必然选择
当可靠性能从"加分项"变成"必需品"时,vLLM进入了我的视野。这个以"高效批处理""内存优化"和"规模化稳定性"为卖点的框架,恰好击中了Ollama的软肋。虽然已有无数文章对比过两者的差异,但实际体验后才明白核心区别:vLLM牺牲了Ollama的"即开即用",换来了生产环境必需的稳定性。它不支持多模型并行、放弃了GGUF格式兼容,却通过单容器单模型的专注设计,实现了吞吐量的质的飞跃。
vLLM的部署实战:从Docker配置到踩坑实录
迁移到vLLM的第一步是用Docker Compose复刻现有环境。选择官方的vllm/vllm-openai镜像后,我敲定了unsloth/gemma-3-4b-it模型——40亿参数足以满足需求,且在双RTX A2000(12GB×2)上表现均衡。最终的配置文件看似简单,却凝结了数小时的调试心血:
services: vllm: image: vllm/vllm-openai:latest container_name: vllm &n