Loading

【大模型Wiki】13 · ChatGLM2-6B CPU 部署(实操)

https://huggingface.co/THUDM/chatglm3-6b-32k

https://github.com/THUDM/ChatGLM3

1、前言

1.1、简介

清华开源LLM ChatGLM2-6B是一款对汉语支持不错的大语言模型。由于完全开源,可对其进行微调,对研究LLM本身,以及基于预训练LLM进行领域知识微调验证都有帮助,在国内受到普遍欢迎。该模型可以部署在内存不少于32G的Windows环境中, 本文提供一个简单的安装指导,

如果你只是想快速安装体验,对原理性说明不感兴趣,可以直接跳转到附录A,按照无废话ChatGLM2-6B Windows本地安装指导操作即可。

ChatGLM2-6B对环境有一定要求,这部分对其运行环境进行检查。

作为开源LLM,目前其项目托管在github,模型可在Hugging Face上下载。因此本地安装时需要用到托管代码管理工具git。

2026 补充视角:本文记录的是"纯 CPU、32G 内存"时代的部署法。在 2026 年,更省事的做法是用 Ollama 拉 glm4:9b 的 GGUF 量化版(见 07 篇),一条命令即可,无需手工改 .cuda()→.float()。但本文保留原始 CPU 方案,价值在于"理解模型加载到底发生了什么"——这是所有上层封装的底层。

1.2、环境

  • 主机与操作系统环境
    • Windows10以上,64位操作系统
    • 内存32G以上
    • 空闲磁盘空间20G以上

以上信息可以通过Windows [开始] -> [设置] -> [关于]来查看

原理说明:ChatGLM2-6B 约 12GB 权重。若用 FP32(.float())加载进内存,权重本身占 ~12GB,加上推理时的激活值、KV Cache、Python 运行时、系统开销,实际峰值约 22GB。所以"32G 内存"是底线,16G/8G 机器基本跑不动或会疯狂 swap 到磁盘(慢到不可用)。2026 年的 GGUF Q4 把权重压到 4-5GB,16G 内存本也能跑,这是量化带来的门槛下降。

  • 语言环境

ChatGLM2-6B基于Pytorch AI开发框架、transformers库建设,使用Python语言作为前端开发语言,要求Python版本不低于3.8版本。

推荐 Python 3.10(2026 年 3.11/3.12 也行,但要确保 torch 有对应 Windows 预编译包)。用 conda 或 venv 建独立环境,避免污染系统 Python。

  • 代码仓管理工具

本文用git作为代码仓管理工具,从github和Hugging Face下载项目文件和模型文件。

1.3、设置pip镜像仓

pip config set global.index-url http://mirrors.****.com/pypi/simple

这里 mirrors.****.com 是占位,实际应填可用的国内镜像,例如:

  • 清华:https://pypi.tuna.tsinghua.edu.cn/simple
  • 阿里:https://mirrors.aliyun.com/pypi/simple/
  • 腾讯:https://mirrors.cloud.tencent.com/pypi/simple

设了镜像后 pip install 走国内源,速度从几十 KB/s 提升到几 MB/s,否则 requirements.txt 里 torch 这样的 800MB+ 大包会下到天荒地老。

1.4、设置git外访代理

git config --global http.proxy
git config --global http.sslverify false
git config --global https.proxy 
git config --global https.sslverify false

说明:上面四行是原始笔记里"设置代理"的骨架。在国内网络下,github.com 与 huggingface.co 经常不稳定。实际使用时:

  • 若你有 HTTP 代理,应填具体地址,例如 git config --global http.proxy http://127.0.0.1:7890(把 7890 换成你的代理端口),https.proxy 同理。
  • 若直连能通,上面空值的 http.proxy/https.proxy 等于没设置,可忽略前两条;sslverify false 仅在你遇到 SSL 证书报错时临时关闭校验用(有安全风险,能不通就不关)。
  • 更推荐用 HF_ENDPOINT=https://hf-mirror.com 镜像替代给 HF 挂代理,比 git 走代理稳。

二、下载ChatGLM2-6B项目代码

2.1、下载项目文件

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

git clone 拿到的是推理代码框架(约几 MB),含 cli_demo.py、web_demo.py、web_demo2.py、api.py、requirements.txt 和 ptuning/(微调代码)。模型权重不在这个仓库里,要单独下(见第三节)。

2.2、安装项目依赖库

pip install -r requirements.txt

逐包含义(常见依赖):

  • torch:PyTorch 深度学习框架,CPU 版即可(安装命令里若想指定 CPU 版可用 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu,但 requirements 通常已含 torch)。
  • transformers:Hugging Face 模型加载库(ChatGLM2 要求特定版本区间,跟着 requirements 走)。
  • sentencepiece / icetk:分词器依赖。
  • gradio / streamlit:Web UI 依赖。
  • uvicorn / fastapi:api.py 起 HTTP 服务用。

装完后验证:python -c "import torch, transformers; print(torch.__version__, transformers.__version__)" 应正常打印版本号,不报错即依赖 OK。

2.4 修正运行脚本,解决无GPU运行ChatGML2-6B问题

我们需要关注以下四个文件:

cli_demo.py:是一个LLM命令行演示程序,运行后会加载模型数据,以命令行的方式启动人机对话(聊天)。
web_demo.py:是Web版本的演示程序,运行后会加载模型,并启动Web服务,可以通过浏览器远程接入对话。web_demo.py用Gradio部署AI模型,提供可视化交互界面。因其能够直接在jupyter中展示页面,因此在AI开发中广泛使用。
web_demo2.py:是基于Streamlit的Web UI交互示例脚本。Streamlit在AI模型部署上作用与Gradio类似,Streamlit以markdown或html语言渲染页面,据说生成页面使用更流畅;但因其使用复杂,且无法直接在Jupyter中展示页面,相对Gradio,在开发阶段使用较少。
api.py:这个脚本启动ChatGLM2-6B模型,并以服务API的方式提供能力,客户端通过POST服务调用与ChatGLM2-6B模型进行交互。

这四个脚本默认都是将模型加载在GPU上执行计算,如果你的主机上没有GPU,或不支持英伟达CUDA,需要修改上述四个脚本进行适配。

为什么默认是 .cuda()?ChatGLM2-6B 项目的示例代码假设用户有 NVIDIA GPU。.cuda() 会尝试把模型搬到 GPU 显存;没有 CUDA 环境时这行直接抛 AssertionError: Torch not compiled with CUDA enabled 或 RuntimeError: CUDA error。改成 .float() 后,模型以 FP32 留在 CPU 内存里算——CPU 也能算,只是慢。

2.4.1、cli_demo.py

这个文件需要修改两处地方。
1、修改第一处
import readline将其注释掉。
2、修改第二处
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
其作用是将保存在相对路径THUDM/chatglm2-6b下的ChatGLM2-B6模型加载到CUDA上运行。如果你的主机上有可用的GPU,且支持CUDA,则无需修改上述代码,否则将其复制一行并注释原始代码,将代码中最后的.cuda()调用修改为.float()调用,即代码修改为:
#model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()

原理:

  • import readline 是 Linux/macOS 的命令行补全库,Windows 没有,直接 import 会 ModuleNotFoundError,所以注释掉。Windows 上若要行编辑可用 import pyreadline3 替代。
  • .float() 等价于 .to(torch.float32),把权重全部转 FP32 留在内存。注意:这会让权重从约 12GB(FP16)变成约 24GB(FP32)——所以 CPU + 32G 内存也只是勉强。若内存更紧张,应改用 INT4 量化版 chatglm2-6b-int4(约 4-5GB)。

2.4.2、web_demo.py

