# ChatGLM6B_CPP

## 模型介绍
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型，基于 [General Language Model (GLM)](https://github.com/THUDM/GLM) 架构，具有 62 亿参数。

ChatGLM-6B 使用了和 ChatGPT 相似的技术，针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练，辅以监督微调、反馈自助、人类反馈强化学习等技术的加持，62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答，更多信息请参考我们的[博客](https://chatglm.cn/blog)。

本项目主要针对ChatGLM-6B推理性能优化，达到DCU平台较快的对话效果

## 模型推理

### 下载镜像

在光源可拉取推理的docker镜像，拉取方式如下：

```
docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:chatglm-6b-dcu-infer-1.0 
```

### 编译方法

```
mkdir build
cd build
cmake ..
make -j4
```

编译后会在build目录下生成：

1. main: 示例程序

2. quant: 量化程序

3. benchmark: 性能测试程序

### ChatGLM原版模型转换

```
# 将模型转换脚本tools/chatglm_export.py移动到python的ChatGLM-6B环境中
# 如果使用自己finetune的模型可能需要修改chatglm_export.py文件中创建tokenizer, model的代码
# 执行：
python3 chatglm_export.py ./chatglm-6b.bin # 导出浮点模型，参数为导出的模型路径

# 第二步将导出的模型进行低比特量化，将第一步导出的模型文件放在容器中，以/home/model/为例
# 在容器内执行，其中-p参数指定未量化的模型存放路径，-o指定量化后的模型保存路径
cd build
./quant -p /home/model/chatglm-6b.bin -o chatglm-6b-fp16.bin -b 16 #导出fp16模型
./quant -p /home/model/chatglm-6b.bin -o chatglm-6b-int8.bin -b 8 #导出int8模型
```

### 运行示例程序

```
./main -h 可以查看具体参数信息，以下是一些简单示例：
```

### 运行ChatGLM-6B模型实例

```
./main -p chatglm-6b-int8.bin
```

### 推理性能测试

可以使用benchmark程序进行测速，根据./benchmark -h描述进行配置和测试，不同配置、不同输入，推理速度也会有一些差别
```
./benchmark -p ~/chatglm-6b-int4.bin -f ../benchmark/prompts/beijing.txt -b 1
./benchmark -p ~/chatglm-6b-int8.bin -f ../benchmark/prompts/beijing.txt -b 1
./benchmark -p ~/chatglm-6b-fp16.bin -f ../benchmark/prompts/hello.txt -b 512 -l 18
```

## 源码仓库及问题反馈

https://developer.hpccube.com/codes/modelzoo/chatglm6b_cpp

## 参考

https://github.com/THUDM/ChatGLM-6B
