本人随时在线,可以一起讨论学习。
0:前提知识介绍(不爱看可以跳过)
GGML
讲 GGML 之前要先说下llama-cpp这个项目,它是开发者 Georgi Gerganov 基于 Llama 模型手撸的纯 C/C++ 版本,它最大的优势是可以在 CPU 上快速地进行推理而不需要 GPU。然后作者将该项目中模型量化的部分提取出来做成了一个模型量化工具:GGML,项目名称中的GG其实就是作者的名字首字母。
在 HuggingFace 上,如果看到模型名称带有GGML字样的,比如Llama-2-13B-chat-GGML,说明这些模型是经过 GGML 量化的。有些 GGML 模型的名字除了带有GGML字样外,还带有q4、q4_0、q5等,比如Chinese-Llama-2-7b-ggml-q4,这里面的q4其实指的是 GGML 的量化方法,从q4_0开始往后扩展,有q4_0、q4_1、q5_0、q5_1和q8_0,在这里可以看到各种方法量化后的数据。
原文链接:https://blog.csdn.net/asdfaa/article/details/137941606
1:准备文件
无非:gh、hf、ms这三个里面找来找去,但是现在hf真的连不上,唉。。
首先从HF里面拷贝出文件:
git clone git@hf.co:FlagAlpha/Llama3-Chinese-8B-Instruct
如果你没有安装 git-lfs 安装包,就在命令行输入:
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
然后再安装安装包:
yum install git-lfs
git clone https://huggingface.co/FlagAlpha/Llama3-Chinese-8B-Instruct
安装不上就换方法(上魔塔找):
Llama3-Chinese-8B-Instruct · 模型库 (modelscope.cn)
git clone https://www.modelscope.cn/FlagAlpha/Llama3-Chinese-8B-Instruct.git
2:准备llama.cpp进行量化
参考:pcuenca/llama.cpp: LLM inference in C/C++ (github.com)
git clone https://github.com/pcuenca/llama.cpp.git
没法线上下载的建议直接下载github上面的文件
然后开始编译.cpp文件,输入命令:make
中间遇到了问题:我的g++版本太低了需要升级:
sudo yum install centos-release-scl # 安装开发工具
sudo yum install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils # 升级
scl enable devtoolset-9 bash # 启用新的GCC版本
3:转换、量化
先将模型文件放到llama.cpp-master(就上面github下载下来的那个项目)的models目录下
然后执行转换命令,将其从Hugging Face格式的.bin
文件转换为FP16的GGUF格式,输出根据自己的需求去写:
python convert-hf-to-gguf.py models/Llama3-Chinese-8B-Instruct/ --outfile models/ggml-llama3-8b-f16.gguf
这里可能会出现量化失败的情况,但是我改为运行convert.py就好了
量化:
./quantize ./models/ggml-llama3-8b-f16.gguf ./models/ggml-llama3-8b-4b.gguf q4_0
得到的结果(图片红字上写反了)
如果无法量化成功,还好有大佬:
llama-3-chinese-8b-instruct-gguf · 模型库 (modelscope.cn)
Llama3-8b中文版(GGUF) · 模型库 (modelscope.cn)
这里面有大佬、大牛量化好的文件可以直接下载
4:运行测试
然后就可以在llama.cpp-master的目录下进行测试
./main -m ./models/ggml-llama3-8b-4b.gguf -c 512 -n 256 -b 64 -t 12 --color -i -r "助手:" -f prompts/chat-with-baichuan.txt
-c 控制上下文的长度,值越大越能参考更长的对话历史(默认:512)
-ins 启动类ChatGPT对话交流的instruction运行模式
-f 指定prompt模板,alpaca模型请加载prompts/alpaca.txt
-n 控制回复生成的最大长度(默认:128)
-b 控制batch size(默认:8),可适当增加
-t 控制线程数量(默认:4),可适当增加
--repeat_penalty 控制生成回复中对重复文本的惩罚力度
--temp 温度系数,值越低回复的随机性越小,反之越大
--top_p, top_k 控制解码采样的相关参数
具体参数可以参考官网文档:
llama.cpp/examples/main 在 master ·格尔加诺夫/llama.cpp (github.com)
运行成功!
5:部署应用gguf文件
接下来我们就要把这个量化后的gguf模型用在我们自己的程序中,官网(API Reference - llama-cpp-python)给出了两种方式,这里我们采取其中一种,用python加载模型的一种。
首先我们要安装一下辅助包:
pip install llama-cpp-python
然后我们就可以开始使用了,这里我给出一个我自己使用的例子:
from llama_cpp import Llama
my_model_path = "./models/ggml-model-q4_0.gguf" # model_2
CONTEXT_SIZE = 4096
# LOAD THE MODEL
zephyr_model = Llama(model_path=my_model_path,
n_ctx=CONTEXT_SIZE)
def generate_text_from_prompt(user_prompt,
max_tokens=300, # 模型响应中生成的最大令牌数
temperature=0.3, # 0-1之间值越低,最终结果越确定性
top_p=0.1, # 用于控制预测的多样性,这意味着它选择累积概率超过给定阈值的最可能的标记。 model_1:0.1
echo=False, # 用于确定模型是否在开头包含原始提示(True)或不包含它(False)
# stop=["]"] # 将导致模型生成过程停止的字符串列表
):
# Define the parameters
model_output = zephyr_model(
user_prompt,
max_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
echo=echo,
# stop=stop,
)
return model_output
if __name__ == "__main__":
my_prompt = "帮我输出一个josn格式的数据"
zephyr_model_response = generate_text_from_prompt(my_prompt)
print('-' * 50)
print(zephyr_model_response)
final_result = zephyr_model_response["choices"][0]["text"].strip()
print('-' * 50)
print(final_result)
print('-' * 50)
有什么别的问题可以相互相学交流,后续用作具体应用中还会更新的。里面用到一些大佬的博客、文章或者资源在此特别感谢!!!!!!