【AI】Chinese-LLaMA-Alpaca-2 7B llama.cpp 量化方法选择及推理速度测试 x86_64 RTX 2060 6G 显存太小了

news2024/11/15 10:49:36

环境

操作系统

CPU

内存

生成量化版本模型

 转换出q4_0 q4_k q6_k q8_0模型

cd ~/Downloads/ai/llama.cpp
sourvce venv/bin/activate
~/Downloads/ai/llama.cpp/quantize /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16.gguf /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_0.bin q4_0
~/Downloads/ai/llama.cpp/quantize /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16.gguf /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_k.bin q4_k
~/Downloads/ai/llama.cpp/quantize /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16.gguf /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q6_k.bin q6_k
~/Downloads/ai/llama.cpp/quantize /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16.gguf /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q8_0.bin q8_0

CPU版本测试

编译

make clean
make -j6

创建prompt.txt,内容太长,放到后面参考部分。

q4_0

./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_0.bin -f prompt.txt -c 2048 -ngl 1

q4_k

./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_k.bin -f prompt.txt -c 2048 -ngl 1

q6_k

./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q6_k.bin -f prompt.txt -c 2048 -ngl 1

q8_0

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q8_0.bin -f prompt.txt -c 2048 -ngl 1

GPU版本测试

编译

make clean
make LLAMA_CUBLAS=1 -j6

推理

q4_0  ngl 1

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_0.bin -f prompt.txt -c 2048 -ngl 1

q4_0  ngl 10

放更多的数据到显存

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_0.bin -f prompt.txt -c 2048 -ngl 1

q4_0  ngl 20

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_0.bin -f prompt.txt -c 2048 -ngl 20

q4_0  ngl 24

最高做到24个layer,继续放大参数,显存不足

与20个layer差异不大,后面都将采用20个layer做本次测试

q4_k  ngl 20

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q4_k.bin -f prompt.txt -c 2048 -ngl 20

q6_k ngl 20 加载不上(显存太低了)

q6_k ngl 16

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q6_k.bin -f prompt.txt -c 2048 -ngl 16

q8_0 ngl 13

time ./perplexity -m ~/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16-q8_0.bin -f prompt.txt -c 2048 -ngl 13

数据汇总(由于显存低,不严谨,取 eval time 的ms per token值)

q4_0q4_kq6_kq8_0
CPU11690.47110.13104.95
GPU

6.19(ngl=1)

4.50(ngl=10)

2.63(ngl=20)

2.68(ngl=24)

显存不足

2.73(ngl=20)3.99(ngl=16)4.51(ngl=13)

官方建议q6_k模型,精度与q8_0差不多,速度快。

CPU版本的ngl参数应该是无意义的。

chat.sh性能疑问

    7b q6_k模型,智能加载到14个layers,速度良好,约2秒就开始输出。观察GPU显示显存暂用到达极限,GPU负载不高(main根本就没消耗GPU算力),所有计算压力在CPU。

    签名的测试可以确认perplexity程序能够使用GPU算力极大提高推理速度,这个chat.sh封装了main程序,虽然可以看到显存占用,但是显卡负载一点都没变。问题在哪里?

重新编译CPU版本

响应速度慢了一大截,说明GPU还是起了很大作用,就是没搞明白GPU版本为什么显卡负载几乎没有。

再次分析GPU版本,调整参数 -t 1,参考下图

从这个观察看,CPU的负载降低到100%,交互速度没有任何影响,说明还是GPU在干活。CPU可能是在轮训GPU的数据导致负载高。

参考

【AI】D2000 arm64 aarch64 22.04.3 LTS (Jammy Jellyfish) 编译llama.cpp 使用chinese-alpaca-2-7b模型 CPU版本-CSDN博客

【AI】RTX2060 6G Ubuntu 22.04.1 LTS (Jammy Jellyfish) 部署Chinese-LLaMA-Alpaca-2 【2】启用GPU支持-CSDN博客

Wiki - Gitee.com

prompt.txt内容:

与LangChain进行集成
什么是LangChain?
LangChain是一个用于开发由LLM驱动的应用程序的框架,旨在帮助开发人员使用LLM构建端到端的应用程序。

