# llama.cpp使用指南

## 介绍
llama.cpp是基于C/C++实现的LLaMa英文大模型接口，可以支持用户在CPU机器上完成开源大模型的部署和使用。

llama.cpp支持多个英文开源大模型的部署，如LLaMa，LLaMa2，Vicuna等。

## 软件架构
llama.cpp核心架构分为两层
- 模型量化层：可以量化开源模型，减少模型大小；
- 模型启动层：可以启动量化后的模型。

特性：
- 基于ggml的C/C++实现；
- 通过int4/int8量化、优化的KV缓存和并行计算等多种方式加速CPU推理；
- 互动界面是流媒体生成，具有打字机效果；
- 无需 GPU，可只用 CPU 运行。

## 安装教程
### 软硬件要求 
处理器架构：支持AArch64和X86_64处理器架构；

操作系统：openEuler 23.09；

内存：根据不同开源模型的大小，不低于4G。

### 安装组件 
使用llama.cpp部署大模型，需要安装llama.cpp软件包。安装前，请确保已经配置了openEuler yum源。
1.  安装：
```
yum install llama.cpp
```
2.  查看是否安装成功：
```
llama_cpp_main -h
```
若成功显示help信息则安装成功。


## 使用说明
### 不使用容器
1.  需要安装llama.cpp软件包：
```
yum install llama.cpp
```
2.  需要下载开源大模型，如LLaMa、LLaMa2等。并将下载的开源大模型通过llama_convert.py进行模型量化：
```
python3 /usr/bin/llama_convert.py  model_path/
```
其中model_path为开源大模型的存放路径。

3.  启动模型，进行对话：
```
llama_cpp_main -m model_path --color --ctx_size 2048 -n -1 -ins -b 256 --top_k 10000 --temp 0.2 --repeat_penalty 1.1 -t 8
```
其中model_path为量化模型的存放路径。

可通过以下命令查看命令行选项用法：
```
llama_cpp_main -h
```
### 使用容器
1.  拉取容器镜像：
```
docker pull hub.oepkgs.net/openeuler/llama_image
```
2. 运行容器镜像，进行对话：
```
docker run -it --security-opt seccomp=unconfined hub.oepkgs.net/openeuler/llama_image
```
### 正常启动界面
模型启动后的界面如图1所示：

**图1** 模型启动界面
![输入图片说明](llama.png)
## 规格说明
本项目可支持在CPU级别的机器上进行大模型的部署和推理，但是模型推理速度对硬件仍有一定的要求，硬件配置过低可能会导致推理速度过慢，降低使用效率。

表1可作为不同机器配置下推理速度的参考：

表格中Q4_0，Q4_1，Q5_0，Q5_1代表模型的量化精度；ms/token代表模型的推理速度，含义为每个token推理耗费的毫秒数，该值越小推理速度越快；

**表1** 模型推理速度的测试数据

| LLaMa-7B            | Q4_0 | Q4_1 | Q5_0 | Q5_1 |
|--------------------------------|------|------|------|------|
| ms/token (CPU @ Platinum 8260) | 55   | 54   | 76   | 83   | 
| 模型大小                      | 3.5G | 3.9G | 4.3G | 6.7G | 
| 内存占用                      | 3.9G | 4.2G | 4.5G | 5.0G |