这个文件也涉及两处修改。
1、修改第一处
在文件web_demo.py第7行,会看到加载LLM模型的代码:
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
与修改cli_demo.py相同,复制粘贴一行后,将本来的代码注释掉,然后将代码最后的.cuda()调用修改为.float():
#model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()
2、修改第二处
在文件web_demo.py的最后一行,可以看到Web交互式部署模型的启动代码:
demo.queue().launch(share=False, inbrowser=True)
这个默认启动使得Web服务只绑定本机本地回环地址127.0.0.1,监听端口7860。这样启动后,服务只能在本机通过
http://127.0.0.1:7860
来打开ChatGLM2-6B的WebUI交互界面。如果你希望改变IP和端口号,就需要修改上面这一行代码,通过命名参数server_name修改主机地址(主机域名或IP地址),通过命名参数server_port修改监听端口号,例如:
demo.queue().launch(server_name=’0.0.0.0’, server_port=8081, share=False, inbrowser=True)
将使得ChatGLM2-6B LLM交互服务部署在本机所有IP的8081端口上,这样就可以远程(根据你的IP开放范围)访问了。
但对外提供服务,如果不做登录认证,会很危险。Gradio提供了登录认证的能力,是通过命名参数auth指定的。该参数可以指定一个用户定义函数来完成认证。输入参数是用户名、密码。函数返回布尔类型结果,如果返回True,表示认证通过,登录成功;否则认证失败,Gradio将禁止接入使用LLM服务。
因此可以先定义一个认证函数:
def my_authentication(username, password):
  # 可以根据配置或接入认证服务器完成接入认证
  # 本示例简单考虑,用户名固定为'guest',密码是'changeit'
  return (username, password) == ('guest', 'changeit')
然后修改启动代码,增加auth参数:
demo.queue().launch(server_name= '0.0.0.0', server_port=8081,
                   auth=my_authentication,
                   share=False, inbrowser=True)

安全提醒:server_name='0.0.0.0' 会把服务暴露到本机所有网卡(含局域网/公网,取决于你的网络)。生产环境务必加 auth 或放反向代理(Nginx + 鉴权)后,否则任何能访问你 IP 的人都能白嫖你的模型,甚至通过提示注入套取内部信息。share=True 会生成 Gradio 公网隧道,仅限临时演示。

2.4.3、web_demo2.py

model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
将最后的.cuda()修改为.float():
#model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()

2.4.4、修改api.py

model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
修改为
#model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()
这个文件的最后一行(第60行)是启动API服务的代码:
uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)
显然绑定本机所有IP,并监听端口8000,根据个人需要修改,或调整为可通过命令行指定监听端口,本文不做进一步展开。

api.py 用 FastAPI + uvicorn 暴露一个 POST 接口。注意 workers=1:CPU 推理是串行的,多 worker 不会提速反而抢内存,保持 1。它的请求体是 {"prompt": ..., "history": [...]}(旧式),与 OpenAI 的 messages 格式不同(见 08 篇)。想对接 OpenAI 生态,建议 2026 年直接用 Ollama/vLLM 而不是改这套老 api。

三、下载ChatGLM2-6B模型

ChatGLM2-6B模型官方下载路径在Hugging Face,大概有12G

ChatGLM2-6B模型文件默认放置在开源项目源代码目录下的THUDM\chatglm2-6b之中,即以本文档示例而言,模型文件全路径是

D:\ChatGLM2-6B\THUDM\chatglm2-6b

这个位置是由开源项目几个.py源文件中代码固定设定的。以cli_demo.py为例,其第7、第8两行代码

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

如果你想把模型文件放到其它地方,需要修改所有.py文件中涉及到的模型加载路径指示串。当然你不想用其开源项目源代码,自己写模型应用,则另当别论。

ChatGLM2-6B模型文件由以下18个文件构成

pytorch_model-0000x-of-0007.bin,共7个文件,就是ChatGLM2-6B模型参数文件,这几个文件都达到或超过1G大小

为什么切成 7 个分片?PyTorch 的 safetensors/bin 分片是为了兼容不同加载器与规避大文件限制。文件名里的 0000x-of-0007 表示第 x 片共 7 片,加载时 transformers 会自动按索引拼接,你不用手动合并。除权重分片外,还有 config.json(模型结构)、tokenizer*、MODEL_LICENSE、README.md 等,共 18 个文件。

3.1、下载模型

git clone https://huggingface.co/THUDM/chatglm2-6b THUDM/chatglm2-6b

