手机端跑大模型:Ollma/llama.cpp/vLLM 实测对比

news2024/9/22 11:33:13

昨天给大家分享了:如何在手机端用 Ollama 跑大模型

有小伙伴问:为啥要选择 Ollama?

不用 Ollama,还能用啥?据猴哥所知,当前大模型加速的主流工具有:Ollama、vLLM、llama.cpp 等。

那我到底该用哪个呢?

今日分享:带大家在手机端分别跑通 Ollama、vLLM、llama.cpp,并给出评测结论。

友情提醒:本文实操,请确保已在手机端准备好 Linux 环境,具体参考上篇教程。

1. 三者区别

以下是我对三者的简单认识:

  • llama.cpp:基于C++重写了 LLaMa 的推理代码,是一种推理框架。支持动态批处理,支持混合推理。
  • Ollama:利用了 llama.cpp 提供的底层能力(如量化),小白易上手。
  • vLLM:基于Python,采用PagedAttention高效管理注意力KV内存,支持动态批处理。

此外,三者的模型权重存储也不同:

  • llama.cpp:只支持 gguf 格式的模型,可以自己生成或从 huggingface 等平台下载 gguf 格式的模型;

  • Ollama:支持从项目的 Library 下载,也可以自己生成,有自己的存储格式;

  • vLLM:支持从 huggingface/modelscope 等平台下载的模型文件。

Qwen2 对这3个方案都有支持,为此本文将以 qwen2:0.5b 进行实测。

2. Ollama

项目地址:https://github.com/ollama/ollama

如何安装 Ollama,之前的教程已经介绍得很详细了:本地部署大模型?Ollama 部署和实战,看这篇就够了。

上篇中我们采用的是 Ollama+OpenWebUI 的镜像,如果端侧不需要 webui,可以用官方最新镜像,拉起一个容器:

sudo docker run -d -v ollama:/root/.ollama -p 1002:11434 --restart unless-stopped --name ollama ollama/ollama

注意:因为官方镜像托管在 docker.hub,国内下载会失败👇

如果你也遇到docker 镜像下载失败的问题,一定记得打开代理!关于如何配置docker镜像代理,我打算单独开一篇教程,敬请期待!

进入容器,运行 qwen2:0.5b

sudo docker exec -it ollama /bin/bash
ollama run qwen2:0.5b

然后,查看 ollama 的 server api 是否成功启动:

netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp6       0      0 :::11434                :::*                    LISTEN      1/ollama

没问题,在宿主机上,写一个测试用例吧:

def test_ollama():
    url = 'http://localhost:1002/api/chat'
    data = {
        "model": "qwen2:0.5b",
        "messages": [
            { "role": "user", "content": "你好" }
        ],
        "stream": False
    }
    response = requests.post(url, json=data)
    print(response.text)

返回示例如下:

{"model":"qwen2:0.5b","created_at":"2024-09-15T01:31:49.502405293Z","message":{"role":"assistant","content":"你好!有什么问题或需要帮助的地方吗?我很乐意回答您的问题。"},"done_reason":"stop","done":true,"total_duration":1052511042,"load_duration":94924636,"prompt_eval_count":9,"prompt_eval_duration":52884000,"eval_count":17,"eval_duration":900186000}

3. vLLM

项目地址:https://github.com/vllm-project/vllm

支持的模型列表:https://docs.vllm.ai/en/latest/models/supported_models.html

vLLM 的安装较为复杂,pip 包的安装方式,需要你的环境中支持 CUDA 12.1:

pip install vllm

显然在端侧无法搞定,为此只能选择源码安装,这里一路踩了不少坑,分享出来,供小伙伴们参考。

3.1 camke 版本问题

参考官方文档进行安装:https://docs.vllm.ai/en/latest/getting_started/cpu-installation.html

如果安装过程中遇到报错:

CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  CMake 3.26 or higher is required.  You are running version 3.16.3

看看你的 cmake 版本,低于 3.26 就得重新安装:

camke --version

前往https://cmake.org/download/,找到最新版 cmake:

一键安装,并添加到系统环境变量:

sh cmake-3.30.3-linux-aarch64.sh
export PATH=/home/aidlux/tools/cmake-3.30.3-linux-aarch64/bin:$PATH

3.2 指令集问题

最后一步,安装 vLLM:

VLLM_TARGET_DEVICE=cpu python setup.py install

报错了:

CMake Error at cmake/cpu_extension.cmake:82 (message):
  vLLM CPU backend requires AVX512 or AVX2 or Power9+ ISA support.

可以发现,vLLM 项目对硬件的要求很高,需要 CPU 支持 AVX512、AVX2 或 Power9+ 高级指令集,而对于 ARM 架构 的 CPU,通常并不支持 AVX2 和 AVX512,这两是 Intel 和 AMD CPU 的扩展指令集。

