环境:debian12.9、cmake、python3+、显卡:A100*1(有显卡可加快量化速度,纯CPU非常慢)
首先下载好需要的模型,hug上可下载safetensors、GGUF。如果你下载的是GGUF可直接到第二步。
如果你下载的gguf含有多个,需要使用llama.cpp先将其合并为一个gguf文件,合并方法可在本站搜索。
本文以hug下载的safetensors为例。
一、safetensors转换为gguf
进入到llama.cpp根目录
先激活python虚拟环境
创建一个文件夹,例如llm
执行 python3 -m venv llm
source llm/bin/activate
执行 pip install -r requirements.txt
或者仅安装必要
pip install torch transformers sentencepiece gguf numpy -i https://mirrors.ustc.edu.cn/pypi/simple
安装好依赖后转换模型。
执行:
python convert_hf_to_gguf.py /模型目录 --outtype f16 --verbose --outfile 输出文件名.gguf
# 如果不量化,保留模型的效果
python convert_hf_to_gguf.py /模型目录 --outtype f16 --verbose --outfile 输出文件_f16.gguf
# 如果需要量化(加速并有损效果),直接执行下面脚本就可以
python convert_hf_to_gguf.py /模型目录 --outtype q4_0 --verbose --outfile 输出文件_q4_0.gguf
这一步是将safetensors转换为GGUF文件并且可选择更改权重,方便接下来量化。这里我不更改权重,使用f16.
这里--outtype是输出类型,代表含义:
q2_k:特定张量(Tensor)采用较高的精度设置,而其他的则保持基础级别。
q3_k_l、q3_k_m、q3_k_s:这些变体在不同张量上使用不同级别的精度,从而达到性能和效率的平衡。
q4_0:这是最初的量化方案,使用 4 位精度。
q4_1 和 q4_k_m、q4_k_s:这些提供了不同程度的准确性和推理速度,适合需要平衡资源使用的场景。
q5_0、q5_1、q5_k_m、q5_k_s:这些版本在保证更高准确度的同时,会使用更多的资源并且推理速度较慢。
q6_k 和 q8_0:这些提供了最高的精度,但是因为高资源消耗和慢速度,可能不适合所有用户。
fp16 和 f32: 不量化,保留原始精度。
二、 量化模型。
进入llama.cpp/build/bin目录
下面将转换后的gguf模型量化为4-bit。
执行:
./llama-quantize ./源文件-f16.gguf ./输出文件-q4_0.gguf q4_0
等待量化完毕后即收获了一个量化为4-bit的模型。
三、使用模型。
交互模式下,使用模型
./main -m ./models/llama-2-7b-langchain-chat-GGUF/llama-2-7b-langchain-chat-q4_0.gguf -ins
> 世界上最大的鱼是什么?
卡加内利亚鲨为世界最大的鱼,体长达60英尺(18)。牠们的头部相当于一只小车,身体非常丑,腹部有两个气孔,气孔之间还有一个大口径的鳃,用于进行捕食。牠们通常是从水中搴出来到陆地上抓到的小鱼,然后产生大量液体以解脱自己的身体。
> 现在还有这种鱼吗?
作者所提到的“卡加内利亚鲨”,应该是指的是“卡加内利亚鳄”。卡加内利亚鳄是一种大型淡水肉食性鱼类,分布于欧洲和非洲部分区域。这种鱼的体长最大可达60英尺(18),是世界上已知最大的鱼之一。
交互模式下,以对话的形式,有上下文的连续使用大模型。
提供模型 API 服务
有两种方式,一种是使用 llama.cpp 提供的 API 服务,另一种是使用第三方提供的工具包。
使用 llama.cpp server 提供 API 服务
前面编译之后,会在 llama.cpp 项目的根目录下生成一个 server 可执行文件,执行下面的命令,启动 API 服务。
./llama-server -m /DATA/qwen25.gguf -fa auto –host 0.0.0.0 –port 8080 -c 65536 -ngl 999 -a TEST -np 1 –repeat-penalty 1.0 –temp 0.5 –top-k 10 –top-p 0.8 -t 24 -sm layer -ts 1,1 –chat-template qwen2
如果出现胡言乱语,请删除–chat-template qwen2
llm_load_tensors: mem required = 3647.96 MB (+ 256.00 MB per state)
..................................................................................................
llama_new_context_with_model: kv self size = 256.00 MB
llama_new_context_with_model: compute buffer total size = 71.97 MB
llama server listening at http://0.0.0.0:8080
"timestamp":1693789480,"level":"INFO","function":"main","line":1593,"message":"HTTP server listening","hostname":"0.0.0.0","port":8080
这样就启动了一个 API 服务,可以使用 curl 命令进行测试。
curl --request POST \
--url http://localhost:8080/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "What color is the sun?","n_predict": 512}'
{"content":".....","generation_settings":{"frequency_penalty":0.0,"grammar":"","ignore_eos":false,"logit_bias":[],"mirostat":0,"mirostat_eta":0.10000000149011612,"mirostat_tau":5.0,......}}
这样就启动了一个 API 服务,可以使用 curl 命令进行测试。
如模型上下文过低,你想对接openclaw之类有限制最低64k上下文的,请进行如下操作。
进入源模型文件夹,编辑config.json,找到max_position_embeddings 后面数值更改为64k=65536,128k=131072,保存后重新转换GGUF进行量化。启动命令增加 -c 65536即可成功对接啦。
已测试 qwen 7b 14b用上述方法可行,32b模型一般起步就是256k了。