尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
GLM本地部署实战指南:从硬件选型到API封装
先把结论放在前面本地部署大模型没有想象中那么玄乎但也绝对不是你双击安装包就能完事的东西。我做本地大模型部署已经有小半年时间从最开始只会在网页上跟GLM系列产品聊天到后来真正把开源权重拉到自己的机器上跑起来再封装成API接口给内部工具用中间踩过的坑一个接一个。这篇就以GLM系列模型为主线把本地化部署的完整链路讲清楚硬件怎么选、环境怎么搭、权重怎么下、模型怎么加载、怎么跑起来、最后怎么把它变成一个能调用的接口。适合两类人看一是想把大模型接入内部业务但不想把数据传到外部服务的工程师二是刚接触大模型本地化部署、想找一条可复现路径的入门者。1. 先回答三个问题为什么要本地部署、要什么显卡、选哪个模型1.1 本地部署解决的真正痛点数据安全、调用成本与可定制性很多人一开始都不理解明明网页上用GLM系列模型对话那么方便为什么还要费劲在本地部署一套我自己的感受是本地部署解决的从来不是“能用”的问题而是“可控”的问题。首先是数据安全。公司的内部文档、用户隐私数据、业务日志这些东西你根本不敢直接丢给外部API。网上有个说法叫“数据不出域”本地部署刚好是最直接的解法——模型权重在你硬盘里推理也发生你的GPU上没有任何请求会发到外部服务器。对金融、医疗这些隐私敏感场景这一点是刚需。其次是调用成本。外部API按token计费一次完整对话还好但如果要做批量数据处理比如把历史工单全部过一遍做分类摘要那个费用就会刷刷往上涨。本地部署属于一次性硬件投入只要机器买回来了模型随便跑不用担心账单。最后是可定制性。在线服务能调的参数很有限但本地部署之后采样温度、top_p、系统提示词、甚至模型权重本身全部由你自己控制。后期想做LoRA微调、想接向量库做检索增强也都是本地部署才能走通的路。1.2 显存需求估算按参数量、精度算出来的硬指标选显卡之前先得搞清楚模型到底要吃多少显存。这里有个最基础的计算公式模型大小约等于参数量乘以每个参数占用的字节数。FP32精度每个参数占4字节FP16精度每个参数占2字节INT8量化每个参数占1字节INT4量化每个参数占0.5字节以常见的9B模型为例参数量是90亿。FP16精度下模型权重本身大约要 90亿 × 2字节 18GB 显存。INT8量化下大约9GBINT4量化下大约4.5GB。但这不是最终数字推理时还存在KV cache、中间激活值和框架本身的运行开销所以我实际估算时会再乘一个1.5到2的系数。模型规模FP16权重实际推荐显存INT8量化INT4量化1.5B3GB6GB左右1.5GB0.75GB6B12GB14GB左右6GB3GB9B18GB20GB左右9GB4.5GB从这个表能看出来如果你是个人开发者手里只有一块8GB显存的卡走4位量化也能跑6B模型如果预算充足直接上24GB显存9B模型FP16也能流畅跑。显存这个事儿越大越从容但也不必一步到位。1.3 GLM家族该选谁从轻量到稳重的取舍GLM系列目前常见的开源版本有1.5B、6B、9B这几个量级。选择逻辑其实很朴素模型越大知识储备和推理能力越强但硬件门槛也越高。我个人的建议是分场景来看入门学习和跑通流程选1.5B或更小的版本几分钟就能下载完普通笔记本的核显加上16GB内存也能勉强跑先感受整个部署链路。内部工具和轻量业务6B是性价比不错的选择配合4位量化可以塞进8GB显存而且中文对话能力已经能应付不少日常场景。正经服务或复杂任务直接上9B。实测效果确实比6B高一个档次生成的回答逻辑更连贯幻觉也少一些。选型时还可以记住一个原则先选大模型再选量化方案。优先把模型效果跑起来显存不够再通过量化降级而不是一开始就贪小模型省事。2. 部署环境搭建Python虚拟环境、显卡驱动与模型下载源2.1 用conda把Python环境隔离干净我强烈建议部署前先把Python环境隔离好。直接往系统Python里装一堆依赖早晚会出事——不同项目对PyTorch、transformers的版本要求不一样一旦冲突排查起来非常痛苦。conda是这里最顺手的工具conda create -n glm python3.10 conda activate glm创建虚拟环境之后后面所有依赖都装在这个环境里不会污染系统。Python版本选3.10比较稳妥既不会太老导致很多新版依赖不支持也不会太新导致某些底层库还没适配。实测GLM系列配合Python 3.10是基本没有兼容性问题的。2.2 PyTorch与CUDA版本要对上这一步最容易被坑环境搭建里最大的坑其实是CUDA版本匹配问题。很多人一上来就装了个CPU版的PyTorch结果模型跑得比蜗牛还慢还以为是自己显卡不行。第一步先查看驱动支持的CUDA版本nvidia-smi看右上角的“CUDA Version”这是驱动支持的上限。比如显示CUDA 12.4那装CUDA 12.1或更低的PyTorch版本都没问题。然后去PyTorch官网选择对应的安装命令一般用pip安装即可pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121装完之后一定要验证一下GPU是否真的可用python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果输出True和你的显卡型号说明环境OK。如果输出False大概率是装了CPU版或者驱动版本太老。这一步值得花三分钟确认否则后面所有代码跑起来都不知道问题出在CPU还是GPU上。2.3 模型权重去哪下载HuggingFace与ModelScope的选择GLM系列模型的权重在HuggingFace和ModelScope都有官方上传。HuggingFace是全球最大的模型社区但国内网络访问经常不稳定ModelScope的好处是服务器在国内下载速度快很多而且不需要额外配置代理。如果走ModelScope最简单的方式是直接用它的Python SDKpip install modelscope然后写个小脚本下载权重到本地缓存目录from modelscope import snapshot_download model_dir snapshot_download(ZhipuAI/glm-4-9b-chat) print(model_dir)如果你更习惯HuggingFace可以用huggingface-clipip install -U huggingface_hub huggingface-cli download THUDM/glm-4-9b-chat --local-dir ./glm-model这里有个经验之谈第一次下载模型权重时一定要看清楚模型页面上写的文件大小。9B模型光是权重文件就接近20GB如果网络不好下载中途还会断。HuggingFace的huggingface-cli支持断点续传不用从头再来这一点挺重要。另外下载完成后本地会多一个缓存目录可以手动设置环境变量来指定位置export HF_HOME/your/nas/path建议把模型权重放到磁盘剩余空间比较大的目录20GB起步别放C盘不然系统盘很容易撑爆。3. 让GLM开口说话写一段最小推理程序3.1 十来行代码把模型加载起来环境准备好、权重下载完接下来就是核心的加载环节。依赖安装同样在之前创建的conda环境里完成pip install transformers accelerate然后写一个最简单的推理脚本from transformers import AutoModel, AutoTokenizer model_dir THUDM/glm-4-9b-chat # 也可以用本地路径例如 ./glm-model tokenizer AutoTokenizer.from_pretrained(model_dir, trust_remote_codeTrue) model AutoModel.from_pretrained( model_dir, trust_remote_codeTrue, device_mapauto ).eval() query 你好请简单介绍一下你自己 response, history model.chat(tokenizer, query, history[]) print(response)跑起来之后模型会加载到GPU然后输出一段自我介绍。代码里有两个容易被忽略的点一个是trust_remote_codeTrue因为GLM系列用了一些自定义模型结构和代码transformers必须信任模型仓库里的代码才能正确加载另一个是device_mapauto它会自动把层分配到可用显存里省得你手动指定cuda:0。加载一次模型并没有想象中快。9B模型FP16从磁盘读入显存第一次大概要一两分钟如果机器配置一般会更久。这是正常的不要以为卡死了。3.2 单轮对话与多轮对话背后发生了什么初次跑通以后很多人都会试着连续追问然后发现一个问题模型好像记不住你之前说过什么。原因是model.chat方法本身不带记忆每次传的history列表如果为空模型就是一张白纸。多轮对话的正确姿势是把之前的历史累加起来传进去history [] while True: query input(你: ) if query.strip() exit: break response, history model.chat(tokenizer, query, historyhistory) print(GLM:, response)这里的关键在于每一轮都把对话历史整合进history列表模型才能根据上下文回答。而且要注意历史越长占用的显存和计算开销就越大。所以实际项目里如果要做一个长对话场景应该给历史队设置一个最大窗口比如保留最近10轮超过就截断。这样可以避免对话时间太长之后响应速度明显变慢。3.3 显存不够怎么救4位量化和8位量化如果你的显卡显存不够装下FP16完整权重量化就是必不可少的方案。量化就是把模型权重从浮点数压到更低的精度以牺牲少量效果为代价换取显存的大幅降低。在transformers里量化加载可以通过bitsandbytes完成pip install bitsandbytesfrom transformers import AutoModel, AutoTokenizer, BitsAndBytesConfig import torch model_dir THUDM/glm-4-9b-chat tokenizer AutoTokenizer.from_pretrained(model_dir, trust_remote_codeTrue) quantization_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.float16 ) model AutoModel.from_pretrained( model_dir, trust_remote_codeTrue, quantization_configquantization_config, device_mapauto ).eval() query 你好请介绍一下你自己 response, history model.chat(tokenizer, query, history[]) print(response)和FP16加载相比4位量化后的9B模型显存占用只有4到5GB8GB的显卡就能跑起来。代价是生成质量会有细微下降而且第一次加载时会有一个耗时较长的量化过程可能要多等几分钟这个属于正常现象。有一点要额外提醒如果你的机器没有独立显卡只有CPU那加载GLM这种量级的模型会非常痛苦。不是不能跑而是速度会慢到让人怀疑人生——生成一句话可能要一两分钟。真到了这个境地不如直接考虑用更小的模型或者在线服务省下的时间可以做更多有价值的事情。4. 把本地模型变成可调用的服务接口4.1 用FastAPI快速封装聊天接口模型能在脚本里跑起来还不够毕竟你不可能每次调用都在命令行里输入一遍。更现实的场景是写一个HTTP接口让前端页面、后端服务或者自动化脚本通过请求来使用模型能力。FastAPI是我目前用下来最顺手的方案轻量、速度快、文档自动生成。先装依赖pip install fastapi uvicorn uvicorn[standard]然后写一个接口服务from fastapi import FastAPI from pydantic import BaseModel from transformers import AutoModel, AutoTokenizer from threading import Lock app FastAPI() lock Lock() MODEL_DIR THUDM/glm-4-9b-chat tokenizer AutoTokenizer.from_pretrained(MODEL_DIR, trust_remote_codeTrue) model AutoModel.from_pretrained(MODEL_DIR, trust_remote_codeTrue, device_mapauto).eval() class ChatRequest(BaseModel): query: str history: list [] class ChatResponse(BaseModel): response: str history: list [] app.post(/chat) def chat(req: ChatRequest): with lock: response, history model.chat(tokenizer, req.query, historyreq.history) return ChatResponse(responseresponse, historyhistory) if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)这里有个细节值得展开说我加了一个全局线程锁。因为模型推理本身是串行的如果同时来了多个请求GPU会抢资源甚至导致显存溢出。用锁保证同一时刻只有一个请求在做推理其他请求排队等待反而是最稳定的方案。当然这样也会导致高并发时响应变慢但至少不会把服务打崩。4.2 业务系统接入用一条curl命令验证服务服务启动之后可以用curl快速验证接口是否正常curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {query: 你好, history: []}如果一切正常会返回一个JSON里面包含response和history字段。业务系统接入的时候其实就是在HTTP请求里带上用户问题然后把返回的response展示给用户再把history存起来供下一轮使用。Python客户端可以用requestsimport requests resp requests.post(http://localhost:8000/chat, json{query: 你好, history: []}) data resp.json() print(data[response])这种封装方式非常通用之后无论你是想接一个网页聊天框还是做一个命令行工具甚至接入企业内部系统都只是换一层皮的事。接口内部的具体实现业务方完全不用关心。顺便提一句FastAPI提供/docs路径浏览器打开后会自动生成一个自助测试页面调试接口特别方便前端对接的时候也可以用这个页面来做联调省去一堆来回沟通成本。5. 跑起来之后才懂的那些细节5.1 并发请求与显存的实际关系很多人以为并发请求多了显存会几何级增长其实不是这样的。模型在前台推理时同一份权重同时被所有请求共享真正变多的是KV cache和中间计算结果所以显存增长幅度远没有想象中大。瓶颈更多在“时间”上。我用6B模型做过一次简单压测单请求平均响应时间大约400毫秒来了3个并发请求之后平均响应时间变成1.2秒左右。这说明模型本身是串行处理的请求只能排队等。所以如果你的业务对并发有一定要求比如多个用户同时在线聊天建议把并发量限制在一个可控范围简单的方法就是我在接口里加的那个锁更高级的做法是引入消息队列做请求排队。在模型部署初期不要急着上高并发架构先把单机吞吐摸清楚一步一步扩展。5.2 模型下载中断与缓存目录的坑模型下载算是整个部署过程里遇到问题比较多的环节。大权重文件动辄十几GB国内网络下载很容易中途断掉。好在我用的方式都是支持断点续传的重新执行一次相同的下载命令能从上次中断的位置继续。还有一个坑是关于缓存目录。默认情况下模型权重会缓存到一个隐藏目录可能在你系统盘里占掉十几GB空间。我建议一开始就设好环境变量把缓存移到数据盘或者NASexport HF_HOME/data/model-cache export MODELSCOPE_CACHE/data/model-cache另外如果你从HuggingFace或ModelScope下载好模型之后又手动移动了文件位置加载时记得用本地路径不然会触发二次下载。这个坑我踩过一次白白浪费了半个晚上的时间。5.3 本地部署之后的调优方向模型在本地跑起来只是第一步真正“好用”还需要后续调优。我这里说几个我实测过有效的方向。第一个是调整生成参数。model.chat内部默认的采样参数是写好的你可以通过修改temperature和top_p来改变回答风格。温度越低回答越保守温度越高越有创造性。做客服问答这种场景我一般会把temperature调到0.2到0.3保证回答稳定做头脑风暴类工具则调到0.8左右。第二个是写提示词。别小看这个同样一个模型系统提示词设好了回答质量能提升一大截。比如说让模型扮演一个严谨的技术顾问还是让它扮演一个平易近人的客服输出风格完全是两回事。第三个是往检索增强方向走。本地模型的知识截止日期是固定的如果你需要它了解内部文档、新政策可以配合一个向量库。用户提问时先把相关问题检索出来拼进提示词再交给模型回答。这一套我后来跑通了之后才真正觉得本地大模型从“玩具”变成了“生产力工具”。我在实际项目里还有一个体会本地部署不要追求一步到位。先用小模型把流程跑通再逐步扩到更大模型、加量化、做接口封装每一步都验证一次效果。比起一口气把环境配到最好这样反而效率更高出问题时也更容易定位。希望这篇记录能帮你少走一些弯路。
RELATED

