【大模型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,省去以上全部手工步骤。

浙公网安备 33010602011771号