llama.cpp部署通义千问Qwen-14B

2023-12-20 19:20

本文主要是介绍llama.cpp部署通义千问Qwen-14B,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

llama.cpp是当前最火热的大模型开源推理框架之一,支持了非常多的LLM的量化推理,生态比较完善,是个人学习和使用的首选。最近阿里开源了通义千问大语言模型,在众多榜单上刷榜了,是当前最炙手可热的开源中文大语言模型。今天在github上看到前几天llama.cpp已经支持Qwen的推理了,但是由于是近期才开源的,网上还没有太多使用llama.cpp来推理通义千问的实例。本着学习的目的,今天就来实操一下,作为记录,也给需要的同学一些参考。由于最大的Qwen-72B太大了,下载需要较久时间,这里我们使用的是次一级的Qwen-14B的版本。

前提条件

已正确安装llama.cpp
能够访问HuggingFace

原始模型下载

通义千问模型在https://huggingface.co/Qwen/Qwen-14B-Chat/tree/main下载。
模型和相关代码配置文件
需要下载的文件包括:

模型文件 model-00001-of-00015 , … , model-00001-of-00015等
代码文件configuration_qwen.py,modeling_qwen.py,tokenization_qwen.py
配置文件config.json,tokenizer_config.json,model.safetensors.index.json

将上述文件下载到llama.cpp项目的models目录下,这里我放到了models/Qwen/14B/目录下。
模型放置的目录结构

需要魔法上网,不然国内无法顺利下载。
代码和配置都需要下载完全,不然llama.cpp转换的时候会报错。

模型格式转换

下载下来的模型是HuggingFace的格式,需要将HuggingFace的safetensors格式的模型文件转换成gguf格式才能使用llama.cpp推理。在llama.cpp项目根木目录执行转换脚本:

python convert-hf-to-gguf.py --model /workspace/Codes/llama.cpp/models/Qwen/14B

得到输出为:

Loading model: 14B
gguf: This GGUF file is for Little Endian only
Set model parameters
Set model tokenizer
gguf: Adding 151387 merge(s).
gguf: Setting special token type bos to 151643
...
...
blk.39.ffn_gate.weight, n_dims = 2, torch.bfloat16 --> float16
output_norm.weight, n_dims = 1, torch.bfloat16 --> float32
output.weight, n_dims = 2, torch.bfloat16 --> float16
Model successfully exported to '/workspace/Codes/llama.cpp/models/Qwen/14B/ggml-model-f16.gguf'

提示将模型格式转换成fp16的gguf格式即为转换成功。转换成功后,models/Qwen/14B/就会得到ggml-model-f16.gguf模型文件。

若在转换过程中报错提示缺少transformers和tiktoken等库,按提示pip install即可。

模型量化

格式转换后得到的是模型参数是fp16的,推理所需的资源还是比较多,速度相对较慢。想要进一步降低推理所需计算资源,需要对fp16的gguf模型进行量化。llama.cpp提供了多种量化方式,包括INT4,INT8量化及其各种变体。这里以INT4为例来进行量化,执行如下命令:

./quantize models/Qwen/14B/ggml-model-f16.gguf q4_0 # q4_0代表进行INT4量化

得到输出为:

ggml_init_cublas: GGML_CUDA_FORCE_MMQ:   no
ggml_init_cublas: CUDA_USE_TENSOR_CORES: yes
ggml_init_cublas: found 1 CUDA devices:Device 0: NVIDIA GeForce RTX 4070, compute capability 8.9
main: build = 1601 (5a7d312)
...
...
[ 321/ 323]               blk.39.ffn_gate.weight - [ 5120, 13696,     1,     1], type =    f16, quantizing to q4_0 .. size =   133.75 MiB ->    37.62 MiB | hist: 0.036 0.016 0.025 0.039 0.057 0.077 0.096 0.111 0.117 0.111 0.097 0.077 0.057 0.039 0.025 0.021 
[ 322/ 323]                   output_norm.weight - [ 5120,     1,     1,     1], type =    f32, size =    0.020 MB
[ 323/ 323]                        output.weight - [ 5120, 152064,     1,     1], type =    f16, quantizing to q6_K .. size =  1485.00 MiB ->   609.08 MiB | hist: 
llama_model_quantize_internal: model size  = 27023.93 MB
llama_model_quantize_internal: quant size  =  7794.73 MB
llama_model_quantize_internal: hist: 0.036 0.016 0.025 0.039 0.056 0.077 0.096 0.112 0.118 0.112 0.096 0.077 0.056 0.039 0.025 0.021 main: quantize time = 41580.08 ms
main:    total time = 41580.08 ms

执行完成之后,会在models/Qwen/14B/目录下生成ggml-model-Q4_0.gguf文件
ggml-model-Q4_0.gguf

部署推理量化模型

得到我们想要的INT4量化的模型后就可以部署推理了。llama.cpp项目编译生成的main可执行文件是推理的入口,可以直接在命令行运行main文件执行推理。同时,llama.cpp也提供了多个执行脚本,能够更方便进行推理。这里以examples/chat.sh为例,将chat.sh脚本内的./main的参数修改为如下,指定使用我们生成的量化模型的路径:

./main -m ./models/Qwen/14B/ggml-model-Q4_0.gguf -c 512 -b 1024 -n 256 --keep 48 \--repeat_penalty 1.0 --color -i \-r "User:" -f prompts/chat-with-bob.txt

然后在项目根目录命令行执行:

sh examples/chat.sh

回车执行后即可进入到聊天界面,现在可以和千问14B聊天了。
交互聊天

可以看出,千问的回答还是挺现实的哈哈哈。这里还有更多的聊天玩法,还可以部署成server形式,通过web界面来聊天,在这里不展开。
简单精度评测
光会聊天还不行,害得客观验证一下模型回答的质量。llama.cpp提供了perplexity可执行文件来验证模型的PPL精度,这里以wikitext语料来简单测试一下千问14B的性能(通义千问可能更偏向于中文,wikitext-2多数都是英文语料)。需要先下载解压wikitext-2到本地,这里解压到了llama.cpp/wikitext-2-raw/目录下,运行一下命令:

./perplexity -m models/Qwen/14B/ggml-model-Q4_0.gguf -f wikitext-2-raw/wiki.test.raw

在本地的4070上跑完测试大概需要26min左右,PPL为7.8242 +/- 0.05521,作为对比llama2-7B INT4量化版本的PPL大概为PPL = 7.8803 +/- 0.05373左右,千问14B并没有比llama2-7B提升太多,猜测可能是千问的训练数据英文较少的缘故还是我测试不当?希望知道的大佬指正。当然PPL只能作为一个参考,并不能全面地衡量模型的真正性能。
Qwen-14B-q4_0精度PPL
最后再增加一个INT8量化的对比结果:

Model / PPLINT4INT8
Qwen-14B7.8242 +/- 0.055217.6019 +/- 0.05281
llama7.8803 +/- 0.053737.6350 +/- 0.05166

到此,llama.cpp部署通义千问模型算是初步完成了,希望能帮助到需要的同学。

这篇关于llama.cpp部署通义千问Qwen-14B的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/517191

相关文章

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

nginx部署https网站的实现步骤(亲测)

《nginx部署https网站的实现步骤(亲测)》本文详细介绍了使用Nginx在保持与http服务兼容的情况下部署HTTPS,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录步骤 1:安装 Nginx步骤 2:获取 SSL 证书步骤 3:手动配置 Nginx步骤 4:测

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee