精选

【教程】CPU 本地部署和体验量化版大模型

球友们,大家好,我是程序员贺同学。


目前在互联网大厂搬砖,在搜狗/腾讯/字节都待过,业余时间也比较喜欢技术,爱钻研一些有趣的东西,平时也喜欢分享一些好玩的技术文章。


很久没有在星球里发帖了,很荣幸作为嘉宾能和大家一起分享和交流,最近以 ChatGPT、GPT-4等为代表的大语言模型(Large Language Model, LLM)掀起了新一轮自然语言处理领域的研究浪潮,展现出了类通用人工智能(AGI)的能力,受到业界广泛关注。然而,由于大语言模型的训练和部署都极为昂贵,为构建透明且开放的学术研究造成了一定的阻碍。


前两天我对这个 ChatGPT 本地化部署非常感兴趣,在某一天下班回来之后,一口气折腾到了凌晨 2 点,终于在自己的笔记本电脑上,跑通了,并且实现了本地部署和实时对话的效果。


这一次的搭建过程和部署更加节约成本,省去了购买云服务器的过程,球友们直接用自己的笔记本就可以搭建和部署!


主要基于中文预料的的模型和推理,对于很多想尝试自己部署的球友们来说,只要搭建过程参考我这个来,保持耐心,一步一步来,基本上就没问题,你也可以享受个性化部署的那种感觉,想想就很 cool 有没有!


那么,这两天抽空,这次毫无保留的分享和记录,我本地跑部署跑模型的过程,满满干货!话不多说,我们开始!



0x00 笔记本配置



我自己的笔记本 Mac 配置如下,如果大家也想用自己笔记本来搭建部署的话,建议笔记本内存不小于 24G,后面用到的很多模型和文件会相对会比较大。






0x01 模型下载



得益于开源的力量,本教程基于开源的 中文LLaMA模型和经过指令精调的 Alpaca 大模型。这些模型在原版LLaMA的基础上扩充了中文词表并使用了中文数据进行二次预训练,进一步提升了中文基础语义理解能力。


声明:本教程相关资源仅供学术研究使用。


本教程主要内容:

  1. 🚀 针对原版LLaMA模型下载提供下载链接
  2. 🚀 使用开源的中文文本数据预训练的中文LLaMA大模型(7B)
  3. 🚀 使用开源的进一步经过指令精调的中文Alpaca大模型(7B)
  4. 🚀 快速使用笔记本电脑(个人PC)的 CPU 本地部署和体验量化版大模型



用户须知(必读)



Facebook 官方发布的 LLaMA模型禁止商用,并且官方没有正式开源模型权重(虽然网上已经有很多第三方的下载地址,但如果是第一次玩,根本分不清楚那个是正版哪个是稳定版,很可能你好不容易下载了一个十几G的模型,结果本地不能跑)


提醒:网上开源的各种中文 LLaMA/Alpaca LoRA 模型无法单独使用,需要搭配原版 LLaMA 模型,可以理解为原LLaMA 模型上的一个“补丁”,两者进行合并即可获得完整版权重。


那么,这里我也直接把目前可以跑的原始 LLAMA 模型(本人已经验证)下载地址给到大家


  1. 原始 LLAMA 模型,正规渠道通过 facebook仓库 填表申请(可能周期会比较长)。这里提供个 BD云
  2. 中文 Chinese-Alpaca-7B 指令精调模型,简而言之就是给原始模型打个中文补丁,这里提供两个转存 [百度网盘] [Google Drive]


上面两个模型下载完解压,到本地,检查一下对于的原始目录结构是否 ok。如果和下面一样就是没问题的。



然后对模型进行一下 sha256 的检测。

Windows 系统执行命令

certutil -hashfile chinese_alpaca_lora_7b sha256

Mac 系统

shasum -a 256 chinese_alpaca_lora_7b


结果


SHA256 hash of chinese_alpaca_lora_7b.zip: 9bb5b639dc2ea9ad593268b5f6abf85514c7637bf10f2344eb7031fe0fce2d87




0x02 合并模型



在第一步里,两个模型下载解压应该在同一个目录里,如下



这里先推荐大家在 conda 虚拟环境里,执行相关的 Python 命令。


两个原因


1、conda 可以理解为一个工具,也是一个可执行命令,其核心功能是包管理和环境管理。包管理与 pip 的使用方法类似,环境管理则是允许用户方便滴安装不同版本的 Python 环境并在不同环境之间快速地切换。

2、conda 创建 Python 虚拟环境,比较灵活,安装文件可以避免影响主机的原版配置。


下载地址: https://www.anaconda.com/products/distribution#Downloads


