llama.cpp一种在本地CPU上部署的量化模型(超低配推理llama)

news2024/9/23 13:27:49

0x00 背景

前不久,Meta前脚发布完开源大语言模型LLaMA,

随后就被网友“泄漏”,直接放了一个磁力链接下载链接。

然而那些手头没有顶级显卡的朋友们,就只能看看而已了

但是 Georgi Gerganov 开源了一个项目llama.cpp

ggerganov/llama.cpp: Port of Facebook’s LLaMA model in C/C++ (github.com)

次项目的牛逼之处就是没有GPU也能跑LLaMA模型

大大降低的使用成本,本文就是时间如何在我的 mac m1 pro 上面跑起来这个模型

llama.cpp:提供了一种模型量化和在本地CPU上部署方式

文本介绍了如何使用llama.cpp工具将深度学习模型进行量化并在本地CPU上部署的详细步骤。

以下是具体步骤的解释:

ç

0x01 Step1 环境准备

  1. 高版本python 3.10
pip install protobuf==3.20.0
pip install transformers  最新版
pip installsentencepiece (0.1.97测试通过)
pip install peft  (0.2.0测试通过)
pip install git+https://github.com/huggingface/transformers
pip install sentencepiece
pip install peft
  1. 确保机器有足够的内存加载完整模型 ,7B模型需要13-15G

  2. 下载原版LLaMA模型的权重和tokenizer.model文件

下载参考这个[PR]https://github.com/facebookresearch/llama/pull/73/files

压缩包内文件目录如下(LLaMA-7B为例):

chinese_llama_lora_7b/
  - adapter_config.json		# LoRA权重配置文件
  - adapter_model.bin		# LoRA权重文件
  - special_tokens_map.json	# special_tokens_map文件
  - tokenizer_config.json	# tokenizer配置文件
  - tokenizer.model		# tokenizer文件 

Step 2: 将原版LLaMA模型转换为HF格式

请使用transformers提供的脚本convert_llama_weights_to_hf.py

将原版LLaMA模型转换为HuggingFace格式。

将原版LLaMA的tokenizer.model放在--input_dir指定的目录,其余文件放在${input_dir}/${model_size}下。 执行以下命令后,--output_dir中将存放转换好的HF版权重。

python src/transformers/models/llama/convert_llama_weights_to_hf.py \
    --input_dir path_to_original_llama_root_dir \
    --model_size 7B \
    --output_dir path_to_original_llama_hf_dir

image-20230423155757686

Step 2: 合并LoRA权重,生成全量模型权重

使用ymcui/Chinese-LLaMA-Alpaca at v2.0 (github.com)里面的scripts/merge_llama_with_chinese_lora.py脚本

对原版LLaMA模型(HF格式)扩充中文词表,并与LoRA权重进行合并,生成全量模型权重consolidated.*.pth(建议检查生成模型的SHA256值)和配置文件params.json。请执行以下命令:

此处可有两种选择:

  • 输出PyTorch版本权重(.pth文件),使用merge_llama_with_chinese_lora.py脚本
    • 使用llama.cpp工具进行量化和部署
  • 输出HuggingFace版本权重(.bin文件),使用merge_llama_with_chinese_lora_to_hf.py脚本(感谢@sgsdxzy 提供)
    • 使用Transformers进行推理
    • 使用text-generation-webui搭建界面

以上两个脚本所需参数一致,仅输出文件格式不同。下面以生成PyTorch版本权重为例,介绍相应的参数设置。

python scripts/merge_llama_with_chinese_lora.py \
    --base_model path_to_original_llama_hf_dir \
    --lora_model path_to_chinese_llama_or_alpaca_lora \
    --output_dir path_to_output_dir 

参数说明:

image-20230423160603607

我这里直接使用了Model Hub上的模型,因为很小就直接下载了使用,懒惰下载到本地

  • --base_model:存放HF格式的LLaMA模型权重和配置文件的目录(Step 1生成)
  • --lora_model:这就是你要合并的 LoRA模型 所在目录,也可使用Model Hub上的模型名:ziqingyang/chinese-alpaca-lora-7bziqingyang/chinese-llama-lora-7b
  • --output_dir:指定保存全量模型权重的目录,默认为./
  • (可选)--offload_dir:对于低内存用户需要指定一个offload缓存路径

Step 3: llama.cpp 本地快速部署

大模型在自己的电脑上进行本地部署(CPU推理)

下载llama.cpp工具https://github.com/ggerganov/llama.cpp

推荐使用MacOS和Linux系统,Windows好像有bug

运行前请确保:

  1. 模型量化过程需要将未量化模型全部载入内存,请确保有足够可用内存(7B版本需要13G以上)
  2. 加载使用Q4量化后的模型时(例如7B版本),确保本机可用内存大于4-6G(受上下文长度影响)
  3. 系统应有make(MacOS/Linux自带)或cmake(Windows需自行安装)编译工具
  4. 推荐使用Python 3.9或3.10编译运行llama.cpp工具(因为sentencepiece还不支持3.11)

1. 下载和编译llama.cpp

运行以下命令对llama.cpp项目进行编译,生成./main./quantize二进制文件。

git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp && make

2.生成量化版本模型

把合并模型(选择生成.pth格式模型)中最后一步生成的tokenizer.model文件放入xx-models目录下,模型文件consolidated.*.pth和配置文件params.json放入xx-models/7B目录下。

请注意LLaMA和Alpaca的tokenizer.model不可混用

目录结构类似:

   - 7B/
     - consolidated.00.pth
     - params.json
   - tokenizer.model

将上述.pth模型权重转换为ggml的FP16格式,生成文件路径为xx-models/7B/ggml-model-f16.bin

python3 ./llama.cpp/convert-pth-to-ggml.py ./xx_model/7B/ 1

image-20230423170929505

进一步对FP16模型进行Q4量化,生成量化模型文件路径为zh-models/7B/ggml-model-q4_0.bin

./quantize ./xx-models/7B/ggml-model-f16.bin ./xx-models/7B/ggml-model-q4_0.bin 2

image-20230423170909655

3.加载并启动模型

运行./main二进制文件,-m命令指定Q4量化模型(也可加载ggml-FP16的模型)。以下是解码参数示例:

./main -m xx-models/7B/ggml-model-q4_0.bin --color -f prompts/alpaca.txt -ins -c 2048 --temp 0.2 -n 256 --repeat_penalty 1.3

image-20230423171755989

在提示符 > 之后输入你的prompt,command+c中断输出,多行信息以\作为行尾。如需查看帮助和参数说明,请执行./main -h命令。

重要参数说明:
-ins 启动类ChatGPT的对话交流模式
-f 指定prompt模板,alpaca模型请加载prompts/alpaca.txt
-c 控制上下文的长度,值越大越能参考更长的对话历史
-n 控制回复生成的最大长度
--repeat_penalty 控制生成回复中对重复文本的惩罚力度
--temp 温度系数,值越低回复的随机性越小,反之越大
--top_p, top_k 控制采样的相关参数

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

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

相关文章

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master,一旦master出现故障,将导致整个集群无法使用,所以在实际的生产环境中,需要搭建HBase的高可用,也就是让HMaster高可用,也就是需要再选择一个或多个节点也…

【C语言】那些 “虾仁猪心“ 的坑题

本章介绍 最近翻笔记,整理了下那些日子里面掉过的坑题,说多都是泪!!也许是自己的储备知识不足,才造成的大坑,今天把题拿出来给大家溜溜,看大家做时候有没有踩坑! 文章目录 1:第一题2…

项目笔记-瑞吉外卖

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能:star4.1代码实现 5.退出功能6.页面效果出现 1.业务开发 day01 1.软件开发整体介绍 2.项目整体介绍⭐️ 后端:管理菜品和员工信息前台:通过手机端…

根据cadence设计图学习硬件知识 day03 了解 一些芯片 和 数据手册下载的地方

1. MT53D512M32D2DS 芯片(动态随机存取存储器)的技术指标 1.1 16n Prefetch (预加载) (n --芯片位宽) DDR 体系 链接:DDR扫盲—-关于Prefetch(预取)与Burst(突发)的深入讨论_ddr prefetch_qq_25814297-npl的博客-CSDN博客 1.2 每个通…

网络层重点协议之【IP协议】

0. IP地址组成 IP地址分为两个部分,网络号和主机号 网络号:标识网段,保证相互连接的两个网段具有不同的标识主机号:标识主机,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号 一…

浅谈: 计算机—JVM—线程

计算机存储模型(CPU、寄存器、高速缓存、内存、外存) 现代计算机系统CPU和内存之间其实是有一个cache的层级结构的。比内存速度更快的存储介质(SRAM),普通内存一般是DRAM,这种读写速度更快的介质充当CPU和内存之间的Cache,这就是缓存。当CPU…

医学图像分割之TransUNet

目录 一、背景 二、提出问题 三、解决问题 四、网络结构详解 CNN部分(ResNet50的前三层) transformer部分 U-Net的decoder部分 五、模型性能 开头处先说明下TransUNet的地位:它是第一个将transformer用于U型结构的网络。 一、背景 医…

