本地部署 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 会使得模型更加不确定,更加倾向于输出多个类别的概率值较大。

完结!

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
ChatGPT-6B 是由 OpenAI 公司开发的一个大型预训练语言模型,需要大量的计算资源来运行。如果你想在本地部署 ChatGPT-6B,需要满足以下条件: 1. 高性能计算硬件,如 NVIDIA GPU,至少要有 16GB 的显存。 2. 安装 CUDA 和 cuDNN,以便在 GPU 上运行 TensorFlow。 3. 安装 TensorFlow 2.0 或更高版本。 4. 下载 ChatGPT-6B 的预训练模型,可以从 OpenAI 的 GitHub 仓库中下载。 一旦满足上述条件,你可以通过 TensorFlow 的 API 加载预训练模型并进行推理。下面是一个简单的 Python 代码片段,展示了如何加载 ChatGPT-6B 模型并生成对话: ```python import tensorflow as tf import numpy as np import openai # Load the pre-trained model model = tf.keras.models.load_model('path/to/pretrained/model') # Define a function to generate text def generate_text(prompt, length=1024, temperature=0.7): input_ids = openai.encode(prompt) input_ids = tf.constant(input_ids, dtype=tf.int32)[tf.newaxis, :] output = model(input_ids) logits = output['logits'][0, -1, :] / temperature probs = tf.nn.softmax(logits) token = tf.random.categorical([probs], num_samples=1)[-1, 0].numpy() text = openai.decode(np.concatenate([input_ids[0].numpy(), [token]])) i = 0 while i < length and token != openai.Token.EOS: i += 1 input_ids = tf.constant([token], dtype=tf.int32)[tf.newaxis, :] output = model(input_ids) logits = output['logits'][0, -1, :] / temperature probs = tf.nn.softmax(logits) token = tf.random.categorical([probs], num_samples=1)[-1, 0].numpy() text += openai.decode([token]) return text # Generate a conversation prompt = "User: Hello\nAI:" for i in range(10): prompt += '\nUser: ' print(prompt) prompt += generate_text(prompt) print(prompt) ``` 注意,由于 ChatGPT-6B 模型需要大量的计算资源,因此在本地部署时可能需要花费较长时间来生成对话。此外,由于 ChatGPT-6B 是一个大型预训练模型,因此预测结果可能会有一定的误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值