LLM的CPU部署问题

480 阅读4分钟

一、快速开始

llama.cpp的主要目标是在MacBook上使用4位整数量化运行LLaMA模型,它和 ggml项目密切相关。目前它支持平台相当广泛MacOS、 Linux、Windows 、Docker。重要的是它支持Chinese LLaMA-2/Alpaca-2、Baichuan2、Mistral等最新的模型(2023-10-16),最近(2023-10-22)出来的一些模型qwen、codeshell,Aquila测试过,尚不支持。尤其值得关注的Aquila2-34B这个模型的gguf还没有,但是gpu的量化已经有了:

用户可以在消费级GPU(如单张不到3000元的2080Ti)上进行34B模型微调训练,进一步降低了个人和小团体研发AI模型的门槛。仅需7B模型的资源消耗性能超过Llama2-70B。随后笔者就看到新闻科大讯飞认知大模型免费的消息。

的确时间来到了一个关键节点,那就就是开源模型越来越强,卡在生态位才是关键。继续llama.cpp

这是它的一些特性

1、没有依赖关系的 C/C++ 实现 2、Apple silicon是一等公民 - 通过 ARM NEON、Accelerate 和 Metal 框架进行优化 3、AVX、AVX2 和 AVX512 支持 x86 架构 4、混合F16 / F32精度 5、支持 2 位、3 位、4 位、5 位、6 位和 8 位整数量化 6、CUDA、Metal 和 OpenCL GPU 后端支持

1.1、核心操作
# 前置准备
xcode-select --install # 确保你下载了Git和C/C++
brew install pkgconfig cmake
git clone https://github.com/ggerganov/llama.cpp.git
# 同时创建一个python环境然后安装依赖
pip3 install -r requirements.txt
# 然后编译(在mac m1的电脑上,以便支持metal gpu)
LLAMA_METAL=1 make
# 下载13b模型然后移动到指定文件夹
python convert.py ./models/llama-2-13b-chat
# 量化模型
./quantize ./models/llama-2-13b-chat/ggml-model-f16.bin Q6_K

当然如果你选择make来编译,会把原代码和编译后的文件混淆在一起。如果你不想这样,那就选择下面的cmake来编译

git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
mkdir build
cd build
cmake ..
cmake --build . --config Release
1.2、使用模型
1.2.1、在命令行中使用
# 纯cpu
./main -m ./models/llama-2-13b-chat/ggml-model-q6_k.gguf \
--temp 0 --top-p 1.0 --top-k 1 --repeat_penalty 1.1  --color -ins
# 纯gpu
./main -m ./models/llama-2-13b-chat/ggml-model-q6_k.gguf \
--temp 0 --top-p 1.0 --top-k 1 --repeat_penalty 1.1  --color -ins -ngl 1 \

具体参数设置可以help一下,这里就不做过多解释了,毕竟使用的时候还是部署标准的openai的API.

1.2.2、使用api

llama.cpp有一个自己的服务,这套api和openai的API是不一样的

1、server的接口文档地址 2、server的转接openai的API可以参考api_like_OAI.py这个文件。还是简单的

三、进阶部署模型

3.1、自定义部署

这些初步想法吧,还没有实现。个人认为要研究自定义模型的GGML的CPU部署就要研究llama.cpp这个项目。尤其是它的convert.py系列的文件以及它如何使用权重的机制。cpu部署还有一个可能的路径,candle或burn,效率如何不得而知

还有一下其他方案

github.com/ztxz16/fast… github.com/srush/llama… github.com/karpathy/ll…

3.2、API部署

可以参考这位大佬苏洋文章,项目地址:github.com/soulteary/d… 可以详细研究一番

FROM alpine:3.18 as code
RUN apk add --no-cache wget
WORKDIR /app
ARG CODE_BASE=d2a4366
ENV ENV_CODE_BASE=${CODE_BASE}
RUN wget https://github.com/ggerganov/llama.cpp/archive/refs/tags/master-${ENV_CODE_BASE}.tar.gz && \
    tar zxvf master-${ENV_CODE_BASE}.tar.gz && \
    rm -rf master-${ENV_CODE_BASE}.tar.gz
RUN mv llama.cpp-master-${ENV_CODE_BASE} llama.cpp

FROM python:3.11.4-slim-bullseye as base
COPY --from=code /app/llama.cpp /app/llama.cpp
WORKDIR /app/llama.cpp
ENV DEBIAN_FRONTEND="noninteractive"
RUN apt-get update && apt-get install -y --no-install-recommends build-essential && \
    rm -rf /var/lib/apt/lists/*
RUN make -j$(nproc)

FROM python:3.11.4-slim-bullseye as runtime
RUN pip3 install numpy==1.24 sentencepiece==0.1.98
COPY --from=base /app/llama.cpp/ /app/llama.cpp/
WORKDIR /app/llama.cpp/
3.3、与rust结合

可以参考这个项目 github.com/rustformers… 或者使用candel,candle有明确的例子说明怎么读取gguf文件并使用,并实现了cpu和gpu加速。这里需要重点解决几个关键问题 1、gguf格式细节 2、如何使用ggml构建模型推断代码并运行 3、 目前相关文档缺乏,需要自己研究,这样才能做到出来一个模型,然后自己量化cpu部署,做到一定程度的自主。有时候社区进展没有那么快。这显然是一个非常重要的技能。