上述克隆下载命令执行完成后,将会在当前目录下创建子目录THUDM,并在其下创建子目录chatglm2-6b,LLM模型文件会保存在这个目录下。即本文示例中,ChatGLM2-6B模型完整路径为:

D:ChatGLM2-6B\THUDM\chatglm2-6b

下载后,请与图2中文件清单进行比较,确保除两个.txt文件,一个.md文件外的其它15个文件都存在。

你也可以通过浏览器访问以下链接来下载ChatGLM2-6B模型文件:

https://huggingface.co/THUDM/chatglm2-6b

打开上述网页后,需要点击“Files and versions”

在该页面逐个下载模型文件到本地

这种下载方式也不会自动生成模型放置路径,需要自行创建目录,并确保将模型文件放置到正确的位置。本示例中,模型文件放置位置为:

D:ChatGLM2-6B\THUDM\chatglm2-6b

2026 推荐下载方式(比浏览器稳):

# 方式 1:huggingface-cli(支持断点续传,12GB 中途断了能续)
set HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download THUDM/chatglm2-6b --local-dir THUDM/chatglm2-6b

# 方式 2:ModelScope(国内直连最快)
modelscope download --model ZhipuAI/chatglm2-6b --local_dir THUDM/chatglm2-6b

如果只用 git clone,HF 单文件超 1GB 时 git LFS 容易超时;CLI 工具对大文件更友好。下载完建议用 dir THUDM\chatglm2-6b 核对分片数量是否为 7,缺片会导致 Loading checkpoint shards 报错。

四、运行ChatGLM2-6B LLM模型

ChatGLM2-6B开源项目提供了3种LLM运行方式。无论哪种方式,对于一台没有GPU的普通个人计算机,启动过程都比较漫长。启动后占用内容22G左右,对话后内存占用会进一步增长。

启动慢的根因:CPU 要把 12GB(FP32 约 24GB)权重从磁盘读进内存并反序列化,纯 CPU 下这一步就要 1-3 分钟;首次推理还要过一遍 6B 参数的矩阵乘,单条回复可能要十几秒到几十秒。请耐心等"加载进度条"走完再认为卡死。

4.1、在清华开源ChatGLM2-6B项目根目录下执行以下命令:

python cli_demo.py

如果没有意外,你将看到模型加载进度条:

Loading checkpoint shards: 57%|████████████ | 4/7 [00:08<00:06, 2.24s/it]

等待一段时间,甚至聆听到CPU风扇的一番挣扎后,你终于看到ChatGLM2-6B的交互提示:

欢迎使用 ChatGLM2-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序


用户:

意思是,ChatGLM2-6B已经准备好了,你可以输入交流的问题。输入“stop”后退出对话交流。ChatGLM2-6B项目对历史对话进行了简单记忆处理,因此已经交流过的问题可能影响后续交流。如果这种影响造成回答不准确,请输入“clear”将历史对话清空,ChatGLM2-6B将恢复到刚启动时的初始对话状态。

验证部署成功(cli 方式):出现"欢迎使用…"提示且能正常回话即成功。若卡在进度条不动,多半是权重缺片或内存不足被系统杀死(看任务管理器内存是否到 90%+)。

4.2、Web UI交互方式

python web_demo.py

浏览器打开 http://127.0.0.1:7860(若改了端口按你设的)。Gradio 界面里直接打字对话即可。若改了 server_name='0.0.0.0',局域网内其他机器用你本机 IP 访问。无显卡首次加载同样要 1-3 分钟,页面会显示"Loading..."。

4.3、服务API交互方式

在Windows命令行执行以下命令:

python api.py

同样是加载模型,显示提示:

Loading checkpoint shards: 100%|███████████████████| 7/7 [00:15<00:00, 2.19s/it]
INFO:   Started server process [15612]
INFO:   Waiting for application startup.
INFO:   Application startup complete.
INFO:   Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
curl -X POST http://110.71.46.17:8000 -H "Content-Type: application/json;charset=utf-8" -d "{\"prompt\": \"你好?\", \"history\": []}"