无解了!

只好放弃 vLLM~

4. llama.cpp

4.1 下载项目并编译

执行如下指令:

git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp/
make

在目录下会生成一系列可执行文件,比如:

  • llama-cli:用于推理模型;
  • llama-quantize:用于量化模型;
  • llama-server:提供模型 API 服务

4.2 下载模型并转换

首先准备环境:

conda create -n llamacpp python=3.12
conda activate llamacpp
pip install -r requirements.txt

下载模型到 models/ 目录下:

cd models
sudo apt-get install git-lfs
# or
git lfs install
git clone https://www.modelscope.cn/qwen/Qwen2-0.5B-Instruct.git

如果下载地址中没有 GGUF 格式的文件,需执行模型转换脚本:

python convert_hf_to_gguf.py models/Qwen2-0.5B-Instruct/

当然,如果下载的模型有 GGUF 格式的版本,直接使用即可。

4.3 推理测试

指定模型地址:

./llama-cli -m models/Qwen2-0.5B-Instruct/Qwen2-0.5B-Instruct-F
16.gguf -p hello -n 256

有输出就没问题!

4.4 OpenAI API

执行如下指令,会拉起一个 REST API服务,且兼容 OpenAI 格式!

./llama-server -m models/Qwen2-0.5B-Instruct/Qwen2-0.5B-Instruct-F16.gguf --host 0.0.0.0 --port 2001
# 放到后台运行
nohup ./llama-server -m models/Qwen2-0.5B-Instruct/Qwen2-0.5B-Instruct-F16.gguf --host 0.0.0.0 --port 2001 > log.txt 2>&1 &

为此,调用示例代码如下:

from openai import OpenAI

client = OpenAI(api_key='xx', base_url='http://localhost:2001/v1')
completion = client.chat.completions.create(
                model='qwen2',
                messages=[{'role': 'user', 'content': '为什么天空是蓝色的'}],
                stream=False
            )
print(completion.choices[-1].message.content)

api_key 和 model 随便填就行,因为只启动了一个模型。

5. Ollama 和 llama.cpp 评测对比

我们采用如下的提示词,分别调用 5 次:

messages = [{'role': 'user', 'content': '为什么天空是蓝色的'}]

评测代码如下:

import time
for i in range(5):
    start_time = time.time()
    text = test_ollama()
    end_time = time.time()
    print(f"第{i+1}次调用:{end_time-start_time}秒, token/s:{len(text)/(end_time-start_time)}")

注:这里并没有严格计算 token 数量,直接使用输出文本字数进行平均耗时对比。

Ollama 调用耗时:

第1次调用:9.803798913955688秒, token/s:26.214327961598745
第2次调用:10.22051048278808秒, token/s:26.90667951107877
第3次调用:16.36184406280517秒, token/s:25.36388920509305
第4次调用:12.29462456703186秒, token/s:26.596989458047645
第5次调用:7.711999416351318秒, token/s:27.87863281526547

llama.cpp 调用耗时:

第1次调用:18.27004337310791秒, token/s:11.932100846617535
第2次调用:18.72978639602661秒, token/s:15.750313098209284
第3次调用:15.97263455390930秒, token/s:14.149199948025263
第4次调用:7.018653631210327秒, token/s:14.39022429471037
第5次调用:21.80415105819702秒, token/s:15.409909750817134

从上述结果可以发现:同款模型,在不进行量化的前提下,Ollama 的速度是 llama.cpp 的近两倍

写在最后

本文通过实测 Ollama / llama.cpp / vLLM,解答了端侧部署大模型该用哪款框架的问题。

不知大家用的什么方案,欢迎评论区交流。

如果对你有帮助,不妨点个免费的赞收藏备用。


为方便大家交流,新建了一个 AI 交流群,欢迎感兴趣的小伙伴加入。

最近打造的微信机器人小爱(AI)也在群里,想进群体验的朋友,公众号后台「联系我」即可,拉你进群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙版 React Native 正式开源,ohos_react_native 了解一下

距离鸿蒙 Next 宣布一年后,除了 Flutter 的鸿蒙支持之外,React Native 的社区支持的 ohos_react_native 也终于在 OpenHarmony-SIG 对外开源,并且和 Flutter 不同在于,本次开源的版本是基于 React Native 0.72.5 。 ohos_react_n…

算法——贡献法

前天的AtCoder Beginner Contest 371 D题碰到了这个贡献法,刚好之前的第十一届蓝桥杯省赛第二场真题AcWing 2868. 子串分值也是用的这个方法hh,但是赛时没有搞出来。。。 AcWing 2868. 子串分值 对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中…