借助LangChain提供的组件和接口,开发人员可以方便地设计与搭建诸如问答、摘要、聊天机器人、代码理解、信息提取等多种基于LLM能力的应用程序。

如何在LangChain中使用Chinese-Alpaca-2?
以下文档通过两个示例,分别介绍在LangChain中如何使用Chinese-Alpaca-2实现

检索式问答
摘要生成
例子中的超参、prompt模版均未调优,仅供演示参考用。关于LangChain的更详细的使用说明,请参见其官方文档。

准备工作
环境准备
pip install langchain
pip install sentence_transformers==2.2.2
pip install pydantic==1.10.8
pip install faiss-gpu==1.7.2
模型准备
下载完整版权重,或者参照模型合并与转换将LoRA权重与原版Llama-2合并得到完整版权重,并将模型保存至本地。

在检索式问答中,LangChain通过问句与文档内容的相似性匹配,来选取文档中与问句最相关的部分作为上下文,与问题组合生成LLM的输入。因此,需要准备一个合适的embedding model用于匹配过程中的文本/问题向量化。本文以GanymedeNil/text2vec-large-chinese为例进行说明(实际上,也可以根据实际需要选择其他合适的embedding model)。

检索式问答
该任务使用LLM完成针对特定文档的自动问答,流程包括:文本读取、文本分割、文本/问题向量化、文本-问题匹配、将匹配文本作为上下文和问题组合生成对应Prompt中作为LLM的输入、生成回答。

cd scripts/langchain
python langchain_qa.py \
  --embedding_path text2vec-large-chinese \
  --model_path chinese-alpaca-2-7b \
  --file_path doc.txt \
  --chain_type refine
参数说明:

--embedding_path: 下载至本地的embedding model所在目录(如text2vec-large-chinese)或HuggingFace模型名(如GanymedeNil/text2vec-large-chinese)
--model_path: 合并后的Alpaca模型所在目录
--file_path: 待进行检索与提问的文档
--chain_type: 可以为refine(默认)或stuff,为两种不同的chain,详细解释见这里。简单来说,stuff适用于较短的篇章,而refine适用于较长的篇章。
--gpu_id: 指定使用的GPU设备编号,默认为0。目前仅支持单GPU推理。
运行示例:

> python langchain_qa.py --embedding_path text2vec-large-chinese --model_path chinese-alpaca-2-7b --file_path doc.txt --chain_type refine
# 中间输出信息省略
> 请输入问题:李白的诗是什么风格?
> 李白的诗歌风格是浪漫主义。
摘要生成
该任务使用LLM完成给定文档的摘要生成,以帮助提炼文档中的核心信息。

cd scripts/langchain
python langchain_sum.py \
  --model_path chinese-alpaca-2-7b \
  --file_path doc.txt \
  --chain_type refine
参数说明:

--model_path: 合并后的Alpaca模型所在目录
--file_path: 待进行摘要的文档
--chain_type: 可以为refine(默认)或stuff,为两种不同的chain,详细解释见这里。简单来说,stuff适用于较短的篇章,而refine适用于较长的篇章。
--gpu_id: 指定使用的GPU设备编号,默认为0。目前仅支持单GPU推理。
运行示例:

> python langchain_sum.py --model_path chinese-alpaca-2-7b --file_path doc.txt
# 中间输出信息省略
> 李白(701年5月19日-762年11月30日),字太白,号青莲居士,唐代著名诗人。他在少年时代就展现出了非凡的才华,但由于缺乏正规教育,他放弃了学业并开始漫游生涯,以写作诗歌为主要职业。尽管经历了许多困难和挫折,他始终坚持自己的理想,努力追求卓越。在盛唐时期,他活跃于文学界,成为了当时最杰出的浪漫主义诗人之一。他的诗歌充满着想象力和创造力,经常使用夸张和比喻来表达深刻的思想感情。他的作品至今仍是中国古典文学的重要组成部分。

手动模型合并与转换
以下介绍了手动将LoRA与原版Llama-2合并得到完整模型的流程。如网络带宽充足,建议直接下载完整版模型。

