windows 下安装 chatglm-6B

1,451 阅读7分钟

安装 python 环境

参考(windows 下安装 stable diffusion webui - 掘金 (juejin.cn) 安装 python 环境

chatGLM

介绍

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客

为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。

不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。请大家在使用前了解这些问题,以免产生误解。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。

源码与环境

源码下载

GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型

git clone --depth 1 https://github.com/THUDM/ChatGLM-6B.git

依赖环境

安装依赖

cd ChatGLM-6B
pip install -r requirements.txt

部分依赖需要额外安装:

  • webui 依赖
pip install gradio
  • charset_normalizer
ImportError: cannot import name 'COMMON_SAFE_ASCII_CHARACTERS' from 'charset_normalizer.constant' 
pip install cchardet

模型下载

修改 web_demo.py 的文件中的模型路径,设置成本地模型路径

# tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
# model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
tokenizer = AutoTokenizer.from_pretrained("E:\model\chatglm\chatglm-6b-model", trust_remote_code=True)
model = AutoModel.from_pretrained("E:\model\chatglm\chatglm-6b-model", trust_remote_code=True).half().cuda()

模型默认 f16 精度加载,需要大概 13GB 显存。如果显存不够,可以尝试量化加载模型,方法如下:

# 目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("E:\model\chatglm\chatglm-6b-model", 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 量化下仍然能够进行自然流畅的生成。使用 GPT-Q 等量化方案可以进一步压缩量化精度/提升相同量化精度下的模型性能,欢迎大家提出对应的 Pull Request。

量化过程需要在内存中首先加载 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()

量化模型的参数文件也可以从这里手动下载。

运行

提供了一个基于 Gradio 的网页版 Demo 和一个命令行 Demo。使用时首先需要下载本仓库:

git clone https://github.com/THUDM/ChatGLM-6B
cd ChatGLM-6B

网页版 Demo

首先安装 Gradio:pip install gradio,然后运行仓库中的 web_demo.py

python web_demo.py

程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。最新版 Demo 实现了打字机效果,速度体验大大提升。注意,由于国内 Gradio 的网络访问较为缓慢,启用 demo.queue().launch(share=True, inbrowser=True) 时所有网络会经过 Gradio 服务器转发,导致打字机体验大幅下降,现在默认启动方式已经改为 share=False,如有需要公网访问的需求,可以重新修改为 share=True 启动。

命令行 Demo

运行仓库中 cli_demo.py

python cli_demo.py

程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。

API部署

首先需要安装额外的依赖 pip install fastapi uvicorn,然后运行仓库中的 api.py

python 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"
}

langchain-chatGLM

Quickstart Guide — 🦜🔗 LangChain 0.0.153

介绍

一种利用 ChatGLM-6B + langchain 实现的基于本地知识的 ChatGLM 应用。增加 clue-ai/ChatYuan 项目的模型 ClueAI/ChatYuan-large-v2 的支持。

💡 受 GanymedeNil 的项目 document.ai 和 AlexZhangji 创建的 ChatGLM-6B Pull Request 启发,建立了全部基于开源模型实现的本地知识问答应用。

✅ 本项目中 Embedding 默认选用的是 GanymedeNil/text2vec-large-chinese,LLM 默认选用的是 ChatGLM-6B。依托上述模型,本项目可实现全部使用开源模型离线私有部署

⛓️ 本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给LLM生成回答。

源码与依赖

源码

GitHub - imClumsyPanda/langchain-ChatGLM: langchain-ChatGLM, local knowledge based ChatGLM with langchain | 基于本地知识的 ChatGLM 问答

git clone --depth 1 https://github.com/imClumsyPanda/langchain-ChatGLM.git

GitHub - thomas-yanxin/LangChain-ChatGLM-Webui: 基于LangChain和ChatGLM-6B等系列LLM的针对本地知识库的自动问答

依赖安装

cd langchain-ChatGLM
pip install -r requirements.txt

模型下载

修改 configs/model_config.py 中的模型路径

  • ChatGLM 模型路径:llm_model_dict
  • Embedding 模型路径:embedding_model_dict
# embedding_model_dict = {
#     "ernie-tiny": "nghuyong/ernie-3.0-nano-zh",
#     "ernie-base": "nghuyong/ernie-3.0-base-zh",
#     "text2vec-base": "shibing624/text2vec-base-chinese",
#     "text2vec": "GanymedeNil/text2vec-large-chinese",
# }

embedding_model_dict = {
    "ernie-tiny": "nghuyong/ernie-3.0-nano-zh",
    "ernie-base": "nghuyong/ernie-3.0-base-zh",
    "text2vec-base": "E:\project\langchain-chatglm\model\\text2vec-base-chinese",
    "text2vec": "E:\project\langchain-chatglm\model\\text2vec-large-chinese",
}

# Embedding model name
EMBEDDING_MODEL = "text2vec"

# Embedding running device
EMBEDDING_DEVICE = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"

# supported LLM models
# llm_model_dict = {
#     "chatyuan": "ClueAI/ChatYuan-large-v2",
#     "chatglm-6b-int4-qe": "THUDM/chatglm-6b-int4-qe",
#     "chatglm-6b-int4": "THUDM/chatglm-6b-int4",
#     "chatglm-6b-int8": "THUDM/chatglm-6b-int8",
#     "chatglm-6b": "THUDM/chatglm-6b",
# }

llm_model_dict = {
    "chatyuan": "ClueAI/ChatYuan-large-v2",
    "chatglm-6b-int4-qe": "THUDM/chatglm-6b-int4-qe",
    "chatglm-6b-int4": "THUDM/chatglm-6b-int4",
    "chatglm-6b-int8": "THUDM/chatglm-6b-int8",
    "chatglm-6b": "E:\model\chatglm\chatglm-6b-model",
}

# LLM model name
LLM_MODEL = "chatglm-6b"

运行

执行 cli_demo.py 脚本体验命令行交互

$ python cli_demo.py

或执行 webui.py 脚本体验 Web 交互

$ python webui.py
  1. 运行前自动读取configs/model_config.pyLLMEmbedding模型枚举及默认模型设置运行模型,如需重新加载模型,可在 模型配置 标签页重新选择后点击 重新加载模型 进行模型加载;
  2. 可手动调节保留对话历史长度、匹配知识库文段数量,可根据显存大小自行调节;
  3. 具备模式选择功能,可选择 LLM对话 与 知识库问答 模式进行对话,支持流式对话;
  4. 添加 配置知识库 功能,支持选择已有知识库或新建知识库,并可向知识库中新增上传文件/文件夹,使用文件上传组件选择好文件后点击 上传文件并加载知识库,会将所选上传文档数据加载至知识库中,并基于更新后知识库进行问答;
  5. 后续版本中将会增加对知识库的修改或删除,及知识库中已导入文件的查看。