本地部署 ChatGLM-6B
- 1. 什么是 ChatGLM-6B
- 2. Github 地址
- 3. 安装 Miniconda3
- 4. 创建虚拟环境
- 5. 安装 ChatGLM-6B
- 6. 启动 ChatGLM-6B
- 7. 访问 ChatGLM-6B
- 8. API部署
- 9. 命令行部署
- 10. 其他,修改使用显存大小
- 11. ChatGLM-6B 的推理参数含义
1. 什么是 ChatGLM-6B
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。
不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。请大家在使用前了解这些问题,以免产生误解。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。
2. Github 地址
https://github.com/THUDM/ChatGLM-6B
3. 安装 Miniconda3
下载 Conda 安装脚本,
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
运行安装脚本,
bash Miniconda3-latest-Linux-x86_64.sh
按提示操作。当提示是否初始化 Conda 时,输入 “yes”,
安装完成后,关闭当前终端并打开新终端,这将激活 Conda,
sudo su - root
更新 Conda 至最新版本,
conda update conda
添加必要的 Conda 通道以获取更多软件包,
conda config --add channels conda-forge
conda config --add channels defaults
测试是否安装成功,
conda list
如果显示 Conda 及其内部包的列表,则说明安装成功。
4. 创建虚拟环境
conda create -n chatglm python==3.10.4
conda activate chatglm
5. 安装 ChatGLM-6B
git clone --recursive https://github.com/THUDM/ChatGLM-6B; cd ChatGLM-6B
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple streamlit
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple streamlit-chat
6. 启动 ChatGLM-6B
streamlit run web_demo2.py
7. 访问 ChatGLM-6B
使用浏览器打开 http://localhost:8501/
,
问它一个问题,清华大学在哪?
8. API部署
先需要安装额外的依赖,
pip3 install fastapi uvicorn
然后运行仓库中的 api.py,
python3 api.py
默认部署在本地的 8000 端口,通过 POST 方法进行调用,
curl -X POST "http://127.0.0.1:8000" \-H 'Content-Type: application/json' \-d '{"prompt": "你好", "history": []}'
得到的返回值为,
{"response":"你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。","history":[["你好","你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],"status":200,"time":"2023-03-23 21:38:40"
}
9. 命令行部署
运行仓库中 cli_demo.py,
python cli_demo.py
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复。
输入 clear
可以清空对话历史,输入 stop
终止程序。
10. 其他,修改使用显存大小
默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:
vi web_demo2.py--- 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(8).half().cuda()
---
进行 2 至 3 轮对话后,8-bit 量化下 GPU 显存占用约为 10GB,4-bit 量化下仅需 6GB 占用。随着对话轮数的增多,对应消耗显存也随之增长,由于采用了相对位置编码,理论上 ChatGLM-6B 支持无限长的 context-length,但总长度超过 2048(训练长度)后性能会逐渐下降。
模型量化会带来一定的性能损失,经过测试,ChatGLM-6B 在 4-bit 量化下仍然能够进行自然流畅的生成。
量化过程需要在内存中首先加载 FP16 格式的模型,消耗大概 13GB 的内存。如果你的内存不足的话,可以直接加载量化后的模型,INT4 量化后的模型仅需大概 5.2GB 的内存:
# INT8 量化的模型将"THUDM/chatglm-6b-int4"改为"THUDM/chatglm-6b-int8"
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda()
11. ChatGLM-6B 的推理参数含义
-
Maximum length 参数
通常用于限制输入序列的最大长度,因为 ChatGLM-6B 是 2048 长度推理的,一般这个保持默认就行,太大可能会导致性能下降。 -
Top P 参数
Top P 参数是指在生成文本等任务中,选择可能性最高的前 P 个词的概率累加和。这个参数被称为 Top P,也称为 Nucleus Sampling。
例如,如果将 Top P 参数设置为 0.7,那么模型会选择可能性排名超过 70% 的词进行采样。这样可以保证生成的文本准确性较高,但可能会缺之多样性。相反,如果将 Top P 参教设置为 0.3,则会选择可能性超过 30% 的词进行采样,这可能会导致生成义本的准确性下降,但能够更好地增加多样性。 -
Temperature 参数
Temperature 参数通常用于调整 softmax 函数的输出,用于增加或减少模型对不类别的置信度。具体来说,softmax 函数将模型对每个类别的预测转换为概率分布。Temperature 参数可以看作是一个缩放因子,它可以增加或减少 softmax 函数输出中每个类别的置信度。
比如将 Temperature 设置为 0.05 和 0.95 的主要区别在于,T=0.05 会使得模型更加自信,更加倾向于选择概率最大的类别作为输出,而 T=0.95 会使得模型更加不确定,更加倾向于输出多个类别的概率值较大。
完结!