llama.cpp是近期非常流行的一款专注于Llama/Llama-2部署的C/C++工具。本文利用llama.cpp来部署Llama 2 7B大语言模型,所采用的环境为Ubuntu 22.04及NVIDIA CUDA。文中假设Linux的用户目录(一般为/home/username)为当前目录。
安装NVIDIA CUDA工具
NVIDIA官方已经提供在Ubuntu 22.04中安装CUDA的官方文档。本文稍有不同的是我们安装的是CUDA 11.8而不是最新的CUDA版本。这是因为目前PyTorch 2.0的稳定版还是基于CUDA 11.8的,而在实际各种部署中笔者发现按照PyTorch 2.0稳定版来锚定CUDA版本能够避免很多麻烦。当然了,对于llama.cpp本身来说这并不重要,因此读者可以随意选择适合的CUDA版本。
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
$ sudo dpkg -i cuda-keyring_1.1-1_all.deb
$ sudo apt update
$ sudo apt install cuda-11-8
安装完NVIDIA CUDA(其实是NVIDIA GPU驱动)之后应该重启系统一次,这样可以使得Linux内核能够正常编译并加载基于dkms的内核驱动模块。这里建议重启完之后运行一次nvidia-smi来确信系统中的显卡能够被NVIDIA驱动所识别。
$ sudo shutdown -r now
复制和编译llama.cpp代码源
在Ubuntu 22.04中,安装NVIDIA CUDA工具刚好会把llama.cpp所需的工具也全部安装好。因此,我们只要复制代码源并编译即可
$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp
$ make LLAMA_CUBLAS=1 LLAMA_CUDA_NVCC=/usr/local/cuda/bin/nvcc
安装NVIDIA CUDA工具并不会把nvcc(CUDA编译器)添加到系统的执行PATH中,因此这里我们需要LLAMA_CUDA_NVCC变量来给出nvcc的位置。llama.cpp编译完成后会生成一系列可执行文件(如main和perplexity程序)。为了简化内容,本文使用的是llama.cpp的make编译流程,有兴趣的读者可以参考llama.cpp的文档来使用cmake进行编译。
下载并运行Llama-2 7B模型
正常情况下,下载Llama系列模型应该参考Meta公司的模型申请页面。为节省时间,本文使用HuggingFace社区用户TheBloke发布的已进行格式转换并量化的模型。这些预量化的模型可以从HuggingFace的社区模型发布页中找到。在这个社区模型名称中,GGUF指的是2023年八月llama.cpp新开发的一种模型文件格式。
下载模型需要首先安装并初始化git-lfs(GIt Large File Storage)。
$ sudo apt install git-lfs
$ git lfs install
上面的命令运行完毕后,终端窗口里面应该显示“Git LFS initialized.”,现在我们就可以复制模型源了。因为这些模型文件非常大,此处我们暂时只复制文件的链接,不下载文件本身。
$ GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/TheBloke/Llama-2-7B-GGUF
我们只需要这个模型源中的其中一个文件,即llama-2-7b.Q4_0.gguf,表示的是一种4比特量化预处理的Llama 2 7B模型。有兴趣的读者还可以按照本文的方法尝试一些其他的模型文件。
$ cd Llama-2-7B-GGUF
$ git lfs pull --include llama-2-7b.Q4_0.gguf
在预量化的模型文件下载完成后,就可以运行llama.cpp中编译完成的各种程序了。此处我们运行一下在终端中的交互式的文本生成过程。
$ cd ~/llama.cpp
$ ./main -m ~/Llama-2-7B-GGUF/llama-2-7b.Q4_0.gguf --color \
--ctx_size 2048 -n -1 -ins -b 256 --top_k 10000 \
--temp 0.2 --repeat_penalty 1.1 -t 8 -ngl 10000
在上面的命令行中,最后的参数“-gnl 10000”指的是将最多10000个模型层放到GPU上运行,其余的在CPU上,因此llama.cpp本身就具有异构运行模型的能力。不过此处Llama 2 7B模型的总层数都不足10000,因此模型全部都会在GPU上面运行。大家可以按照屏幕上此时的说明来试试这个模型的交互能力。
部署Llama-2 7B模型
刚才提到,llama.cpp编译生成了许多有用的程序。其中,main是用于在终端窗口中显示文本生成的工具,perplexity用来对给定数据集计算困惑度以对模型进行测评,而server程序则可以部署一个简易的HTTP API。
$ ./server -m ~/Llama-2-7B-GGUF/llama-2-7b.Q4_0.gguf \
-c 2048 -ngl 10000 --host localhost --port 8080
这样,我们就可以通过访问http://localhost:8080/completion来得到模型生成的结果了。这里可以用curl尝试一下
$ curl --request POST \
--url http://localhost:8080/completion \
--header "Content-Type: application/json" \
--data '{"prompt": "Building a website can be done in 10 simple steps:","n_predict": 128}'
llama.cpp代码源中有server程序的更多文档。本文的步骤也适用于除llama 2 7B外其他与llama.cpp兼容的模型。