外观
本地运行大模型
本地运行需要推理引擎,常见的各厂家推理引擎有:
- MNN(Mobile Neural Network):阿里的轻量级深度学习推理引擎,主要针对移动端和边缘设备(手机,loT)
- 支持多种框架(TensorFlow,PyTorch,ONNX)的模型转换
- 广泛兼容CPU,GPU,NPU,适合低功耗设备
- 使用结合量化和高效内存访问的模式,支持批量,但侧重单实例效率
- 依赖少(C++核心),跨平台
- 缺点不支持高并发高吞吐
- llama.cpp:基于GGML(简洁的机器学习库)的c++推理引擎,适合本地运行而非大规模部署
- GPU(cuda,metal,vulkan) CPU(avx2/simd优化) NPU。支持量化格式GGUF
- 单用户本地运行 支持简单的api,不适合高并发
- 轻量无python依赖,消费级硬件上高效,功耗低
- 多用户场景扩展差
- vLLM:专注高吞吐低延迟的批量推理
- 主要NVIDIA GPU,扩展到Intel gpu,amd
- 连续批处理 支持FP8/INT8
- 依赖多,消耗高
| 维度 | MNN | llama.cpp | vLLM |
|---|---|---|---|
| 核心目标 / 主要焦点 | 移动端/边缘设备,资源受限的端侧通用推理 | 消费级硬件上的本地单用户/轻量LLM推理 | 服务器端高并发、高吞吐量的生产级LLM服务 |
| 主要硬件 | 手机/平板 CPU / GPU / NPU(ARM/Mobile强) | 电脑 CPU / Apple Silicon / 入门-中端独显(广兼容) | NVIDIA 数据中心级GPU(A100/H100/H200等,最强) |
| 语言/依赖 | C++ 核心,低依赖(支持Java/Obj-C/Python绑定) | C++ 核心,低依赖(Python绑定可选) | Python + PyTorch + CUDA,高依赖 |
| 量化支持 | 优秀(4-bit+混合量化,端侧优化) | 极强(GGUF格式已成为行业事实标准,支持极致量化如Q4/Q3/IMatrix) | 好(AWQ/GPTQ/FP8/INT8),但不如GGUF生态普及 |
| 显存/内存效率 | 高(端侧内存布局优化) | 极高(可在16GB内存跑70B Q4模型,内存映射加载快) | 高(PagedAttention大幅减少碎片,但整体仍偏高) |
| 吞吐量 (单用户,tokens/s) | 30–60(移动端典型,视芯片) | 50–150(消费级GPU/Apple Silicon,Q4下高) | 40–80(单用户提示处理更快,但生成侧不如极致优化) |
| 吞吐量 (多用户/批处理,tokens/s) | 中等(不针对高并发优化) | 低–中等(扩展性差,32用户下远低于vLLM) | 极高(H100上可达12,000–16,000+,多用户下35x+于llama.cpp) |
| 首Token延迟 (TTFT) | 低(小模型/端侧快) | 中等(取决于量化,单用户优秀) | 低(连续批处理+预填优化,生产级最稳) |
| 整体延迟 | 低(端侧实时性好) | 中等(单用户可预测) | 低–极低(高负载下仍保持优秀TTFT) |
| 功耗 | 极低(移动设备级别,典型几W–几十W) | 低(消费级硬件700W以内典型) | 高(数据中心GPU 1200W+) |
| 启动 / 加载时间 | 快(内存映射+端侧优化) | 快(GGUF内存映射极快) | 慢(模型加载+初始化长,尤其大模型) |
| 部署难度 | 中等(需集成SDK/编译) | 极低(单二进制或简单Python库) | 中等(Docker + Python环境 + GPU驱动) |
| 易用性 | 中等(更偏集成到App) | 高(CLI/llama-server/Ollama等生态) | 高(OpenAI兼容API,开箱即用) |
| 模型生态 | 通用模型(CV起家,LLM支持快速跟进,如Qwen系列) | 最丰富(GGUF社区模型最多,几乎所有主流LLM都有) | 丰富(HuggingFace原生,支持广泛) |
| 典型用户/场景 | 手机App/边缘AI(如淘宝/天猫端侧AI功能) | 个人开发者、本地知识库、原型、离线聊天 | 云厂商、AI初创/企业API、高负载生产服务 |
| 社区/成熟度 | 中等(阿里主导,端侧稳定) | 极高(GGML/llama.cpp生态最大、最活跃) | 高(企业+学术支持,生产级成熟) |
其他的一些引擎:
- SGLang: vLLM 的强竞争者,更快于多轮对话和代理工作流(16,200 tokens/s on H100)。适合工具调用和批处理,Python-based。优于 vLLM 在长上下文,但生态稍弱。
- LMDeploy: 量化模型专家(支持 AWQ/EXL2),在低精度下极快(16,200 tokens/s)。适合资源有限的生产,易部署。比 vLLM 更省 VRAM。
- TensorRT-LLM (NVIDIA): 针对 NVIDIA 硬件的最大吞吐(优于 vLLM 在规模化),但设置复杂。适合企业级,需 CUDA。
- Ollama: 基于 llama.cpp 的用户友好包装,一键运行。适合新手/原型,添加模型管理和 GUI。
- mlc-llm: 类似于 MNN,针对移动/边缘的编译优化(TVM-based)。更好于跨设备部署,支持 MoE 模型。
- TGI (Text Generation Inference): Hugging Face 的 Rust-based 服务器,平衡 vLLM 的吞吐和 llama.cpp 的效率。支持 gRPC,适合混合负载。
**推荐:
- 如果是移动/嵌入式: MNN 或 mlc-llm。
- 单用户本地: llama.cpp 或 Ollama。
- 高并发生产: vLLM、SGLang 或 LMDeploy(视量化需求)。 测试时,用你的硬件和模型基准(如 Llama 3.1)比较实际性能。
编译llama.cpp
apt install -y build-essential git cmake libopenblas-dev libgomp1
# `build-essential`: 包含 gcc、g++、make 等核心编译工具;
# `git`: 用于克隆 llama.cpp 源码;
# `cmake`: llama.cpp 新版默认用 CMake 构建;
# `libopenblas-dev`: 提供 BLAS 加速(提升矩阵运算性能);
# `libgomp1`: 支持 OpenMP 多线程加速(N100 有 4 核 8 线程,能充分利用)
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
#确认环境&生成编译脚本
#-DBUILD_SHARED_LIBS=OFF #构建静态库还是动态库,是否生成动态库(.so文件) 只跑服务用off
#DLLAMA_OPENCL=ON #使用核显 需要安装 apt install -y ocl-icd-opencl-dev
#-DLLAMA_AVX2=ON: 开启 AVX2 指令集 提升计算性能
#-DLLAMA_FMA=ON: 开启 FMA 融合乘加指令 优化浮点运算
#-DLLAMA_OPENBLAS=ON: 启用 OpenBLAS 加速矩阵运算
#-DCMAKE_BUILD_TYPE=Release: 编译为发布版本(优化性能 无调试信息)
rm -rf ./build && cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_AVX2=ON -DGGML_FMA=ON -DLLAMA_CUDA=OFF -DGGML_OPENCL=ON -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
#开始执行编译
cmake --build build --config Release -j$(nproc) # $(nproc)编译线程数按需调整关于开启opencl使用核显
#查看OpenCL库的位置
ldconfig -p | grep OpenCL
#将位置带入编译命令重新编译
rm -rf build && cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_AVX2=ON -DGGML_FMA=ON -DGGML_CUDA=OFF -DGGML_OPENCL=ON -DOpenCL_LIBRARY=/lib/x86_64-linux-gnu/libOpenCL.so.1 -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
#-DOpenCL_LIBRARY=/lib/x86_64-linux- #连接opencl库
#这没用上opencl
/llama$ ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊"
ggml_opencl: platform IDs not available.
#这,识别了 OpenCL 库,但运行时绿联系统的 OpenCL 驱动仍未正确加载**(`platform IDs not available`)
#权限的问题,普通用户无法调用集成显卡
yuchen@MOSS5202:/volume1/docker/llama$ ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊(回答问题不要过度思考)" -ngl 99 ggml_opencl: platform IDs not available. warning: no usable GPU found, --gpu-layers option will be ignored warning: one possible reason is that llama.cpp was compiled without GPU support warning: consult docs/build.md for compilation instructions Loading model...
#N100 核显的 OpenCL 平台已经识别到了!! 但是跟默认开启的高通Adreno显卡冲突 了 关闭它
yuchen@MOSS5202:/volume1/docker/llama$ sudo ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊(回答问题不要过度思考)" -ngl 99 ggml_opencl: selected platform: 'Intel(R) OpenCL Graphics' ggml_opencl: device: 'Intel(R) UHD Graphics (OpenCL 3.0 NEO )' ggml_opencl: Adreno-specific kernels should not be enabled for non-Adreno GPUs; run on an Adreno GPU or recompile with CMake option `-DGGML_OPENCL_USE_ADRENO_KERNELS=OFF` ggml_opencl: drop unsupported device. warning: no usable GPU found, --gpu-layers option will be ignored warning: one possible reason is that llama.cpp was compiled without GPU support warning: consult docs/build.md for compilation instructions
#将位置带入编译命令重新编译
rm -rf build && cmake -B build -DBUILD_SHARED_LIBS=OFF -DGGML_AVX2=ON -DGGML_FMA=ON -DGGML_CUDA=OFF -DGGML_OPENCL=ON -DGGML_OPENCL_USE_ADRENO_KERNELS=OFF -DOpenCL_LIBRARY=/lib/x86_64-linux-gnu/libOpenCL.so.1 -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
#-DGGML_OPENCL_USE_ADRENO_KERNELS=OFF 禁用高通显卡
#-DOpenCL_LIBRARY=/lib/x86_64-linux- #连接opencl库
#来了!!!
yuchen@MOSS5202:/volume1/docker/llama$ sudo ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊(回答问题不要过度思考)" -ngl 99
ggml_opencl: selected platform: 'Intel(R) OpenCL Graphics'
ggml_opencl: device: 'Intel(R) UHD Graphics (OpenCL 3.0 NEO )'
ggml_opencl: OpenCL driver: 24.22.29735.27
ggml_opencl: vector subgroup broadcast support: false
ggml_opencl: device FP16 support: true
ggml_opencl: mem base addr align: 128
ggml_opencl: max mem alloc size: 3390 MB
ggml_opencl: device max image buffer size (pixels): 222171392
ggml_opencl: device max workgroup size: 512
ggml_opencl: SVM coarse grain buffer support: true
ggml_opencl: SVM fine grain buffer support: false
ggml_opencl: SVM fine grain system support: false
ggml_opencl: SVM atomics support: false
ggml_opencl: flattening quantized weights representation as struct of arrays (GGML_OPENCL_SOA_Q)
ggml_opencl: loading OpenCL kernels....................................................................................
ggml_opencl: default device: 'Intel(R) UHD Graphics (OpenCL 3.0 NEO )'
Loading model...
成是成了,速度慢了3倍????????????????????????????????
还是因为显卡太差了,还需要把数据搬运到显卡中处理 所以更慢
sudo ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊(回答问题不要过度思考)" -ngl 0 --no-mmap --temp 0.7
还是用-ngl 0吧 纯CPU下载模型
https://huggingface.co/unsloth,建议下载量化为 UD-Q4_K_XL 的
运行
可以交互式运行llama-cli,也可服务式运行llama-server
cli: ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊" server: ./llama-server -m ./models/DeepSeek-R1-Distill-Qwen-1.5B-UD-Q4_K_XL.gguf --port 8684 -ngl 0./llama-server -m ./models/DeepSeek-R1-Distill-Qwen-1.5B-UD-Q4_K_XL.gguf --port 8684 -ngl 0 -c 2048 --no-mmap --mlock 0 -t 2 --no-warmup
- -c 2048 上下文窗口降到 2048
- -ngl 0 禁用 GPU,纯 CPU 运行
/llama$ ./llama-cli -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf -p "你好啊"
ggml_opencl: platform IDs not available.
Loading model...
▄▄ ▄▄
██ ██
██ ██ ▀▀█▄ ███▄███▄ ▀▀█▄ ▄████ ████▄ ████▄
██ ██ ▄█▀██ ██ ██ ██ ▄█▀██ ██ ██ ██ ██ ██
██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀
██ ██
▀▀ ▀▀
build : b8281-0cec84f99
model : Qwen3.5-0.8B-UD-Q4_K_XL.gguf
modalities : text
available commands:
/exit or Ctrl+C stop or exit
/regen regenerate the last response
/clear clear the chat history
/read add a text file
> 你好啊
[Start thinking]
Here‘s a thinking process that leads to the suggested response:
1. **Analyze the Request:**
* **User:** "你好啊" (Hello).
* **Tone:** Friendly, conversational, warm.
* **Context:** AI assistant.
* **Intent:** The user is initiating a conversation. They are greeting me.
* **Constraint:** I need to respond politely and helpfully, maintaining the persona of a helpful AI assistant.
2. **Determine the Response Strategy:**
* **Greeting:** Acknowledge the greeting warmly.
* **Self-Introduction:** Briefly state who I am (to show understanding).
* **Offer Assistance:** Invite them to ask questions or share something interesting.
* **Engagement:** Ask a question or suggest a topic to start.
[ Prompt: 25.3 t/s | Generation: 18.2 t/s ]
yuchen@MOSS5202:/volume1/docker/llama$ ./llama-bench -m ./models/Qwen3.5-0.8B-UD-Q4_K_XL.gguf
ggml_opencl: platform IDs not available.
| model | size | params | backend | ngl | test | t/s |
| ------------------------------ | ---------: | ---------: | ---------- | --: | --------------: | -------------------: |
| qwen35 0.8B Q4_K - Medium | 522.43 MiB | 752.39 M | OpenCL | 99 | pp512 | 33.73 ± 1.75 |
| qwen35 0.8B Q4_K - Medium | 522.43 MiB | 752.39 M | OpenCL | 99 | tg128 | 17.50 ± 0.78 |
build: 0cec84f99 (8281)有时候可能会出现运行模型就会被kill掉的情况。 一般是因为内存不够了 使用参数 -c 限制上下文长度
有显卡的话推荐vLLM来运行,相比GGUF,vLLM 能做到 零进度损失,速度更快(GPU),支持高并发,还能多GPU运行
