AI大模型教程
一起来学习

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

昨天给大家分享了:如何在手机端用 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)也在群里,想进群体验的朋友,公众号后台「联系我」即可,拉你进群。

文章来源于互联网:手机端跑大模型:Ollma/llama.cpp/vLLM 实测对比

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » 手机端跑大模型:Ollma/llama.cpp/vLLM 实测对比
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们