根据你的笔记本系统下载对应的版本,下载之后。


然后在当前目录,在笔记本终端里,执行命令

conda create -n alpaca python=3.9
conda activate alpaca


进入 虚拟环境之后,不特殊说明,下面所有的命令都在 conda 的虚拟环境里执行

终端变成了类似这样(有个前缀 alpaca 的东东),就是虚拟环境了


(alpaca)  ⚙ root@C02GF2GQMD6R ~/Downloads/mini_model /~:


依次执行

pip install git+https://github.com/huggingface/transformers
pip install sentencepiece
pip install peft



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



点开这个链接 convert_llama_weights_to_hf.py  然后本地保存为同名的文件, 执行转化命令

PS:确保在 LLaMA 同级目录下,并且在 alpaca 虚拟环境


Mac 系统

python3 convert_llama_weights_to_hf.py --input_dir ./LLaMA --model_size 7B --output_dir ./llama_hf


Windows 系统(E:\\LLaMA 是你下载模型的位置,按实际情况填写)

python ./convert_llama_weights_to_hf.py --input_dir E:\\LLaMA --model_size 7B --output_dir ./llama_hf


如果出现报错


Traceback (most recent call last):


 File "/Users/herongwei/mini_model/convert_llama_weights_to_hf.py", line 21, in <module>


  import torch


ModuleNotFoundError: No module named 'torch'


执行命令  python3 -m pip install torch torchvision


生成文件被存放在 llama_hf 中,目录结构如下


│ convert_llama_weights_to_hf.py
└───llama_hf
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.model
tokenizer_config.json




将两个模型合并



点开链接 merge_llama_with_chinese_lora.py 下载保存同名文件,本地执行


Mac 系统

python3 merge_llama_with_chinese_lora.py --base_model ./llama_hf --lora_model ./chinese_alpaca_lora_7b --output_dir ./out


Windows 系统

python merge_llama_with_chinese_lora.py --base_model E:\\LLAMA\\llama_hf --lora_model ./chinese_alpaca_lora_7b --output_dir ./out


正确执行会生成

out:
consolidated.00.pth
params.json
special_tokens_map.json
tokenizer.model
tokenizer_config.json




0x03 量化模型



依旧在当前目录,新建文件夹 zh-models,将之前 Chinese-LLaMA-Alpaca文件夹中的 tokenizer.model 放入其中,然后在 zh-models 中建立 7B 文件夹(mkdir 命令新建目录),将上面合并生成的 consolidated.00.pthparams.json 放入其中,目录结构如下:


zh-models
│ tokenizer.model
└───7B
consolidated.00.pth
params.json


转化代码:convert-pth-to-ggml.py ,依旧是点击链接,复制到本地同名文件,执行命令,将其转化为 ggml。在 7B文件夹中生成 ggml-model-f16.bin


python convert-pth-to-ggml.py zh-models/7B/ 1


如果出现包报错


python3 convert-pth-to-ggml.py zh-models/7B/ 1


Traceback (most recent call last):


 File "/Users/herongwei/Downloads/mini_model/convert-pth-to-ggml.py", line 25, in <module>


  from sentencepiece import SentencePieceProcessor


ModuleNotFoundError: No module named 'sentencepiece'


安装  python3 -m pip install sentencepiece



接下来,我们需要对 FP16 模型进行 Q4 量化,这里需要用到 llama.cpp仓库,先对其克隆和编译

运行前请确保:

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


下载命令

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


如果是Windows 系统,cmake 环境。接着执行

cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
cmake --build build/ --config Release


可执行文件被生成在 llama.cpp\build\bin\Release 中。


如果是 Mac 系统

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

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


Windows 系统

需要quantize.exe,然后执行它

E:\LLAMA\llama.cpp\build\bin\Release\quantize.exe ./zh-models/7B/ggml-model-f16.bin ./zh-models/7B/ggml-model-q4_0.bin 2

Mac 系统

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


最终生成 ggml-model-q4_0.bin,也就是用来启动的模型文件了。可用参考这个 hash


Windows 系统

SHA256 hash of ggml-model-q4_0.bin

结果

399d858ec1e45f277c9a7c61a9cd7dbbed0aa2a357c92a6fd478b3c5bbf803e1
CertUtil: -hashfile command completed successfully.


Mac 系统,执行命令

shasum -a 256 ggml-model-q4_0.bin

结果

399d858ec1e45f277c9a7c61a9cd7dbbed0aa2a357c92a6fd478b3c5bbf803e1 ggml-model-q4_0.bin


如果你执行命令,也到了这一步,说明量化没问题!最后一步了,别着急,稳住!