这是旧式 API(请求体是 prompt+history,不是 OpenAI 的 messages)。110.71.46.17 是示例里作者机器的公网 IP,你本地应改成 http://127.0.0.1:8000 或你自己机器的局域网 IP。成功会返回 JSON:{"response": "...", "history": [...], "status": 200}。

4.4、验证部署成功的统一标准

方式 成功标志 失败排查
cli_demo 出现欢迎语 + 能对话 卡进度条 → 权重缺片/内存不足
web_demo 浏览器能打开并能对话 页面打不开 → 端口/防火墙;403 → auth
api.py curl 返回 response 字段 连接拒绝 → 服务没起/地址错

五、常见报错与解决(CPU 部署专项)

现象 原因 解决
ModuleNotFoundError: readline Windows 无 readline cli_demo 注释 import readline,或装 pyreadline3
AssertionError: Torch not compiled with CUDA enabled 没改 .cuda() 改 .float()
RuntimeError: CUDA out of memory 误用 GPU 版代码但显存不足 改 .float() 回 CPU;或换 INT4 量化版
Loading checkpoint shards 卡死 权重分片缺失/下载中断 用 huggingface-cli 重下,核对 7 个分片
内存飙到 90%+ 后进程消失 32G 不够(FP32 占 24G) 换 chatglm2-6b-int4(约 4-5GB)或加内存
trust_remote_code 报错 未加参数 from_pretrained(..., trust_remote_code=True)
中文乱码 Windows 终端非 UTF-8 chcp 65001;或文件头 # -*- coding: utf-8 -*-
回答极慢(分钟级) CPU FP32 正常速度 接受;或换 GGUF 量化版大幅提速

量化版替代方案(强烈推荐 CPU 用户):THUDM/chatglm2-6b-int4 把权重压到 INT4,内存占用从 ~24GB 降到 ~6GB,16G 内存本也能跑,且推理更快。用法相同,只是 from_pretrained 的模型名换成 chatglm2-6b-int4。

六、总结

清华开源ChatGLM2-6B LLM是一个规模较小的通用预训练语言模型,对中文支持较好,对运行环境要求也比较小,甚至在一台内存不少于32G、无独立GPU显卡的的主机上都可以运行。这么低的入门门槛,为人们体验LLM提供了便利。

不但如此,ChatGLM2-6B开源项目在其主目录下的ptuning子目录中,还提供了P-Tuning微调代码,只需要按要求提供自己的领域微调数据集,代码略作修改即可对ChatGLM2-6B进行微调,形成新的模型检查点。这为一般的LLM应用研究提供了方便。

ChatGLM2-6B同时还推出了32K历史&提示信息版本(需要下载专门的模型版本,本文提供的是通用8K版本的),这为LLM与知识库结合的领域问答系统提供了便利。

七、附录A:无废话 Windows 安装速查(30 分钟版)

按顺序执行,全程无需懂原理:

# 0) 安装 Python 3.10(官网下一步下一步),勾选 "Add to PATH"
# 1) 建独立环境(可选但推荐)
python -m venv chatglm-env
chatglm-env\Scripts\activate

# 2) 配置 pip 镜像(提速)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

# 3) 克隆代码
git clone https://github.com/THUDM/ChatGLM2-6B.git
cd ChatGLM2-6B

# 4) 装依赖(CPU + 量化版更省内存,推荐 int4 模型)
pip install -r requirements.txt

# 5) 下载 int4 量化模型(约 4-5GB,16G 内存也能跑)
set HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download THUDM/chatglm2-6b-int4 --local-dir THUDM/chatglm2-6b-int4

# 6) 把 cli_demo.py 里的模型名与 .cuda() 改成:
#    AutoModel.from_pretrained("THUDM/chatglm2-6b-int4", trust_remote_code=True).float()

# 7) 运行
python cli_demo.py

若坚持用原版 12GB FP16 权重,把第 5 步模型名换回 chatglm2-6b,且确保内存 ≥32G;第 6 步加载用 .float()(FP32 实际约 24GB)。2026 年更推荐直接 ollama run glm4:9b,省去以上全部手工步骤。

posted @ 2024-04-22 14:11  Stellan7  阅读(620)  评论(0)    收藏  举报