Ollama和vLLM我们到底应该用哪个?

今天和大家深入讲讲大语言模型(LLM)推理框架的不同优缺点对比,方便大家根据自己的场景选择合适的推理框架。

VLLM大战Ollama

VLLM大战Ollama

这场对比并不是要找出来哪一个框架最好,而是要了解哪个框架在不同的场景中表现更出色。

我们将重点关注以下几个方面:

  1. 资源利用和效率

  2. 部署和维护的便捷性

  3. 特定的用例和建议

  4. 安全性和生产就绪性

  5. 文档

让我们深入对比实践,看看最终结果如何吧~🚀

基准设置 ⚡

为了确保公平对比,我们将为两个框架使用相同的硬件和模型:

  1. 硬件配置
  • GPU:NVIDIA RTX 4060 16GB Ti

  • 内存:64GB 内存

  • CPU:AMD Ryzen 7

  • 存储:NVMe SSD

  1. 模型
  • Qwen2.5–14B-Instruct(int4量化)

  • 上下文长度:8192 个token

  • 批大小:1(单用户场景)

对比 📊

接下来我们来分析一下两个框架是如何以不同方式管理系统资源的,重点关注它们的核心架构方法以及对资源利用的影响。

Ollama:

我举一个单个问题的例子,问题是 “给我讲一个 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上!

15%的模型加载在GPU上!

更夸张的是,我能看到神经网络只有 15% 被加载到了 GPU 上,但 GPU 中几乎还有 2GB 的显存是空闲的!但为什么 Ollama 会这样呢?

知道了这些,那么 Ollama 能够支持的最大上下文长度是多少,才能将模型 100% 加载到 GPU 上呢?我尝试修改我的模型文件,设置 PARAMETER num_ctx 24576,但我注意到同样的问题还是出现了:尽管 GPU 中几乎有 2GB 的空闲显存,CPU 还是被使用了 4%。

vLLM:

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 性能付了钱的🤣)。

并行推理20个请求!!!

并行推理20个请求!!!

而且这还不是最棒的部分,我们设置了 --max-num-seq 256,所以理论上我们可以发送 256 个并行请求!

最终的决定… ⚖️

  1. 性能概述:显然,赢家是 vLLM。对于单个请求,vLLM 有 11% 的性能提升(Ollama 是 26 个token/秒,而 vLLM 是 29 个token/秒)。

  2. 资源管理:在这方面,vLLM 绝对是王者。当我看到 Ollama 无法处理很多并行请求,甚至因为资源管理效率低下而无法处理 4 个并行请求时,我非常失望。

  3. 易用性和开发难度:没有什么比 Ollama 更简单易用的了。即使你不是专家,也可以使用一行代码就轻松地与大语言模型进行对话。而 vLLM 则需要一些知识,比如 Docker 以及更多的参数设置。

  4. 生产就绪性:vLLM 就是为生产环境而设计的,很多公司都在他们的Node中使用这个框架。

  5. 安全性:vLLM 为了安全目的支持APIKEY授权,而 Ollama 则不支持。所以,如果没有很好地保护你的节点机器,任何人都可以访问它。

  6. 文档:两个框架在文档方面采取了不同的方法:Ollama 的文档简单且适合初学者,但缺乏技术深度,特别是在性能和并行处理方面。他们的 GitHub 讨论区经常有一些重要问题没有得到解答。相比之下,vLLM 提供了全面的技术文档,包括详细的 API 参考和指南。他们的 GitHub 维护得很好,开发者响应迅速,有助于解决问题和理解框架,而且他们甚至还有一个专门的网站 https://docs.vllm.ai/en/latest/ 来介绍这些内容。

所以,在我看来,赢家是…… 两个都不是!

如果你经常需要在本地环境甚至远程服务器上快速对大语言模型进行实验,而不想有太多的设置麻烦,那么 Ollama 无疑是你的首选解决方案。它的简单性和易用性使其非常适合快速原型设计、测试想法,或者对于刚开始使用大语言模型并且希望有一个平缓学习曲线的开发者来说,也是非常好的选择。

然而,当我们把重点转移到生产环境中,在这种环境下性能、可扩展性和资源优化至关重要,vLLM 显然更胜一筹。它对并行请求的出色处理能力、高效的 GPU 利用率以及强大的文档支持,使其成为用于大规模严肃部署的有力竞争者。该框架能够从可用的硬件资源中榨取最大性能,这一点尤其令人印象深刻,对于那些希望优化其大语言模型基础设施的公司来说,可能是一个改变游戏规则的因素。

也就是说,在 Ollama 和 vLLM 之间做出选择时,不能孤立地进行。这必须取决于你的特定用例,需要考虑以下因素:

  1. 项目的规模

  2. 你团队的技术专长

  3. 应用程序的特定性能要求

  4. 你的开发时间线和资源

  5. 定制和微调的需求

  6. 长期维护和支持的考虑因素

从本质上讲,虽然 vLLM 可能在生产环境中提供卓越的性能和可扩展性,但 Ollama 的简单性在某些情况下可能是无价的,特别是在开发的早期阶段或对于较小规模的项目。

最终,最好的选择将是最符合你项目独特需求和限制的那个。值得考虑的是,在某些情况下,你甚至可能同时使用两者而受益:使用 Ollama 进行快速原型设计和初始开发,当你准备好扩展并为生产进行优化时,再使用 vLLM。这种混合方法可以让你兼得两者的优势,使你能够在项目生命周期的不同阶段利用每个框架的优势。

AI大模型学习福利

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

大模型&AI产品经理如何学习

求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

在这里插入图片描述

在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方图片前往获取

3.技术文档和电子书

这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
在这里插入图片描述

4.LLM面试题和面经合集

这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

### 特点对比 对于OllamaVLLM这两个机器学习框架,在特点方面存在显著差异。Ollama专注于提供高度优化的硬件加速支持以及简化的大规模分布式训练接口,使得用户能够更高效地利用集群资源完成复杂的模型训练任务[^1]。 相比之下,VLLM则更加注重灵活性与易用性的平衡。该平台不仅提供了丰富的预构建模块库供开发者快速搭建原型系统,还允许通过自定义层实现个性化算法逻辑的设计[^2]。 ### 性能评估指标 为了衡量上述两种框架下的模型表现优劣程度,通常会采用多种评价标准来进行综合考量: - **准确性**:以Jaccard指数为例,这是一种用于度量预测结果同真实标签之间交并比值大小的有效工具;其取值范围介于0至1之间,数值越接近后者表明匹配精度越高。 ```python def jaccard_index(y_true, y_pred): intersection = set(y_true).intersection(set(y_pred)) union = set(y_true).union(set(y_pred)) return len(intersection)/len(union) ``` - **计算效率**:除了关注最终输出质量外,运行速度同样是不可忽视的重要因素之一。具体而言,可以通过记录每次迭代所需的实际耗时来反映不同配置下系统的响应速率特性,并选取中间位数作为代表性样本加以分析说明。 ### 差异化功能 当涉及到决策制定过程中的策略选择时,两者亦呈现出各自独特之处: - Ollama倾向于采取线性方式做出推断判断,并依据概率分布随机挑选动作执行方案; - 而VLLM更多依赖分类机制进行目标识别定位工作,同时借助精确贪婪法则指导下一步行动计划的确立[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值