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部署通义千问模型算是初步完成了,希望能帮助到需要的同学。后续还有很多可以做的,需要更深度的学习探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用postman请求x5接口

x5接口简介 1.接口样例 {"header"{"appid":"bpmnew_fanwei","sign":"C033162E86E4CADE80C7EB44D68A5AD2","sign_type":"md5","url":"https://oa.mioffice.cn/api/bpm/xm/app/show/tod…

Java线程安全问题

一、共享资源 共享资源是指,同时会有多个线程访问的资源。 二、线程安全问题 线程安全问题是指多个线程同时读写共享资源时并且没有任何同步措施的情况下,出现脏数据或者其他不可预见的结果的问题。当然如果所有线程都只是读取共享资源而不去修改共享…

LTO编译器优化介绍以及开启方法

文章目录 LTO介绍LTO 开启方法 LTO介绍 LTO(Link Time Optimization,链接时优化)是一种在链接阶段进行优化的技术。传统的编译过程中,编译器仅能对单个编译单元进行优化。LTO 允许编译器看到跨编译单元的代码,从而进行…

实战案例:chatglm3 基础模型多轮对话微调

chatglm3 发布了,这次还发了base版本的模型,意味着我们可以基于这个base模型去自由地做SFT了。 本项目实现了基于base模型的SFT。 base模型 https://huggingface.co/THUDM/chatglm3-6b-base由于模型较大,建议离线下载后放在代码目录&#…

OpenTelemetry系列 - 第2篇 Java端接入OpenTelemetry

目录 一、架构说明二、方式1 - 自动化2.1 opentelemetry-javaagent.jar(Java8 )2.2 使用opentelemetry-javaagent.jar完成自动注入2.3 配置opentelemetry-javaagent.jar2.4 使用注解(WithSpan, SpanAttribute)2.5.1 代码集成WithS…

智能诊疗体验:整合AI技术的互联网医院小程序开发

在科技化的趋势下,互联网医院小程序的开发变得愈发重要,尤其是通过整合人工智能(AI)技术,进一步提升了就医的效率。 一、引言 互联网医院小程序其开发目标是提高医疗服务的效率,同时也也提升了用户的就医…

【读书笔记】微习惯

周日晚上尝试速读一本书《微习惯》,共七章看了下目录结构并不复杂,计划每章7-8分钟读完, 从20:15-21:00。读的时候,订下闹钟,催促着自己的进度。边读边记了一些要点和微信读书里面的划线。 第六章实践内容最为丰富&…

Ubuntu中安装IDEA,并配置桌面快捷方式

1、首先自己下载linux版本的idea 这一步省略不说了 2、在/usr/local/路径下新建安装目录IDEA: mkdir -p /usr/local/IDEA3、执行如下命令,解压下载的压缩包到指定目录: tar -zxvf ideaIU-2022.3.3.tar.gz -C /usr/local/IDEA 注意&#x…

蓝桥杯每日一题2023.12.3

题目描述 1.移动距离 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题需要对行列的关系进行一定的探究,所求实际上为曼哈顿距离,只需要两个行列的绝对值想加即可,预处理使下标从0开始可以更加明确之间的关系,奇数行时这一行的数字需…

Proteus仿真--基于ADC0832设计的两路电压表

本文介绍基于ADC0832实现的双路电压表采集设计(完整仿真源文件及代码见文末链接) 仿真图如下 采集芯片选用ADC0832,电压显示在LCD1602液晶显示屏上 仿真运行视频 Proteus仿真--基于ADC0832设计的两路电压表 附完整Proteus仿真资料代码资料…

代理模式介绍(静态代理、jdk动态代理、cglib代理)

一、静态代理 (一)定义 1、定义 为其他对象提供一种代理以控制对这个对象的访问; 2、涉及到的角色 (1)抽象主题角色:真实主题和代理主题的共同接口,便于在使用真实主题的地方都可以使用代理…

p标签在div中居中

新建一个html文件,命名为test.html,用于讲解如何在css中让div中的p标签居中。 在test.html文件内,在div内,使用p标签创建一行文字,用于测试。 在test.html文件内,设置div标签的class属性为mydiv。 在…

HttpRunner自动化工具之实现参数化传递

参数化实现及重复执行 参数化测试:在接口测试中,为了实现不同组数据对同一个功能模块进行测试,需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化: 1、在YAML/JSON 中直接指定参数列表 2、…

Qt OpenCV 学习(一):环境搭建

对应版本 Qt 5.15.2OpenCV 3.4.9MinGW 8.1.0 32-bit 1. OpenCV 下载 确保安装 Qt 时勾选了 MinGW 编译器 本文使用 MinGW 编译好的 OpenCV 库,无需自行编译 确保下载的 MinGW 和上述安装 Qt 时勾选的 MinGW 编译器位数一致,此处均为 x86/32-bit下载地址…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(3)路由导航卫士、主页实现

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、sp…

LeetCode | 101. 对称二叉树

LeetCode | 101. 对称二叉树 OJ链接 在本函数里不好进行判断,我们另外定义一个函数来如果两个都相等为空,就返回true一个为空,一个不为空都不为空,就比较值然后递归1的左,2的右,1的右,2的左 bool _isSymm…

Gateway网关--java

网关是建立于请求到服务之前的,可以用网关限制访问量,添加过滤等 创建网关模块,引入相关pome依赖 配置yml 具体相关的作用可以参考 Spring Cloud Gateway 这样就可以了 基础的网关配置,我们的实现效果 我们可以通过10010端口访问,通过转发到nacos,再找到相应的模块,实现…

54.多级缓存

目录 一、传统缓存的问题、多级缓存方案。 二、JVM进程缓存。 1)进程缓存和缓存。 2)导入商品案例。 1.安装MySQL 2.导入SQL 3.导入Demo工程 4.导入商品查询页面 3)初识Caffeine(就是在springboot学过的注解方式的cache&…

掌握视频剪辑技巧:批量置入视频封面,提升视频品质

在当今数字化时代,视频已成为生活的重要组成部分。无论是观看电影、电视剧、综艺节目,还是分享个人生活、工作成果,视频都以其独特的魅力吸引着大众的视线。视频封面是视频内容的缩影,是观众对视频的第一印象。一个好的封面能吸引…

【计算机组成原理】存储器知识

目录 1、存储器分类 1.1、按存储介质分类 1.2、按存取方式分类 1.3、按信息的可改写性分类 1.4、按信息的可保存性分类 1.5、按功能和存取速度分类 2、存储器技术指标 2.1、存储容量 2.2、存取速度 3、存储系统层次结构 4、主存的基本结构 5、主存中数据的存放 5.…