本地大模型这件事,琢磨一阵子之后你会发现,真正卡人的不是模型本身,而是环境。ChatGLM-6B这种级别的模型,只要是近几年的显卡都能跑,但很多人在第一步装CUDA、配PyTorch的时候就栽了跟头,然后整个计划就搁浅了。这篇攻略我按自己实际折腾的顺序来写,从显卡驱动怎么确认,到CUDA装哪个版本,再到模型怎么下载、怎么量化、怎么跑起来,全部走一遍。你不用懂底层原理,照着步骤来,大概率一次能通。
1. 整体设计与方案选型思路
1.1 为什么选ChatGLM-6B作为本地部署的起点
现在本地能跑的大模型不少,ChatGLM-6B、Llama系列、通义千问、百川都有对应的小尺寸版本。但如果你是第一次接触本地部署,ChatGLM-6B是最合适的入门选择,原因很实在。
显存门槛低。6B参数对应FP16精度大约是12GB显存,但实际上通过量化手段,最低6GB显存的显卡也能跑起来,这正好覆盖了市面上主流游戏卡的显存区间。很多人的显卡是8GB或12GB,正好在甜点位上。
中文效果好。这个模型在中文语料上做过专门优化,你拿它做文本生成、内容总结、对话问答,输出质量明显比同体量的其他模型更自然。对中文用户来说,日常使用体验很重要。
资料多、踩坑记录全。这个模型发布得早,社区里积累了大量的部署经验、常见问题解决方案,你遇到报错基本都能搜到答案。新手最怕的是卡住没人问,选一个生态成熟的模型,相当于自带了一本错题集。
部署流程覆盖完整。从环境配置到模型下载,再到启动推理,整个流程把本地大模型的部署链路完完整整地走了一遍。你把这个流程跑通之后,再换其他模型其实就是替换参数的事,底层的环境和工具链是通用的。
1.2 本地部署的核心链路和技能储备
本地部署大模型,本质上就是一条链路:硬件资源 → CUDA计算平台 → Python环境 → 深度学习框架 → 模型权重 → 推理脚本/界面。一个环节出错,后面全部跑不起来。
你不用提前把每个环节都吃透,但每个环节的核心逻辑得心里有数。CUDA是用来让程序调用显卡计算能力的桥梁,PyTorch是在这个桥梁上运行的深度学习框架,模型权重是训练好的"知识",推理脚本是把知识和你的输入结合起来、生成回答的程序。
对小白来说,Windows系统其实比Linux更友好。很多人一听大模型就觉得必须用Linux,其实ChatGLM-6B在Windows上完全能跑,配置得当之后,启动个脚本就行。我自己的主力环境是Windows 11加显卡驱动,部署过程没遇到什么系统层面的障碍。当然如果你本身熟悉Linux,用Linux会更顺手,但这不是必需的。
2. 环境准备与CUDA配置详解
2.1 硬件配置要求与显卡状态确认
开始之前,先确认你的机器配置。显卡是最关键的部件,显存大小决定了你能跑多大参数量的模型、用不用量化。我的经验是这样的:
| 显存容量 | 可运行的模型方案 |
|---|---|
| 6GB | ChatGLM-6B INT4量化版,流畅运行,生成速度尚可 |
| 8GB | ChatGLM-6B INT4或INT8量化版,体验更好 |
| 12GB | FP16半精度原版或者更高参数量的量化模型 |
| 16GB及以上 | 原版FP16运行无压力,可尝试多轮对话加长上下文 |
注意这只是模型加载占用的显存,实际上系统其他功能也会占用一点显存,所以留出1GB到2GB的余量比较保险。
内存建议16GB起步,32GB更从容。模型加载到显存之前,权重文件是先经过内存的,内存不足会直接崩溃。另外,硬盘上要留出至少20GB的空间,模型文件本身大约12GB,Python环境和依赖库还要占掉几个GB。
确认显卡状态很简单。在Windows下打开任务管理器,点"性能"标签页,看左侧有没有"GPU"选项,右侧看GPU名称和专用显存。如果你看到的名称是"Microsoft基本显示适配器",说明显卡驱动没装好,后面CUDA环境配了也白配,先去显卡官网把驱动更新到最新版。
2.2 CUDA Toolkit的版本选择和安装过程
这一步是新手最容易迷惑的地方。显卡驱动、CUDA、PyTorch三者之间的版本关系,很多人理不清。其实记住一个原则就行:显卡驱动是最底层的,驱动支持新版本的CUDA,而CUDA是给开发用的工具包,PyTorch又依赖特定的CUDA版本,所以版本匹配是从上往下一层一层对应的。
打开命令行,输入nvidia-smi,如果正常显示显卡信息,看右上角"CUDA Version",这是驱动支持的最高CUDA版本。我的机器显示的是12.2,所以我装CUDA 11.8或者12.1都没问题。
这里给小白一个关键建议:CUDA版本不需要跟驱动的上限版本完全一致,只需小于或等于驱动支持的上限即可。我一般习惯装CUDA 11.8,因为PyTorch对11.8的官方支持非常稳定,很多模型源码也是基于这个版本测试的。
下载CUDA Toolkit时,可以直接在搜索引擎里搜"CUDA Toolkit 11.8"进入官方下载页面,选择Windows系统,然后选"exe local"格式。安装的时候注意选择"自定义"安装,不要全选。组件里的"Visual Studio Integration"如果没装VS可以不勾选,其他保持默认。安装完成后,环境变量里会自动加入CUDA相关的路径,但有时候不全,需要手动检查。
在系统环境变量里确认或添加这两个路径:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin和C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\libnvvp。然后打开新的命令行窗口,输入nvcc --version,能输出版本信息,就说明CUDA配置成功了。
提示:很多人在第一步就把CUDA理解成"显卡驱动",其实驱动是驱动,CUDA是CUDA,它们是两回事。驱动让系统能用显卡显示画面,CUDA是给开发者调用显卡算力用的工具包。大模型推理依赖的是CUDA支持的算力功能,所以单纯更新驱动是不够的。
2.3 Python与PyTorch的安装及版本匹配
Python版本建议3.8到3.10之间,不要装最新的3.11或3.12。虽然新版本性能更好,但很多深度学习库的预编译包还没有完全适配,装的时候容易碰到莫名其妙的坑。
下载Python安装包时,注意勾选"Add Python to PATH",这样后续在命令行里直接输入python就能进入环境。装完验证一下,命令窗口输入python --version确认当前版本。
然后进入PyTorch官网,选择对应的版本。这里有个关键操作:ChatGLM-6B的代码基于老版本的transformers库,在较新的PyTorch版本上可能会出现接口不兼容的问题。所以我建议安装PyTorch 1.13.x版本。在PyTorch官网首页,选择PyTorch 1.13.1、Conda或Pip、Windows、CUDA 11.7或11.8,生成安装命令。
复制官网生成的那行命令,类似:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117这里有个知识点:cu117表示CUDA 11.7版本对应的PyTorch版本。如果你的CUDA是11.8,也可以选cu117的包,因为PyTorch的预编译包把CUDA运行时打包在内部了,只要显卡驱动支持比它新就能用。
装好之后验证CUDA是否真的被PyTorch调用了。在命令行里进入Python交互环境,输入:
import torch print(torch.cuda.is_available())如果输出True,说明环境打通了,PyTorch能使用GPU。如果输出False,大概率是驱动太老,或者PyTorch版本装成了纯CPU版。CPU版的安装包路径里没有cu117或cu118字样,如果之前装错过,先卸载再重装。
3. ChatGLM-6B模型下载与量化方案选择
3.1 模型权重文件的获取渠道和校验方法
ChatGLM-6B的权重文件在HuggingFace和国内一些镜像源上都有发布。因为HuggingFace的访问经常不稳定,我建议直接从托管平台上找到对应仓库下载,国内网络下更省心。
你需要的文件是一个chatglm-6b文件夹,里面包含:
| 文件 | 作用 |
|---|---|
| config.json | 模型结构和超参数配置 |
| pytorch_model.bin | FP16精度下的模型权重,最核心的文件 |
| tokenizer.json | 分词器文件 |
| tokenization_chatglm.py | 分词流程脚本 |
| quantization.py | 量化工具脚本 |
| ice_text.model | 词表文件 |
下载过程中最容易踩的坑是权重文件不完整。pytorch_model.bin文件很大,网速稍微不稳就下载不全。文件下载完后,对照官方页面上标注的SHA256校验值验一下哈希值,如果对不上,说明文件损坏,直接重新下载,别用损坏的文件硬跑。
下载完成后,把这些文件解压到一个路径里,记住这个路径,后续代码里要用到。建议路径不要有中文,不要有空格,D:\models\chatglm-6b这种格式最稳妥。
3.2 量化原理和不同量化档位的选择逻辑
如果不加任何处理,ChatGLM-6B的FP16权重直接加载需要大约12GB显存。很多人的显卡不够这个数,这时候就要用到量化技术。
量化这个词听起来高级,本质上就是降低数值精度。原来的每个参数用16位浮点数存储和运算,量化后变成8位甚至4位整数,占用空间小了,运行也更快,代价是模型精度有一定损失,回答质量可能轻微下降。
衡量一个模型能不能在显卡上跑,主要看两点:加载权重占用的空间,推理过程中产生的临时显存。ChatGLM-6B的官方仓库里给出了量化方式,用load_in_8bit或者load_in_4bit加载时,显存占用可以降到8GB甚至6GB以内。
实际使用我的建议是:
- 显存只有6GB,用INT4量化,能跑,但生成速度稍慢,对话回合数多的时候可能出现前面历史的遗忘。
- 显存8GB,用INT8量化,平衡了速度和效果,这个组合体验最好。
- 显存12GB及以上,直接用FP16原版,质量和速度都在线,省心。
说到速度,生成一段回答的速度受显卡算力、显存带宽和量化格式三个因素共同影响。我自己测试下来,8GB显存显卡配INT8,单字生成速度大概在一秒几个字到十几个字之间,作为日常对话工具完全够用。
3.3 模型运行脚本的编写和启动验证
ChatGLM-6B提供了官方推理脚本,但你还需要手动处理一下依赖库的版本。创建一个新目录,放一个requirements.txt文件,内容大致包括transformers库、accelerate、sentencepiece、protobuf等。
执行下面这行命令安装依赖:
pip install -r requirements.txt接下来是核心的推理脚本。新建一个Python文件,内容如下:
from transformers import AutoTokenizer, AutoModel model_path = "D:\\models\\chatglm-6b" tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda() model = model.eval() prompt = "介绍一下杭州" response, history = model.chat(tokenizer, prompt, history=[]) print(response)这里说明几点。trust_remote_code=True必须加,因为这个模型使用了自定义的建模代码,不信任远程代码的话HuggingFace会拒绝加载。.half()是把模型转成半精度FP16格式,这样加载的显存占用直接减半。.cuda()是把模型放到显卡上运行。
跑一下脚本,看到完整生成了一段通顺的回答,说明整个环境已经通了。这个命令行模式可以作为基础运行方式,适合调用API做批量处理或者集成到自己的程序里。
4. WebUI界面部署与对话体验优化
4.1 Gradio界面启动和参数调整
命令行方式验证通过后,你还可以加装一个WebUI界面,这样不用命令行,浏览器里就能直接对话,使用体验提升一个档次。用Gradio框架可以快速搭建这个对话界面。
在刚才的目录下新建一个webui.py文件:
from transformers import AutoModel, AutoTokenizer import gradio as gr model_path = "D:\\models\\chatglm-6b" tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda() model.eval() def chat(message, history): response, _ = model.chat(tokenizer, message, history=history) return response gr.ChatInterface( fn=chat, title="本地大模型对话测试", ).launch(server_name="127.0.0.1", server_port=7860)启动后会看到一个本地的URL地址,浏览器打开就能访问。这个界面支持多轮对话,上方的文本框输入问题,下方显示完整的对话历史。
server_name设成127.0.0.1表示只允许本机访问,想在局域网内其他设备访问,改成0.0.0.0就可以了。server_port是端口号,如果7860被占用,换一个就行。
注意:Gradio默认只开一条线程处理请求,如果多个人同时访问同一个界面,后进入的人会排队。个人使用场景不用管这个,团队协作场景需要额外配置多线程支持。
4.2 流式输出与记忆长度的调优技巧
默认情况下,模型生成完一整段回答后才会一次性显示出来,句子长的时候等待感很明显。改成流式输出,文字会一个字一个字蹦出来,体验上更像真人聊天。
要实现流式输出,需要修改推理的调用方式。ChatGLM的官方backend代码如下:
model.stream_chat(tokenizer, query, history)用stream_chat替代chat,配合Gradio的ChatInterface使用,就能实现逐字输出。参数方面,top_p控制采样的累积概率阈值,数值越小、输出越保守;temperature控制随机性,数值越高、回答越发散。日常使用建议保持默认,追求稳定回答就调低temperature到0.6到0.8之间。
对话历史越长,显存占用越高,回答延迟也跟着增加。这是因为每次对话都需要把之前所有的历史重新处理一遍。所以长对话进行到一定程度的时候,生成速度会明显变慢,这时候清空一下历史,或者主动开新话题,会流畅很多。
5. 常见问题与排查技巧实录
5.1 显存溢出与运行崩溃的解决方案
现象一:加载模型时报错CUDA out of memory。这表示显存不够了,你有两个方向可以走。一是降低量化档位,从FP16降到INT8再到INT4;二是把模型加载到CPU上运行。用AutoModel.from_pretrained(..., device_map='cpu')强制CPU推理,但生成速度会慢很多,纯CPU生成一个字可能要几秒钟。机器学习玩家可以尝试先加载模型到CPU,然后用to(0)移到GPU,这样至少能运行。
现象二:加载过程中内存占用飙升,电脑卡死。通常是内存不够大,或者有别的程序占了内存。关掉浏览器标签页、后台软件,再试试。加载模型本身是一件吃资源的事,跑起来之后就轻松很多。
现象三:生成到一半报错然后程序退出。常见原因是显存被其他进程占用,比如浏览器开启了硬件加速。显存不够生成过程中间数据溢出,解决方案和现象一一致。
5.2 版本冲突与依赖库报错的排查指南
报错No module named 'transformers'。依赖库没装全,要么装错环境了。确认你在命令行里输入的pip install跟启动脚本时用的是同一个Python环境。建议创建一个虚拟环境专门给这个项目用,避免和系统全局环境里的包互相污染。
报错AttributeError: 'ChatGLMForConditionalGeneration' object has no attribute 'chat'。transformrs版本太新或者太旧。ChatGLM-6B需要 transformers 4.27.1到4.30.0之间的版本,装一个指定版本即可:
pip install transformers==4.29.2报错TypeError: 'NoneType' object is not iterable。通常是模型的tokenizer加载不完整,重新检查权重文件是否齐全,特别是tokenizer.json。
显卡明明支持,但torch.cuda.is_available()是False。检查PyTorch是不是装了纯CPU版,卸载后用包含cu117或cu118的安装命令重装。再检查显卡驱动版本是否过老,更新驱动后重启电脑。
5.3 下载速度慢与网络源选择的经验建议
从HuggingFace下载权重经常碰到龟速下载,解决办法是切换镜像源。国内一些高校和企业提供了HuggingFace的镜像站,在命令行设置环境变量:
set HF_ENDPOINT=https://hf-mirror.com这样设置之后,HuggingFace的下载请求会自动走镜像,速度能提升好几倍。下载完成后再取消这个环境变量,避免影响后续操作。
另外,不建议用Git LFS直接clone整个仓库,容易中断。直接访问模型仓库的文件列表,单独下载pytorch_model.bin和其余小文件,配合下载工具支持断点续传,稳定得多。
6. 实操总结与个性化扩展建议
6.1 一次完整的部署流程回顾
跑通一个本地大模型的流程,从上到下总结成一张流程表:
| 阶段 | 关键操作 | 验证方式 |
|---|---|---|
| 硬件检查 | 确认显卡显存、驱动版本 | 任务管理器 / nvidia-smi |
| CUDA安装 | 安装CUDA Toolkit 11.8 | nvcc --version |
| Python准备 | 安装Python 3.10 | python --version |
| PyTorch安装 | 按CUDA版本安装GPU版 | torch.cuda.is_available() |
| 模型获取 | 下载权重至本地目录 | 哈希校验 |
| 环境配置 | 安装依赖库 | 无报错即可 |
| 运行验证 | 执行推理脚本 | 成功生成回答 |
整个流程中,最耗时的其实是权重下载和环境配置,一旦跑通了命令行版本,后续加WebUI、换量化档位、换其他模型都是顺水推舟的事。
6.2 从入门到进阶的路线图
跑通ChatGLM-6B之后,你已经掌握了本地部署大模型的基础能力。下一步可以根据自己的硬件条件和使用需求,选择不同的进阶方向。
显存允许的话,可以试试更大的模型,比如13B参数级别的量化版本,文本生成质量和上下文理解的深度都会有明显提升。也可以把模型接入到自己写的应用里,比如做一个个人知识库问答机器人,或者集成到自动化办公流程中做文本处理。
更高阶的玩法是用LangChain这类工具把模型包装成Agent,让大模型具备调用工具、搜索资料、执行任务的能力。本质上,你已经在本地拥有了一台可以持续运行的智能处理引擎,能做的事情远比聊天窗口展示的多得多。
部署这件事卡住人的从来不是技术门槛,而是一堆细节没理顺。显卡驱动和CUDA版本的关系搞明白了,Python环境装干净了,模型文件校验完整了,剩下就是跑通一次流程建立信心的问题。按照这篇攻略走一遍,遇到问题回来看排查清单,本地大模型的大门就打开了。