0x04 使用




如果你是 Windows 系统,想在 win 上跑,就是执行 main.exe,在 llama.cpp 中执行make,将 main 编译出来,然后执行

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


如果是 Mac 系统

直接在 main 生成目录里执行

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

参数说明


-c 控制上下文的长度,值越大越能参考更长的对话历史

-ins 启动类ChatGPT的对话交流模式

-n 控制回复生成的最大长度

--repeat_penalty 控制生成回复中对重复文本的惩罚力度

--temp 温度系数,值越低回复的随机性越小,反之越大

--top_p, top_k 控制采样的相关参数

执行上面最后一步命令之后,你会看见,屏幕前会输出一大波东西。。。类似如下


main: seed = 1681144014
llama.cpp: loading model from ../zh-models/7B/ggml-model-q4_0.bin
llama_model_load_internal: format = ggjt v1 (latest)
llama_model_load_internal: n_vocab = 49954
llama_model_load_internal: n_ctx = 2048
llama_model_load_internal: n_embd = 4096
llama_model_load_internal: n_mult = 256
llama_model_load_internal: n_head = 32
llama_model_load_internal: n_layer = 32
llama_model_load_internal: n_rot = 128
llama_model_load_internal: f16 = 2
llama_model_load_internal: n_ff = 11008
llama_model_load_internal: n_parts = 1
llama_model_load_internal: model size = 7B
llama_model_load_internal: ggml ctx size = 59.11 KB
llama_model_load_internal: mem required = 5896.99 MB (+ 1026.00 MB per state)
llama_init_from_file: kv self size = 1024.00 MB

system_info: n_threads = 4 / 12 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | VSX = 0 |
main: interactive mode on.
Reverse prompt: '### Instruction:

'
sampling: temp = 0.200000, top_k = 40, top_p = 0.950000, repeat_last_n = 64, repeat_penalty = 1.300000
generate: n_ctx = 2048, n_batch = 8, n_predict = 256, n_keep = 21


== Running in interactive mode. ==
- Press Ctrl+C to interject at any time.
- Press Return to return control to LLaMa.
- If you want to submit another line, end your input in '\'.

Below is an instruction that describes a task. Write a response that appropriately completes the request.


等稳定之后,出现一个 > 输入框,说明,大功告成啦!!!!你可以直接和模型对话了!!!开始毫无忌惮的的玩耍吧!


