README.md 3.87 KB
Newer Older
1
2
# ChatGLM6B_CPP

zhouxiang's avatar
zhouxiang committed
3
## 论文
zhouxiang's avatar
zhouxiang committed
4

zhouxiang's avatar
zhouxiang committed
5
`GLM: General Language Model Pretraining with Autoregressive Blank Infilling`
zhouxiang's avatar
zhouxiang committed
6

zhouxiang's avatar
zhouxiang committed
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- [https://arxiv.org/abs/2103.10360](https://arxiv.org/abs/2103.10360)

## 模型结构

ChatGLM-6B 是清华大学开源的开源的、支持中英双语的对话语言模型,基于 [General Language Model (GLM)](https://github.com/THUDM/GLM) 架构,具有 62 亿参数。ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。ChatGLM-6B采用Transformer模型结构:

<div align="center">
<img src="doc/transformers.jpg" width="300" height="400">
</div>



以下是ChatGLM-6B的主要网络参数配置:


zhouxiang's avatar
zhouxiang committed
22
23
24
| 模型名称   | 隐含层维度 | 层数 | 头数 | 词表大小 | 位置编码 | 最大序列长度 |
| ---------- | ---------- | ---- | ---- | -------- | -------- | ------------ |
| ChatGLM-6B | 4,096      | 28   | 32   | 130528   | RoPE     | 2048         |
zhouxiang's avatar
zhouxiang committed
25
26
27
28
29
30
31
32

## 算法原理

ChatGLM-6B基于GLM架构开发。GLM是一种基于Transformer的语言模型,以自回归空白填充为训练目标, 同时具备自回归和自编码能力。

<div align="center">
<img src="doc/GLM.png" width="550" height="200">
</div>
33
34
本项目主要针对ChatGLM-6B推理性能优化,达到DCU平台较快的对话效果

zhouxiang's avatar
zhouxiang committed
35
## 环境配置
36

zhouxiang's avatar
zhouxiang committed
37
### 环境准备
38

zhouxiang's avatar
zhouxiang committed
39
在光源可拉取推理的docker镜像,拉取方式如下:
40

zhouxiang's avatar
zhouxiang committed
41
42
```
docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:chatglm-6b-dcu-infer-1.0 
43
44
```

zhouxiang's avatar
zhouxiang committed
45
46
47
48
49
50
51
52
53
54
### 容器启动

模型推理容器启动命令参考如下,用户根据需要修改:

```
# <container_name> 自定义容器名
# <project_path> 当前工程所在路径
docker run -it --name=<container_name> -v <project_path>:/work -w /work --device=/dev/kfd --device=/dev/dri --security-opt seccomp=unconfined --cap-add=SYS_PTRACE --shm-size=16G --group-add 39 image.sourcefind.cn:5000/dcu/admin/base/custom:chatglm-6b-dcu-infer-1.0 /bin/bash
```

55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
### 编译方法

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

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

1. main: 示例程序

2. quant: 量化程序

3. benchmark: 性能测试程序

zhouxiang's avatar
zhouxiang committed
72
73
## 推理

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
### 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
```

zhouxiang's avatar
zhouxiang committed
110
111
112
113
114
115
116
117
118
119
## 应用场景

### 算法类别

`自然语言处理`

### 热点应用行业

`nlp,智能聊天助手,科研`

120
121
122
123
124
125
126
## 源码仓库及问题反馈

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

## 参考

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