微信扫码
添加专属顾问
我要投稿
深入剖析大语言模型(LLM)推理框架,助你选择合适的工具。 核心内容: 1. 大语言模型(LLM)推理框架Ollama与vLLM的优劣对比 2. 从资源利用、部署维护、特定用例等多个维度进行分析 3. 基于实际测试结果,探讨不同场景下的最佳选择
这场对比并不是要找出来哪一个框架最好,而是要了解哪个框架在不同的场景中表现更出色。
我们将重点关注以下几个方面:
让我们深入对比实践,看看最终结果如何吧~?
为了确保公平对比,我们将为两个框架使用相同的硬件和模型:
接下来我们来分析一下两个框架是如何以不同方式管理系统资源的,重点关注它们的核心架构方法以及对资源利用的影响。
我举一个单个问题的例子,问题是 “给我讲一个 1000 字的故事”。对于一次请求,我得到的处理速度是 25.59 个token/秒。并且没有进行并行请求。
如果要进行并行请求,对于使用 Ubuntu 系统的用户,必须修改位于 /etc/systemd/system/ollama.service
的文件,并添加一行 Environment="OLLAMA_NUM_PARALLEL=4"
,这样就可以进行最多 4 个并行请求。
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/home/henry/.local/bin:/usr/local/cuda/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_DEBUG=1"
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OPENAI_BASE_URL=http://0.0.0.0:11434/api"
[Install]
WantedBy=multi-user.target
不过,我对 Ollama 有一点非常不满意,我认为它不是一个适合生产环境的好框架。Ollama 会预留所有需要的内存,即使实际上只会用到其中的一小部分。也就是说,仅仅 4 个并发请求,就不可能将整个模型加载到 GPU 上,一些层会被加载到 CPU 上,大家可以从下面的图片中看到,或者在终端中运行 ollama ps
命令也能发现。
更夸张的是,我能看到神经网络只有 15% 被加载到了 GPU 上,但 GPU 中几乎还有 2GB 的显存是空闲的!但为什么 Ollama 会这样呢?
知道了这些,那么 Ollama 能够支持的最大上下文长度是多少,才能将模型 100% 加载到 GPU 上呢?我尝试修改我的模型文件,设置 PARAMETER num_ctx 24576
,但我注意到同样的问题还是出现了:尽管 GPU 中几乎有 2GB 的空闲显存,CPU 还是被使用了 4%。
vLLM 采用了纯 GPU 优化方法。为了公平对比,我想为我的 GPU 找到最大的上下文长度。经过几次尝试,我的 RTX 4060 Ti 支持 24576 个token。所以我运行了这个修改后的 Docker 命令:
# Run the container with GPU support
docker run -it \
--runtime nvidia \
--gpus all \
--network="host" \
--ipc=host \
-v ./models:/vllm-workspace/models \
-v ./config:/vllm-workspace/config \
vllm/vllm-openai:latest \
--model models/Qwen2.5-14B-Instruct/Qwen2.5-14B-Instruct-Q4_K_M.gguf \
--tokenizer Qwen/Qwen2.5-14B-Instruct \
--host "0.0.0.0" \
--port 5000 \
--gpu-memory-utilization 1.0 \
--served-model-name "VLLMQwen2.5-14B" \
--max-num-batched-tokens 24576 \
--max-num-seqs 256 \
--max-model-len 8192 \
--generation-config config
并且我可以运行多达 20 个并行请求!!为了测试这个框架,我使用了以下代码:
import requests
import concurrent.futures
BASE_URL = "http://<your_vLLM_server_ip>:5000/v1"
API_TOKEN = "sk-1234"
MODEL = "VLLMQwen2.5-14B"
def create_request_body():
return {
"model": MODEL,
"messages": [
{"role": "user", "content": "Tell me a story of 1000 words."}
]
}
def make_request(request_body):
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(f"{BASE_URL}/chat/completions", json=request_body, headers=headers, verify=False)
return response.json()
def parallel_requests(num_requests):
request_body = create_request_body()
with concurrent.futures.ThreadPoolExecutor(max_workers=num_requests) as executor:
futures = [executor.submit(make_request, request_body) for _ in range(num_requests)]
results = [future.result() for future in concurrent.futures.as_completed(futures)]
return results
if __name__ == "__main__":
num_requests = 50 # Example: Set the number of parallel requests
responses = parallel_requests(num_requests)
for i, response in enumerate(responses):
print(f"Response {i+1}: {response}")
得到了超过 100 个token/秒的处理速度!我简直不敢相信用一块游戏 GPU 就能做到这一点。GPU 的利用率达到了 100%,这正是我想要的:充分利用 GPU 的全部性能(毕竟我可是为 100% 的 GPU 性能付了钱的?)。
而且这还不是最棒的部分,我们设置了 --max-num-seq 256
,所以理论上我们可以发送 256 个并行请求!
所以,在我看来,赢家是…… 两个都不是!
如果你经常需要在本地环境甚至远程服务器上快速对大语言模型进行实验,而不想有太多的设置麻烦,那么 Ollama 无疑是你的首选解决方案。它的简单性和易用性使其非常适合快速原型设计、测试想法,或者对于刚开始使用大语言模型并且希望有一个平缓学习曲线的开发者来说,也是非常好的选择。
然而,当我们把重点转移到生产环境中,在这种环境下性能、可扩展性和资源优化至关重要,vLLM 显然更胜一筹。它对并行请求的出色处理能力、高效的 GPU 利用率以及强大的文档支持,使其成为用于大规模严肃部署的有力竞争者。该框架能够从可用的硬件资源中榨取最大性能,这一点尤其令人印象深刻,对于那些希望优化其大语言模型基础设施的公司来说,可能是一个改变游戏规则的因素。
也就是说,在 Ollama 和 vLLM 之间做出选择时,不能孤立地进行。这必须取决于你的特定用例,需要考虑以下因素:
从本质上讲,虽然 vLLM 可能在生产环境中提供卓越的性能和可扩展性,但 Ollama 的简单性在某些情况下可能是无价的,特别是在开发的早期阶段或对于较小规模的项目。
最终,最好的选择将是最符合你项目独特需求和限制的那个。值得考虑的是,在某些情况下,你甚至可能同时使用两者而受益:使用 Ollama 进行快速原型设计和初始开发,当你准备好扩展并为生产进行优化时,再使用 vLLM。这种混合方法可以让你兼得两者的优势,使你能够在项目生命周期的不同阶段利用每个框架的优势。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-03-08
QwQ总结能力测评,32b小模型真能超过deepseek吗
2025-03-08
为什么vLLM做不到?解密Ollama越级部署黑科技:以DeepSeek-R1-8B为例
2025-03-07
为什么Manus底层模型没用DeepSeek?——Manus六问六答
2025-03-07
Cherry Studio 发布 v1.0.0 版本支持联网搜索
2025-03-07
Claude 3.7 Sonnet 使用结论
2025-03-07
Manus,为何是他们做出来了?
2025-03-07
Cursor 新版本要来了!同一个窗口使用Agent+Chat!上下文增强、UI升级、界面更清爽。
2025-03-07
Cursor + MCP:效率狂飙!一键克隆网站、自动调试错误,社区:每个人都在谈论MCP!
2025-02-04
2025-02-04
2024-09-18
2024-07-11
2024-07-09
2024-07-11
2024-07-26
2025-02-05
2025-01-27
2025-02-01