以后会不定期输出一些大家感兴趣的好玩有趣的技术内容。大家对后端,AI 领域啥方面的技术感兴趣,或者有啥问题可以找我 hh。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
作者分享
#资源# #分享# 微信读书 得到电子书会员能覆盖很多书,找不到的,可以看下下面两个网站 https://zh.z-library.se/ https://zh.annas-archive.org/
22
#资源,好久没有在星球里给大家分享了,最近半年在忙自己的一个大事情,没怎么冒泡(无辜脸.jpg),趁五一假期的小尾巴,给大家分享一个很牛的知识库网站,包括编程语言、算法与软件架构、Web 与大前端、服务端开发、运维与高可用、云与分布式基础架构、人工智能与深度学习等等。 看界面还有完整的技术 & 产品 & 商业知识体系等知识,大家可以收藏学起来! https://ng-tech.icu/ #分享# #经验#
46
#职场# #经验# 隔壁星球小伙伴分享的,觉得写得不错,在分享一下给大家 《对职场的十点建议》 假如您的孩子大学毕业,初入社会,只允许您传授10条经验给他,您会说什么?对于很多像我一样农村出来的穷二代,父母面朝黄士背朝天供养我上大学和维持基本的生活已经拼尽全力,很多经验都需要自己付出实际的代价去获取,太昂贵。没有高人指点,自己悟性又一般,希望您能不音赐教。谢谢您的时间 排序不分先后。 第一是要用心。做什么事情都要用心。同样做一件事情,花不花心思,结果差很多。要么不做,要做就用心做好 第二要受得了委屈。工作不是在家里。想干就干,不想干就不干。稍微被说几句就服负气的玻璃心的人不适合工作,还是在家里呆着吧应该也没有什么成就 第三勤奋。天赋都差不多的情况下。比的就是谁更勤奋更努力。整体而言勤奋努力的运气就会更好一点。 第四就是,做杂事。下闲子,有用没用的事情都做做,整天只做有用的事情。也会错过那些现在看没什么用,但以后可能会很有用的事。 第五就是。多见人,什么人都聊聊,见见。机会更多。别一个人呆自己的世界里闷着,总拿自己的世界观去看这个世界。眼界只会越来越小 第六就是学会扛责任,遇到事情别推责任,错了就是错了,别找理由借口。 第七,别耍小聪明,耍滑头,一眼就看出来的聪明都是小聪明,挑肥拣瘦,偷工减料,损公肥私都是小聪明。时间久了,谁是谁,大多数人都一清二楚,没必要装。 第八,!学会辨别好人坏人,然后选择跟好人一起,离开坏人。所谓好坏未必是违法乱纪更多是没责任心,喜欢蹭你便宜,出了事,责任都推给你,好处都自己占的人,有这种领导赶紧离开 第九,尽量选择自己喜欢的行业,每天问问自己,喜欢什么擅长什么,把自己的长处做到极致,扬长避短能事半功倍 第十,做个好人,做个对世界抱有善意的人积极乐观的看待世界。这个世界永远都会存在各种问题,无论你悲观还是绝望,都依然存在乐观,悲观都改变不了世界,但是乐观能让你走的更远。悲观只会被抛弃。别做悲观的人也远离悲观的人。(校长语)
40
职场分享:PDCA 模型
37
#经验# #职场# 《混大厂,如何找到自己的生态位》 这两天前老板来深圳出差,一起吃了饭聊聊天,聊到一个话题,职场生态位, 大家也知道,现在大厂晋升也是越来越卷了,一方面是组织架构庞大,在降本增效的大目标下每个人要多做更多的活,但其实同质化也很严重,另一个方面,晋升考核越来越严格 职场生态位:指自己在职场生态当中所占据的位置,尤其是为关键岗位提供核心价值的位置。只有抢占了职场生态位,我们的地位才会最稳固,职位晋升才能最快,个人能力获得最大的提高。当然了,也能轻而易举地收获最多的Money。 在团队里面,你能解决问题,提供成果,或者能提供通往业务目标的方向/方法/捷径,替别人替组织赢得一个生存空间,在生态位上有自己的护城河,你就占据很大的优势。 举个例子,我们常见的,酒店前台,外卖小哥、快递员等等这类靠出卖苦力,没有特别技术含量的职位,就处于职场生态位的比较低端的位置,而且随时有被取代的可能。 而工程师、医生、律师、财务、高级管理人才等技术工种,这些随着经验积累,越来越值钱的职业,就处于职场上比较高端的生态位。 当然这里没有任何歧视岗位的意思,只是做一个对比,毕竟,几十年的工作经验很难被取代。 如果你已经在职场上抢占了不错的生态位,那么恭喜,把眼下工作好好做,就能提交一份满意的人生成绩单 微信公众号平台 18 年以后新注册的默认都没有留言功能,其实类比任何行业,早就是优势,比如社群,平台,人脉链接,早点抓住机会,抓住生态位,抱住大佬,靠近大佬,早点付费进群,抓住身边大佬的生态位,就比晚来的人占据极大的优势 那么,普通人如何找到自己的生态位? 《https://wx.zsxq.com/mweb/views/weread/search.html?keyword=精进3》的作者采铜老师说:找到生态位很难,创造生态位却很简单。关键点只有三个字:被需要。  这个点怎么理解,比如说我们组的例子,因为最早和我同级的一个小伙伴呢,他来的最早,他可能大二就开始来这边实习了。 就现在他基本上在组里面工作时间最长的,而且对整个我们这趟业务刚做起来的时候,他是最原始的几个人之一,所以说他现在对整个业务的这个了解熟悉程度,上下游链路,包括和其他团队合作模式都比我们后来的人都要清楚,那么他就能做一个小组长的管理,有带人的经验,这样晋升机会就比别人大很多。 那么说回来,如果说你在一个新团队里面,可能是后面来的人,或者说刚加入不久的。那么如果你要找到自己的生态位的话,有几个建议 首先第一个就是说在这个团队中,你要找到自己熟悉的项目,或者感兴趣的项目,或者说要抢到一个很好的活,然后在这个周期中把这个活做好,做得出色,让领导满意,而且是被领导所关心的问题,把领导关心的问题解决好,自然而然领导就关注到你,机会就多了 另外一个你要就是跟一些合作方去聊,或者说一些历史的一些遗留问题去梳理啊,找到一些解决方案,然后呢把这个事一步步推进去,做一些优化之类的,能够改善我们现在已有系统的性能,这个你也可以做一个就是前期的一个技术积累,去做一个优化的一个方向积累,这样也能形成自己的壁垒。 另外还有就是除了把工作做好,如何把工作成果汇报的好也是一个技能,反正在互联网公司混,能力是一方面,让别人如何看到你的能力,展示出来也是很重要的事情。 先聊这么多,大家加油💪
25
下载 APP