【Java|golang】1105. 填充书架---动态规划

给定一个数组 books ,其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelfWidt…

PCL点云库(1) — 简介与数据类型

目录 1.1 简介 1.2 PCL安装 1.2.1 安装方法 1.2.2 测试程序 1.3 PCL数据类型 1.4 PCL中自定义point类型 1.4.1 增加自定义point的步骤 1.4.2 完整代码 1.1 简介 来源:PCL(点云库)_百度百科 PCL(Point Cloud Library&…

Vue组件间通信的7种方法(全)

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进…

6.4 一阶方程组与高阶方程的数值解法

学习目标: 学习一阶方程组与高阶方程的数值解法的目标可以分为以下几个方面: 掌握一阶方程组和高阶方程的基本概念和求解方法;理解数值解法的概念和原理,了解常见的数值解法;掌握欧拉方法、改进欧拉方法和龙格-库塔方…

Viu联合华为HMS生态,共创影音娱乐新体验

华为HMS生态携手流媒体平台Viu,为海外消费者打造精品移动娱乐应用体验,并助力提升流量变现能力。Viu在中东非、东南亚等16个国家及地区提供广告合作和付费会员服务,支持优质视频内容高清点播和直播。自2019年起,Viu在中东非区域与…

Windows下版本控制器(SVN)-TortoiseSVN使用

文章目录 基础知识-Windows下版本控制器(SVN)3.4 TortoiseSVN使用3.4.1 SVN检出(SVN Checkout)3.4.2 SVN更新(SVN Update)3.4.3 **SVN**提交(SVN Commit)3.4.4 **SVN**还原(SVN Revert)3.4.5 解决文件冲突3.4.6 授权访问3.4.7 **显示日志(Show log)**3.4.8 **版本库浏览(Repo-b…

Java项目上线之服务器环境配置篇(二)——Tomcat配置

Java项目上线之服务器环境配置篇(二)——Tomcat配置 Tomcat的选择: 云服务器tomcat的选择最好与本机项目运行的tomcat版本号一致,避免一些不必要的问题。 配置步骤: 1、首先进入云服务器创建好放置tomcat的文件夹。这…

台灯发光方式哪种好?分享好用侧发光的护眼台灯

台灯发光方式主要是侧发光、直发光方式。个人觉得侧发光的台灯会比较好。 侧发光灯主要利用导光板技术,根据led灯板灯珠的排布以及灯珠的发光角度进行导光板网点设计,使光线通过导光板达到亮度均匀化的效果。 而直发光灯以高亮度led为发光源&#xff0…

手势语言识别模型训练及应用

使用训练集训练模型,使模型能够识别不同手势。 OpenCV-Python环境使用训练集训练模型,使模型能够识别不同手势。系统测试 本项目基于卷积神经网络,通过Python的翻转功能沿垂直轴翻转每个图像,实现手势语言识别的功能。系统流程如图…

FL Studio21最新中文版安装包下载操作教程

FL Studio21是一款非常流行的数字音频工作站(DAW)软件,用于音乐制作、录音、调整和混音。它由Image-Line公司开发,前身叫FruityLoops,后改名为FL Studio。 FL Studio21的主要功能包括: 1. MIDI编序器:用于录入和编辑MIDI音序,控制软件乐器和外部硬件。 2. 虚拟乐器:提供各种模…

matrix部署

一、环境描述 首先matrix是一个去中心化的聊天服务,matrix实现了端对端的加密,这意味着不仅其他人无法查看你的聊天内容,哪怕你更换了一个终端,你也需要私钥才能够查看你的聊天记录。 这是终极的隐私保护方案,因为一旦…

【Python_Matplotlib学习笔记(二)】Matplotlib绘图嵌入PySide2图形界面

Matplotlib绘图嵌入PySide2图形界面 前言正文1、FigureCanvasQTAgg类介绍2、基于FigureCanvasQTAgg类实现Matplotlib绘图嵌入PySide2图形界面3、示例代码及实现效果 前言 在本文中主要介绍 如何基于 FigureCanvasQTAgg 类实现 Matplotlib 绘图嵌入 PySide2 图形界面。 正文 …

全栈工程师的职业前景及就业环境情况说明

本篇文章主要讲解全栈工程师的职业前景和就业趋势。 作者:任聪聪 日期:2023年4月20日 全栈工程师顾名思义就是会一个技术栈领域的所有客户端技术,如web全栈即前后端技术栈都会的工程师,如web、pc、app都会的则也是全栈&#xff08…