相关推荐

GLM-4-9B-Chat本地部署全攻略:量化、推理引擎与API调用

GLM-4-9B-Chat本地部署全攻略:量化、推理引擎与API调用

GLM-4-9B-Chat这颗开源模型发布以后,我在自己机器上前前后后部署过不止一次,从最早的llama.cpp量化版,到后来的vLLM在线服务,再到压到8GB显存笔记本上的超低资源方案,折腾了一圈下来,踩过的坑基本都摸清了。…

📅 2026/10/23 3:31:36
Windows蓝屏STOP代码解析:从误判陷阱到根因定位

Windows蓝屏STOP代码解析:从误判陷阱到根因定位

简介:本资源是一份面向Windows系统运维人员、IT支持工程师及电脑爱好者的基础排错工具文档,聚焦蓝屏死机(BSOD)错误代码的系统性整理与实用解读。针对用户因不明错误反复重装系统、排查效率低下的痛点,文档详尽收录0x0…

📅 2026/10/23 3:31:36
庖丁解牛Linux进程排查:ps aux按CPU排序的底层逻辑与实战

庖丁解牛Linux进程排查:ps aux按CPU排序的底层逻辑与实战

1. 这条命令为什么值得拆成八块看最早接触Linux系统排查的时候,前辈丢给我一句"看谁吃CPU,跑这条",就是ps aux --sort-%cpu | head。当时只知道抄着用,后来自己带人、写脚本、调性能,回头再看这条命令&#…

📅 2026/10/23 3:31:36
MORE NEWS

更多资讯

📰

深入理解Linux Netlink:内核与用户态通信的协议与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

TCP吞吐量上不去?抓包实测排查带宽跑不满的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Linux VM内核参数调优:内存管理、脏页回写与OOM实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

【跟踪】跟踪篇(4)--对于MOT16 Benchmark的理解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

STM32F103与AT24C02的I2C读写实战:时序、硬件与调试避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

YOLOv6工业视觉检测优化与部署实战:从能检出到敢上线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