准备工作
运行前确保拉取仓库最新版代码:git pull
确保机器有足够的内存加载完整模型(例如7B模型需要13-15G)以进行合并模型操作
安装依赖库(项目根目录requirements.txt):
$ pip install -r requirements.txt
Step 1: 获取原版Llama-2-hf模型
原版Llama-2-hf地址:https://huggingface.co/meta-llama/Llama-2-7b-hf

HF格式模型相关文件(可以不用下载safetensors格式模型权重):

config.json
generation_config.json
pytorch_model-00001-of-00002.bin
pytorch_model-00002-of-00002.bin
pytorch_model.bin.index.json
special_tokens_map.json
tokenizer_config.json
tokenizer.json
tokenizer.model
Step 2: 合并LoRA权重,生成全量模型权重
这一步骤会合并LoRA权重,生成全量模型权重。此处可以选择输出PyTorch版本权重(.pth文件)或者输出HuggingFace版本权重(.bin文件)。执行以下命令:

$ python scripts/merge_llama2_with_chinese_lora_low_mem.py \
    --base_model path_to_original_llama2_hf_dir \
    --lora_model path_to_chinese_llama2_or_alpaca2_lora \
    --output_type huggingface \
    --output_dir path_to_output_dir 
参数说明:

--base_model:存放HF格式的Llama-2模型权重和配置文件的目录
--lora_model:中文LLaMA-2/Alpaca-2 LoRA解压后文件所在目录,也可使用🤗Model Hub模型调用名称(会自动下载)
--output_type:指定输出格式,可为pth或huggingface。若不指定,默认为huggingface
--output_dir:指定保存全量模型权重的目录,默认为./

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mapstruct自定义转换,怎样将String转化为List

源码&#xff1a;https://gitee.com/cao_wen_bin/test 最近在公司遇到了这样一个为题&#xff0c;前端传过来的是一个List<Manager>,往数据库中保存到时候是String&#xff0c;这个String使用谷歌的json转化器。 当查询的时候在将这个数据库中String的数据以List<Mana…

Leetcode—29. 两数相除【中等】

2023每日刷题&#xff08;九十四&#xff09; Leetcode—29. 两数相除 叛逆期实现代码 class Solution { public:int divide(int dividend, int divisor) {if(dividend INT_MIN && divisor -1) {return INT_MAX;} return dividend / divisor;} };运行结果 倍增算法…

牛客NC222104重排字符串(C++)

题目链接 实现方法 统计各字符出现的次数&#xff1b;判断是否能实现重排&#xff08;根据出现次数最多的字符数量ma和字符总长度n判断&#xff09;&#xff1b;依次输出出现次数最多的两个字符&#xff0c;直到出现次数最多的字符和次多的字符数量相同&#xff1b;依次输出…

代码随想录算法训练营第30天 | 回溯总结 + 3道Hard题目

今日任务 332.重新安排行程 51. N皇后 37. 解数独 总结 总结 回溯总结&#xff1a;代码随想录 回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#xff0c;因为这两种方式都是用了递归。 …

redis排序

文章目录 简介SORT命令的实现ALPHA选项的实现ASC和DESCBYLIMITGET命令 类似映射STORE选项的实现多个命令的执行顺序 简介 Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。 SORT命令的实现 服务器执行SORT numbers 命令的详细步骤如下&#xff1a; 1&#…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

DevSecOps 参考模型介绍

目录 一、参考模型概述 1.1 概述 二、参考模型分类 2.1 DevOps 组织型模型 2.1.1 DevOps 关键特性 2.1.1.1 模型特性图 2.1.1.2 特性讲解 2.1.1.2.1 自动化 2.1.1.2.2 多边协作 2.1.1.2.3 持续集成 2.1.1.2.4 配置管理 2.1.2 DevOps 生命周期 2.1.2.1 研发过程划分…

SqlAlchemy使用教程(六) -- ORM 表间关系的定义与CRUD操作

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 本章内容&#xff0c;稍微有…

七种较为成熟的渗透测试标准方法

文章目录 前言一、OWASP渗透测试二、渗透测试执行标准(PTES)三、NIST特别出版物800-115四、ISSAF渗透测试框架五、CREST渗透测试方法六、MITRE(ATT&CK)七、OSSTMM开源安全测试方法总结前言 对于网络安全领域的攻击端, 进行渗透测试的方式几乎是无限多的。由于在进行渗…

