llama.cpp
跳转到导航
跳转到搜索
文本相似度计算
启动服务:
# bge-m3
llama-server -hf lm-kit/bge-m3-gguf:Q8_0 --embedding -c 0 --log-disable
# 另一个慢一点的模型
llama-server -hf Qwen/Qwen3-Embedding-0.6B-GGUF:Q8_0 --embedding -c 0 --log-disable
发送请求:[1]
import numpy as np
import httpx
client = httpx.Client()
def encode(data):
import time
from itertools import batched, chain
start = time.time()
ret = []
for i, batch in enumerate(batched(data, 1000)):
print(i)
q = {'content': batch}
r = client.post('http://127.0.0.1:8080/embedding', json=q, timeout=6000)
e = [x['embedding'][0] for x in r.json()]
ret.append(e)
embeddings = np.array(list(chain.from_iterable(ret)), dtype=np.float16)
embedding_time = time.time()
print('\nencoding time:', embedding_time - start)
return embeddings
def query_similar_items(items, embeddings, query):
q = encode([query])[0]
sim = embeddings @ q.T
indices = np.argsort(sim)[-10:][::-1]
for idx in indices:
print(sim[idx], items[idx])
和sentence-transformers相比,使用llama.cpp加载与运行速度快、显存占用低、依赖库少。
在Intel HD 630核显上运行时,会报错[注 1]甚至在数据较多时发生显卡上下文重置从而导致进程崩溃。使用--device none参数在CPU上运行则没有这个问题,并且运行效率还更高。
后端对比
| 后端 | 效率(tokens per second) |
|---|---|
| Vulkan + OpenBLAS + x86-64-v3 | 8.40 |
| ROCm HIP[注 2] | 7.03 / 6.81 |
在使用Qwen/Qwen3-Embedding-0.6B-GGUF:Q8_0执行text embedding任务时,Vulkan后端比ROCm后端慢一倍左右,但也有可能是因为编译参数的原因。
注意:对于Vulkan后端,指定--device none时,对于视觉模型,需要额外指定--no-mmproj-offload以避免使用Vulkan来编码图片。
量化对比
对unsloth/Qwen3.5-2B-MTP-GGUF的UD-IQ2_M(944 MiB)和UD-Q2_K_XL(1.05 GiB)对比结果:两者运行性能差不多,但是UD-IQ2_M无法正确识别语种,并且翻译时更容易丢三落四。
更小的模型unsloth/Qwen3.5-0.8B-MTP-GGUF:UD-Q2_K_XL则处于完全不可用的状态。
脚注
外部链接
- VRAM 计算器
- mradermacher/BabyHercules-4x150M-GGUF · 2 abc or not 2 abc: 不同量化的对比,尤其是imatrix量化和静态量化的对比