参加了个比赛需要调用语言模型对输入文本进行提取与推理,就找到了目前开源的nlp中表现非常出色的llama二次训练增加中文词表后端的alpaca模型(项目开源地址)。网上的教程大部分都是对7B的模型,以及官网给的教程我本地跑环境的时候也有问题,这里就浅浅记录一下大概流程。
一、下载模型
从这个地址下载llama-alpaca-13B模型文件。
项目的模型文件需要分开下载,llama要专门到meta下载,之后整合。但这个链接里是整合后的alpaca-13B模型,就可以省略整合的步骤。
二、整合模型
下载好模型之后,使用官方提供的llama.cpp工具包量化模型。
1 2
| git clone https://github.com/ggerganov/llama.cpp cd llama.cpp
|
下载好后,windows还需要下载W64devkit去编译这个文件。
1 2
| cmake . -G "MinGW Makefiles" cmake --build . --config Release
|

编译好后会生成一些可执行文件在这里。

1
| F:/test/ap/test/llama.cpp $ python3 -m pip install -r requirements.txt
|
这里下载一些依赖的环境。
这之后就可以加载模型了。先在llama.cpp文件夹里面创建文件夹zh-model/13B/,把所有的刚刚从llama-alpaca-13B模型文件(包括配置文件)全都拷贝进去。但是tockenizer.model放外面。

之后回到llama.cpp目录,执行下面这个指令。这个指令用来整合刚刚由于大小问题分割的三个.bin文件,默认生成一个ggml-model-f16.gguf文件(整合后的模型文件,大概24个G)
1
| F:/test/ap/test/llama.cpp $ python3 convert.py zh-model/13B/
|
w64devkit终端会一直跑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| [ 1/363] Writing tensor token_embd.weight | size 55296 x 5120 | type F16 | T+ 9 [ 2/363] Writing tensor blk.0.attn_q.weight | size 5120 x 5120 | type F16 | T+ 27 [ 3/363] Writing tensor blk.0.attn_k.weight | size 5120 x 5120 | type F16 | T+ 28 [ 4/363] Writing tensor blk.0.attn_v.weight | size 5120 x 5120 | type F16 | T+ 29 [ 5/363] Writing tensor blk.0.attn_output.weight | size 5120 x 5120 | type F16 | T+ 30 [ 6/363] Writing tensor blk.0.ffn_gate.weight | size 13824 x 5120 | type F16 | T+ 32 [ 7/363] Writing tensor blk.0.ffn_up.weight | size 13824 x 5120 | type F16 | T+ 36 [ 8/363] Writing tensor blk.0.ffn_down.weight | size 5120 x 13824 | type F16 | T+ 41 [ 9/363] Writing tensor blk.0.attn_norm.weight | size 5120 | type F32 | T+ 46 [ 10/363] Writing tensor blk.0.ffn_norm.weight | size 5120 | type F32 | T+ 46 [ 11/363] Writing tensor blk.1.attn_q.weight | size 5120 x 5120 | type F16 | T+ 46 [ 12/363] Writing tensor blk.1.attn_k.weight | size 5120 x 5120 | type F16 | T+ 48 [ 13/363] Writing tensor blk.1.attn_v.weight | size 5120 x 5120 | type F16 | T+ 50 [ 14/363] Writing tensor blk.1.attn_output.weight | size 5120 x 5120 | type F16 | T+ 52 [ 15/363] Writing tensor blk.1.ffn_gate.weight | size 13824 x 5120 | type F16 | T+ 54 [ 16/363] Writing tensor blk.1.ffn_up.weight | size 13824 x 5120 | type F16 | T+ 57 [ 17/363] Writing tensor blk.1.ffn_down.weight | size 5120 x 13824 | type F16 | T+ 61
|
等他刷完,就整合好模型了。
到这一步其实就可以去使用这个整合好后的alpaca模型去做任务分析了。但是我自己电脑配置不是很好,直接跑能跑一个世纪,就对这个模型做了一下4bit量化,不需要的话可以直接跳过。
三、量化模型
量化这里遇到了个坑,github给的教程是让输入这个指令。但是整合模型生成的文件后缀名是gguf,量化模型生成的文件后缀名也是gguf,官网给的bin。直接输入下面这个指令会报错: failed to quantize: basic_ios::clear: iostream error
1
| F:/test/ap/test/llama.cpp $ ./bin/quantize ./zh-model/13B/ggml-model-f16.gguf ./zh-models/13B/ggml-model-q4_0.bin q4_0
|
解决方法也很简答,输入这个指令,不去指定量化后文件的类型就好了。量化模型文件会默认放在/zh-model/13B/这里
1
| F:/test/ap/test/llama.cpp $ ./bin/quantize ./zh-model/13B/ggml-model-f16.gguf q4_0
|
四、运行
1
| ./bin/main -m zh-model/13B/ggml-model-Q4_0.gguf --color -f prompts/alpaca.txt -ins -c 2048 --temp 0.2 -n 256 --repeat_penalty 1.1
|
就可以跑了
运行结果如下:

完结撒花!
五、本地server使用api调用alpaca
本来以为会很困难,但是看了一下llama.cpp的文档,发现提供了server.exe启动在本地服务器中。具体操作如下:
1
| ./server.exe -m ./zh-model/13B/ggml-model-Q4_0.gguf -c 2048
|
w64终端输入这个指令,项目重建了一下,所以不需要再进bin目录找可执行文件。官方也给了其他很多参数可以选择,包括CPU权重,上下文什么的,要求不高只需要使用的话简单执行这个代码就好。

终端加载完模型后,会提示端口和IP地址(当然是本地了),然后可以到浏览器http://ip:port直接打开图形界面如下,输入聊天内容就可以正常对话啦。

既然可以这样调用,那么一定可以api调用,这里就浅放一下apifox的测试:

到这里,这个模型放在比赛项目里已经可以正常使用了。时间允许的话会尝试再训练一下模型,如果….毕竟还没有看llama的论文。
六、问题总结
在这个之前的一些python conda什么的就没有再去写了,这个环境官网也有给,网上也有教程。比较坑的是,要注意编译llama.cpp生成的可执行文件的位置,网上教程生成的文件位置和我编译出来的位置不一样,要自己修改路径。以及网上教程什么的生成的模型文件都是.bin,可能因为我在做的是13B,网上的都是7B ?我这边生成的模型文件都是.gguf文件。所以后面会遇到这种文件类型不同报错的问题。
最后4bit量化后的运行速度感觉还能接受,8核cpu电脑100%左右利用率大概三十秒能够刷出来回复,使用下来的体验也和gpt-3,星火之类的差不多,但这只是13B。还有33B和70B配置问题没有选择去用。真的是感觉是开源nlp里非常顶尖的了,有时间去看一下llama的论文,以上。