AI:120-智能监控下的行人交通违法行为自动罚款系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

LFU算法

LFU算法 Least Frequently Used&#xff08;最不频繁使用&#xff09; Leetcode有原题&#xff0c;之前手写过LRU&#xff0c;数据结构还是习惯于用java实现&#xff0c;实现是copy的评论题解。 题解注释写的很清楚 大致就是说LFUCache类维护一个存放node的map&#xff0c;同…

jmeter之接口测试实现参数化(利用函数助手),参数值为1-9(自增的数字)

1.前言 思考&#xff1a;为什么不用postman&#xff0c;用postman的话就得导入csv文件/json文件 如果不想导入文件&#xff0c;postman是实现不了&#xff0c;因为postman每次只会运行一次 2.jmeter函数助手实现参数化 &#xff08;1&#xff09;新建“线程组”--新建“http…

MySQL-删除重复数据

在实际应用中&#xff0c;遇到一个这样的问题&#xff0c;MySQL中存储的数据为资讯类数据&#xff0c;在页面展示时会出现多个平台的新闻报导相同的内容&#xff0c;导致页面会出现重复数据。因为数据是每天定期更新&#xff0c;所以最快捷有效的方式是在更新完数据后增加一个去…

计算机网络-奈氏准则和香农定理(码间串扰 二者区别)

文章目录 失真失真的一种现象-码间串扰奈氏准则&#xff08;奈溃斯特定理&#xff09;例题 香农定理例题 奈氏和香农 失真 就是指与原来的不一样了 两种情况 前三个是正相关&#xff0c;最后一个是负相关 码元传输速率越快&#xff0c;失真程度越严重的原因可能包括以下几点…

世强硬创获凌讯微电子授权代理,助力功率半导体核心器件国产替代

近年来&#xff0c;国产功率半导体已在众多领域应用&#xff0c;特别是中高端产品&#xff0c;如超结MOSFET、IGBT、碳化硅等&#xff0c;市场逐渐从依赖进口向国内自给自足转变。 为服务更多硬科技企业实现国产化替代&#xff0c;功率半导体器件制造商广东凌讯微电子有限公司…

【Go 快速入门】安装 Go 语言 | 开发工具 Goland | 第一个 Go 语言程序

文章目录 前言安装 Go 语言编译器 Goland运行 Go 程序补充 前言 本系列教程&#xff0c;目的是帮助一个有其他编程基础的 Go 语言小白快速入门 Go 语言&#xff0c;而非启发式学习。每篇幅保证不说废话&#xff0c;尽可能精炼总结&#xff0c;为上手后续的 Go 相关项目打下基础…

渲染与创造之美:互为表里的艺术

在五彩斑斓的艺术世界中&#xff0c;渲染与创造是两股不可或缺的力量。它们之间的关系&#xff0c;恰如弓与箭&#xff0c;互为表里&#xff0c;共同塑造出无数令人叹为观止的视觉景象。创造之美是指通过创新思维和创造力&#xff0c;将想象具象化为现实&#xff0c;创造出新的…

Spyder安装与使用

Spyder是一个Python的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由科学家、工程师和数据分析师设计。它提供了强大的编辑、调试和分析功能&#xff0c;以及数据探索和可视化工具&#xff0c;特别适合科学计算和数据分析。 Spyder的主要特点包括&#xff1a; 编辑器…

仿双色球抽奖大转盘

仿双色球抽奖大转盘 前言1、页面搭建2、JS逻辑编写3、Css样式编写4、编译发布5、往期回顾总结&#xff1a; 前言 需求来时奋笔疾书&#xff0c;需求变时追风逐电 &#xff01; 年低了&#xff0c;接到部门需求&#xff0c;2天时间要开发一个仿双色球抽奖大转盘&#xff0c;于是…

malloc()和free()

一、malloc() //格式&#xff1a; void *malloc(size_t str);//举例 double *ptd; ptd (double *) malloc(30*sizeof(double));//30个double类型的值请求内存空间 //并设置ptd指向该位置 malloc函数会找到合适的空闲内存块&#xff0c;这样的内存是匿名的。也就是说&#xff…