为摩尔线程S80编译基于MUSA的llama.cpp并推理千问qwen2.5模型
看灰机official
2024年10月28日 22:41

首先先介绍一下目前可以实现的效果:

1.Qwen2.5-3B-Instruct:模型及KV均可以加载到显存。使用q6_k量化gguf推理时CPU占用率低。GPU占用约80%,显存占用5GB。推理性能13token/s

2.Qwen2.5-7B-Instruct:KV需要使用-nkvo参数放在系统内存中,不然会Out of Memory。因此推理时CPU使用率很高。i7-9700满载也只能让S80跑50%占用。系统内存使用13GB,显存使用4GB。因为CPU性能不足,推理性能为8token/s

因为摩尔线程官方的文档是使用mthread运行时的Docker去执行预编译好的llama.cpp-musa容器,并没有提及如何编译本机版本,故写此文章。

一.系统准备

1.安装Ubuntu 20.04 amd64(因为MT_Linux_Driver是闭源dkms驱动,因此只能安装在Ubuntu 20.04操作系统中)

2.编译/etc/apt/sources.list,更换任意你喜欢的国内软件源

3.执行sudo apt update和sudo apt upgrade更新到最新版(注意不要不小心点弹出的对话框更新到22.04了)

4.重新启动计算机

二.安装新版gcc

这一步将手动从ubuntu测试源中安装更新版本的gcc11和g++11,用来后续的dkms编译和llama.cpp编译

1.添加测试源

sudo add-apt-repository ppa:ubuntu-toolchain-r/test

2.更新软件源缓存

sudo apt-get update

3.安装gcc11和g++11

sudo apt-get install gcc-11 g++-11

4.安装dkms

sudo apt install dkms

5.创建符号链接,让gcc和g++命令指向11版本的二进制程序

sudo ln -s /usr/bin/gcc-11 /usr/bin/gcc

sudo ln -s /usr/bin/g++-11 /usr/bin/g++

如果无法创建符号链接,提示文件已存在,则需要使用rm命令删除已存在的符号链接。例如sudo rm -rf /usr/bin/gcc

6.检查gcc和g++版本

gcc -v

g++ -v

三.安装MUSA_SDK

此步参考官网文档https://docs.mthreads.com/musa-sdk/musa-sdk-doc-online/install_guide/,单卡S70/S80用户只需要安装驱动,MUSA_Toolkit和muDNN即可。

四.克隆并编译llama.cpp

1.克隆最新源码

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

2.安装libomp-dev

sudo apt install libomp-dev

3.编译

参考llama.cpp编译手册https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md

make GGML_MUSA=1 GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 GGML_CUDA_FA_ALL_QUANTS=true GGML_CUDA_F16=true -j 8

具体各变量含义可参考编译手册的CUDA章节

编译后可在当前文件夹找到编译出的可执行文件。本例使用llama-server搭建一个web服务端。

五.下载并启动模型

Qwen2.5可以在多个模型网站找到。这里使用huggingface

wget https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-GGUF/resolve/main/qwen2.5-3b-instruct-q6_k.gguf

下载好之后使用如下命令执行

./llama-server -m qwen2.5-3b-instruct-q6_k.gguf --port 8080 --host 0.0.0.0 -ngl 999

更多启动参数可参考llama.cpp手册https://github.com/ggerganov/llama.cpp/blob/master/examples/server/README.md

当看到命令行输出main: server is listening on 0.0.0.0:8080 - starting the main loop后说明已经成功的启动了。此时可以用浏览器访问这台电脑的8080端口使用llama.cpp的webui进行推理了。