llama.cpp

来自百合仙子's Wiki
跳转到导航 跳转到搜索

文本相似度计算

启动服务:

# 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上运行则没有这个问题,并且运行效率还更高。

后端对比

Qwen/Qwen3-8B-GGUF:Q8_0
后端 效率(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则处于完全不可用的状态。

脚注

  1. Fence expiration time out i915-0000:00:02.0:llama-server[1056037]:36e!
  2. 需要传递--n-gpu-layers 16参数,否则显存不足。

外部链接

参考资料