ChatGPT已经火了一年多了,今年支持视觉和语音的GPT-4更是引领了AI研究和应用的新热潮,有没有想过在本地机器上布置一个AI助手玩玩?大模型通常都需要使用GPU来进行推理,我没有独立显卡,只有一台龙芯3A6000 CPU能不能跑大模型?
最近千问推出了参数量为 18 亿的模型:Qwen 1.8B,实测效果还可以,使用量化和推理加速之后在3A6000上达到了勉强可以接受的推理速度,下面简单介绍一下这次尝试的流程。
千问的模型公布于国内的Modelscope平台,访问下载不成问题。[通义千问-1_8B-Chat · 模型库 (modelscope.cn)](https://modelscope.cn/models/qwen/Qwen-1_8B-Chat/summary)
可以挨个文件下载,或者使用git lfs下载。git lfs工具不在Loongnix的软件源里面,需要自己编译安装,所以还是推荐直接手动把所有文件挨个下载(assets文件夹没有用,不用下载)。
下载好的模型放到一个文件夹里,比如起名为Qwen-1_8B-Chat。
Loongnix 20.5源里的cmake版本有些老,不能正常编译千问推理工具,所以要我们自己编译安装一个cmake。
在一个临时目录里面下载cmake源码并解压:
现在已经在cmake的源码目录中了,按下面的步骤编译安装。<用户名>替换为你的用户名。
安装完成后,系统暂时还没更新cmake文件的位置,手动帮它更新一下:
显示 'cmake version 3.27.9' 就是成功了。
为了编译依赖包(python包tiktoken安装时需要编译),要先安装rust编译器。注意!rust编译器不要用源里面的rustc,版本很低,无法正常编译。需要去龙芯官网下载loongarch版的tar包自己安装(loongnix系统目前需要安装龙芯官网的abi1.0版本,如果安装的是rust官网的abi2.0版本是没法运行的)
如果输出类似 rustc 1.73.0 (9009755c7 2023-10-08)
则表示安装成功了。
如果python版本不是3.8,需要根据之前的文章安装python 3.8.
新建一个虚拟环境(名为 qwen-show,可以随便起),并激活。注意这个命令会在当前目录新建一个名为qwen-show的文件夹,里面存储虚拟环境的运行文件。所以运行前需要切换目录,切换当前目录为一个你认为适合存放这个文件夹的目录(如~/python_env/),再运行下面的命令。
如果命令提示符前面出现了(qwen-show)字样就是激活成功了。接下来安装所需的python包:
要等好一会,因为过程中会编译tiktoken包。(过程中大部分时间CPU占用不是很高,感觉这个版本的Rust编译器或许有什么bug,导致编译时长特别久)
想要关闭这个Python环境的话,直接输入
我们使用 qwen.cpp 进行模型推理。下载地址为为 (https://github.com/QwenLM/qwen.cpp)
进入qwen.cpp目录,如果没有激活前面安装的python环境,就手动激活一下:
此时,我们要先将模型转换为推理工具qwen.cpp可以运行的格式(转换1.8B模型,运行时内存大概需要9GB,不建议使用7B模型,转换需要的内存超过了32G):
运行成功后会将转换后的模型名为(qwen1_8b-ggml.bin)放在当前目录下。1.8B模型转换后仅987MB,7B模型转换后仅4.1GB。
接下来,需要编译qwen.cpp推理器:
编译完成后,就可以运行测试:(测试时大约使用了2G内存)
如果正常输出类似"你好!有什么我能帮助你的吗?"的结果,就是运行成功了。
使用下面的命令可以运行交互问答程序。
在'Prompt >'后输入问题就可以得到模型的回答。例如
Prompt > 推荐一种好吃的甜食
qwen > 我推荐你尝试一下草莓冰淇淋,它是一种非常受欢迎的甜食,口感清新,营养丰富,适合各个年龄段的人群食用。草莓冰淇淋可 以根据个人口味添加糖分,使其更甜,也可以添加巧克力酱、奶油等来增加口感。
接着输入问题,可以就之前的对话连续提问,例如
Prompt > 介绍一下制作过程
qwen > 制作草莓冰淇淋的步骤很简单,首先,你需要准备新鲜的草莓,然后将草莓清洗干净,然后用搅拌机将草莓打成汁,接着,将打 好的草莓汁和糖分混合,然后将混合好的草莓汁倒入冰淇淋机中,按照冰淇淋机的说明进行操作,最后,将冰淇淋放入冰箱中冷冻,即可完成草莓冰淇淋的制作。
输入clear命令可以清除前文记忆,开始新对话;输入stop命令可以推出对话,关闭程序。
如果想要查看推理速度信息,可以在问答程序命令后加上参数-v
性能统计结果显示,Qwen1.8B模型在 龙芯3A6000 上阅读前文的速度为 155ms/token, 生成新答案的速度为 210ms/ token左右(token为模型中文字的基本单位,为一个字或者一个词)。生成速度接近 5 token/s,勉强可以达到对话的速度要求。
也测试了一下Qwen 7B,生成速度大约 869.936 ms/token,这个速度就比较难以接受了。