一些信息总结——大模型量化与CPU部署系列01

作者: 引线小白-本文永久链接:httpss://www.limoncc.com/post/9971336748ed0b5b/
知识共享许可协议: 本博客采用署名-非商业-禁止演绎4.0国际许可证

一、快速开始

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测试过,尚不支持。

这是它的一些特性

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、核心操作
1
2
3
4
5
6
7
8
9
10
11
12
# 前置准备
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来编译

1
2
3
4
5
6
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、在命令行中使用
1
2
3
4
5
6
# 纯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,效率如何不得而知

还有一下其他方案

https://github.com/ztxz16/fastllm也是国人方案,这个明确支持百川2模型
https://github.com/srush/llama2.rs这个使用rust加速
https://github.com/karpathy/llama2.c

3.2、API部署

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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结合

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

如果你对大模型应用有兴趣,欢迎加入AutogenQQ交流群:593623958


版权声明
引线小白创作并维护的柠檬CC博客采用署名-非商业-禁止演绎4.0国际许可证。
本文首发于柠檬CC [ https://www.limoncc.com ] , 版权所有、侵权必究。
本文永久链接httpss://www.limoncc.com/post/9971336748ed0b5b/
如果您需要引用本文,请参考:
引线小白. (Oct. 24, 2023). 《一些信息总结——大模型量化与CPU部署系列01》[Blog post]. Retrieved from https://www.limoncc.com/post/9971336748ed0b5b
@online{limoncc-9971336748ed0b5b,
title={一些信息总结——大模型量化与CPU部署系列01},
author={引线小白},
year={2023},
month={Oct},
date={24},
url={\url{https://www.limoncc.com/post/9971336748ed0b5b}},
}

'