UDS 诊断 - TransferData(传输数据)(0x36)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务 UDS 诊断 - ECUReset(ECU重置)(0x11)服务 UDS 诊断 - SecurityA…

芯片制造过程(科普版)

tip:是搬运过来的,vx公众号:胖虎说可科普(感觉它的视频也是不知道哪里搞过来的,bushi) 目录 1 芯片结构2 制造过程2.1 晶圆的制造2.2 晶圆的加工2.3 掩膜电路2.4 光刻2.5 离子注入2.6 切割 封装等 最后 记录一下编写过程&#xff…

IM系统完结了,那简历该怎么写?(含简历项目描述)

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

在线仿真器ST-Link为例的整体认知

仿真器的作用 参考 简单来说,仿真器拥有下载和实时程序控制两个功能,而且下载的地址直接指向flash而不需要设置引脚启动单片机内部的bootloader程序,而实际中更加实用的是程序控制调试,这可以减少很多下载操作。 仿真器的在调试…

信息安全工程师(6)网络信息安全现状与问题

一、网络信息安全现状 威胁日益多样化:网络攻击手段不断翻新,从传统的病毒、木马、蠕虫等恶意软件,到勒索软件、钓鱼攻击、DDoS攻击、供应链攻击等,威胁形式多种多样。这些攻击不仅针对个人用户,还广泛影响企业、政府等…

[数据集][图像分类]茶叶病害分类数据集6749张7类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):6749 分类类别数:7 类别名称:["Unlabeled","alg…

【设计模式】UML类图和六大设计原则

前言 在实践中经常看到工厂模式、观察者模式等字眼,渐觉设计模式的重要性,于是开刷设计模式。 本文讲述了UML类图以及设计模式的六大原则 参考资料: 课程视频:黑马程序员Java设计模式 一、UML类图 1. 类和接口的表示方式 如…

【Elasticsearch系列八】高阶使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在线教育平台项目

介绍 基于SpringBootVue前后端分离的在线教育平台项目,单体应用服务架构。系统共设计三种角色:管理员、讲师和学员,三个角色分别对应一个操作端。也就是本系统1个后台项目,三个前端项目。管理员端没有引入角色和权限管理&#xf…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet,其核心思想是将特征图的部分通道进行分割和并行处理,目的是减少冗余梯度信息,同时保持较高的网络表达能力。C3 结构与传统的残差结构类似,但…

【23-24年】年度总结与迎新引荐

文章目录 相关连接前言1 忙碌的备研与本科毕设2 暑期阿里之旅3 团队荣誉与迎新引荐4 项目合作意向 相关连接 个人博客:issey的博客 - 愿无岁月可回首 前言 自从2023年4月更新了两篇关于NLP的文章后,我便消失了一年半的时间。如今,随着学业…

软考高级:存储系统IO 数据传输方式:程序控制方式、程序中断方式、DMA 方式、通道方式、IO 处理机 AI 解读

关于计算机中的IO数据传输方式,有几种不同的策略可以用来进行数据的传输和控制。我们分别讲解一下它们。 生活化例子 假设你在一条生产线上工作,有几种方式可以处理不同的任务(如搬运、检查、修理产品): 程序控制方…

Linux基础---09Find文件查找

百分之八十的财富掌握在百分之二十的手里,这就是著名的二八法则。这里列出关键字表,希望大家复习的时候看到关键字,脑袋里就自动浮现出整句命令。 查询方式主要参数文件名-name文件大小-size忽略大小写-iname按天-atime,-mtime,-…

目标检测基本知识

目标检测 一、目标检测二、常用的评价指标2.1 IOU2.2 NMS(非极大值抑制) 三、R-CNN网络基础3.1 Overfeat模型3.2 RCNN模型3.3FastRCNN模型 四、Faster-RCNN网络4.1 网络工作流程 五、yolo系列5.1 yoloV3 六、SSD算法 一、目标检测 目标检测的任务是找出图像中所有感兴趣的目标…

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…

SOMEIP_ETS_112: SD_Empty_Option

测试目的: 验证DUT能够拒绝长度为0的IPv4选项的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个IPv4选项长度为0的SubscribeEventgroup消息时,能够正…

不同编程语言如何统计代码执行时间

在软件开发过程中,统计代码执行时间是一个非常有用的工具,可以帮助开发者优化程序性能、识别瓶颈以及进行基准测试。不同的编程语言提供了不同的方法来测量代码执行时间。以下是一些常见编程语言中测量代码执行时间的方法,并详细解释每一步的…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清,I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写,而IIC是它的另一种表述方式,代表的是同一个意思,即“集成电路间总线”。I2C是一种由飞利浦公司(现恩智浦半…