
1. ChatGLM2-6B 免费商用后个人开发者到底该本地跑还是走 APIChatGLM2-6B 是智谱 AI 与清华 KEG 实验室开源的双语对话模型权重对学术研究完全开放企业完成登记后也能免费商用。它最大的特点是单张消费级显卡就能跑起来INT4 量化后大概 6GB 显存占用一张 3060 12G 或者 4060 8G 就能在本地把对话服务拉起来。适合谁预算有限、数据不想出内网、想拿模型做微调实验的个人开发者以及需要快速验证产品原型的中小团队。但问题也来了。LLaMA 系列、Baichuan、Qwen 这些开源模型陆续放开商用许可之后摆在开发者面前的选择不再是用哪个模型而是用哪种接入方式。本地部署听起来很香——数据不出门、没有调用费用、想怎么改就怎么改。可实际动手之后你会发现环境配置、CUDA 版本、显存溢出、推理速度这些问题会一个接一个冒出来。而走统一 API 通道呢省心是省心但又要考虑调用成本、网络连通性、模型版本管理。我试过两条路都走一遍。本地部署 ChatGLM2-6B 从零到能对话顺利的话两三个小时踩坑的话一整天就进去了。API 接入从注册到跑通第一个请求十分钟以内。但这两者的取舍不是单纯比时间而是要看你的场景你是要长期跑一个固定任务还是要频繁切换模型做对比测试你是要微调模型还是只要一个能用的对话接口这篇文章会把两条路径都拆开讲清楚。本地部署部分给出完整的环境配置、模型加载、接口暴露步骤API 部分给出可复制的请求示例和连通性验证方法。最后我会给一个判断框架帮你根据自己的硬件条件、数据敏感度、调用频率来决定选哪条路。文章里涉及 API 通道的地方我会用 TaoToken 作为统一接入层来演示因为它能把 ChatGLM、LLaMA 这些模型的调用方式统一成一套接口省去你分别对接各家 SDK 的麻烦。先说结论如果你只是想把模型跑起来用不打算改模型本身API 通道是更省事的选择如果你要微调、要做私有化部署、或者对延迟有极致要求本地部署值得投入时间。下面分别展开。2. 本地部署 ChatGLM2-6B 的完整环境配置与模型加载2.1 硬件与系统前提ChatGLM2-6B 官方推荐的最低配置是 7GB 显存INT4 量化FP16 精度需要 13GB 左右。我实测下来一张 RTX 3060 12G 跑 INT4 量化版对话响应速度大概每秒 20-30 个 token日常测试够用。如果你只有 8G 显存的卡比如 4060INT4 也能跑但上下文长度要控制一下别一上来就塞几千 token 的历史记录。系统层面Ubuntu 20.04 或 22.04 最省心Windows 用 WSL2 也行。Python 版本建议 3.103.11 有些依赖包还没跟上。CUDA 版本选 11.8 或 12.1对应 PyTorch 2.0 的预编译包。先建一个干净的虚拟环境别在系统 Python 里直接装conda create -n chatglm2 python3.10 -y conda activate chatglm2然后装 PyTorch。如果你用 CUDA 11.8pip install torch2.0.1cu118 torchvision0.15.2cu118 --index-url https://download.pytorch.org/whl/cu118CUDA 12.1 的话把 cu118 换成 cu121。装完之后验证一下 GPU 能不能被 PyTorch 识别import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果cuda.is_available()返回 False先别急着往下走检查驱动版本和 CUDA 运行时是否匹配。这一步卡住的人最多。2.2 拉取模型权重与依赖安装模型权重从 HuggingFace 或 ModelScope 拉。国内网络环境建议用 ModelScope速度快很多pip install modelscope python -c from modelscope import snapshot_download; snapshot_download(ZhipuAI/chatglm2-6b, cache_dir./models)拉下来大概 12GB 左右。如果你要用 INT4 量化版还需要装cpm_kernelspip install cpm_kernels然后装 ChatGLM2 的官方依赖pip install protobuf transformers4.30.2 cpm_kernels sentencepiece accelerate注意 transformers 版本别装太新4.30.2 是官方验证过的4.35 以上有些接口变了会报错。2.3 加载模型并启动本地对话写一个最简的加载脚本load_model.pyfrom transformers import AutoTokenizer, AutoModel model_path ./models/ZhipuAI/chatglm2-6b tokenizer AutoTokenizer.from_pretrained( model_path, trust_remote_codeTrue ) model AutoModel.from_pretrained( model_path, trust_remote_codeTrue, device_mapauto ).quantize(4).cuda() model model.eval() response, history model.chat( tokenizer, 你好介绍一下你自己, history[] ) print(response)quantize(4)就是 INT4 量化显存不够就加这个。device_mapauto让 accelerate 自动分配设备。跑起来之后你会看到模型输出一段自我介绍。如果要开一个 HTTP 接口给其他程序调用官方提供了api.pypython api.py --model-path ./models/ZhipuAI/chatglm2-6b --quantize 4 --listen 0.0.0.0 --port 8000启动后就是一个兼容 OpenAI 格式的接口可以用 curl 测试curl -X POST http://127.0.0.1:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: chatglm2-6b, messages: [{role: user, content: 用一句话解释什么是大模型}], temperature: 0.7 }能返回 JSON 就说明本地服务通了。这一步的坑主要在显存和端口占用显存不够就降量化位数端口被占就换一个。3. 用统一 API 通道接入 ChatGLM2-6B 的可复制配置3.1 为什么需要统一通道本地部署跑通之后你会发现一个问题如果你想同时对比 ChatGLM2-6B、LLaMA3、Baichuan 这几个模型的效果每个模型都要单独部署一套环境显存根本不够。而且模型版本更新频繁今天拉的这个权重下周可能就有新版本了维护成本不低。统一 API 通道解决的就是这个问题。你不需要在本地装任何模型权重通过一套接口就能调用多个开源模型。TaoToken 就是做这个的它把 ChatGLM、LLaMA 这些模型的调用方式统一成 OpenAI 兼容格式你只需要一个 API Key 和一个 Base URL。3.2 获取 API Key 与配置先到 TaoToken 控制台创建一个 API Key。地址是https://taotoken.net/console注册后在 API Keys 页面生成一个 Key格式类似sk-xxxxxxxx。拿到 Key 之后你需要在代码里配置三个东西Base URL、API Key、Model ID。Base URL 是https://taotoken.net/api注意不要加 UTM 参数直接写这个就行。如果你用 Python 的 openai 库配置如下from openai import OpenAI client OpenAI( api_keysk-你的Key, base_urlhttps://taotoken.net/api ) response client.chat.completions.create( modelchatglm2-6b, messages[ {role: user, content: 用 Python 写一个快速排序} ], temperature0.7, max_tokens1024 ) print(response.choices[0].message.content)如果你用 Cline 或者 Continue 这类编辑器插件配置方式是在 settings.json 里加一段{ models: [ { title: ChatGLM2-6B, provider: openai, model: chatglm2-6b, apiKey: sk-你的Key, apiBase: https://taotoken.net/api } ] }如果你用 Claude Code 或者 Codex 这类命令行工具配置在~/.codex/auth.json或者对应的配置文件里{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: chatglm2-6b }三件套就是 Base URL、API Key、Model ID缺一不可。Model ID 写chatglm2-6b就能路由到对应的模型。3.3 多模型切换的配置技巧统一通道的好处是切换模型只需要改一个字符串。比如你想从 ChatGLM2-6B 切到 LLaMA3只改model参数response client.chat.completions.create( modelllama3-8b, messages[{role: user, content: 你好}] )不用重新部署、不用重新拉权重、不用管显存。对于需要频繁对比模型效果的场景这个优势很明显。如果你在团队里用可以把配置抽成环境变量export TAOTOKEN_API_KEYsk-你的Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api然后代码里读环境变量避免 Key 硬编码在代码里提交到仓库。4. 验证请求与成功结果从 curl 到 Python 的连通性测试4.1 用 curl 做最小连通性验证配置完之后第一件事是验证能不能通。用 curl 发一个最简单的请求curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d { model: chatglm2-6b, messages: [{role: user, content: 11等于几}], max_tokens: 50 }如果返回类似下面的 JSON说明通道通了{ id: chatcmpl-xxx, object: chat.completion, created: 1700000000, model: chatglm2-6b, choices: [ { index: 0, message: { role: assistant, content: 11等于2。 }, finish_reason: stop } ], usage: { prompt_tokens: 10, completion_tokens: 8, total_tokens: 18 } }重点看choices[0].message.content有没有内容以及usage里的 token 统计是否正常。4.2 Python 脚本验证与流式输出curl 通了之后用 Python 再验证一遍顺便测试流式输出from openai import OpenAI client OpenAI( api_keysk-你的Key, base_urlhttps://taotoken.net/api ) stream client.chat.completions.create( modelchatglm2-6b, messages[{role: user, content: 写一首关于春天的五言绝句}], streamTrue ) for chunk in stream: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end, flushTrue)流式输出能正常逐字打印说明通道的 SSE 支持没问题。如果你在 Web 应用里用流式输出能显著提升用户体验。4.3 本地部署与 API 通道的响应对比我实测下来本地 3060 跑 INT4 量化版首 token 延迟大概 1-2 秒后续每秒 20-30 token。API 通道的首 token 延迟取决于网络国内访问大概 0.5-1.5 秒后续速度跟本地差不多。如果你的场景对首 token 延迟极其敏感本地部署有优势如果只是日常对话和代码生成API 通道的延迟完全可接受。另外注意一点本地部署的模型版本是你自己控制的API 通道的模型版本由服务方维护。如果你需要锁定某个特定版本的模型行为本地部署更可控。5. 本篇常见错误排查401、local proxy failed、reading choices、OAuth5.1 401 Unauthorized这是最常见的错误返回体一般是{ error: { message: Invalid API key, type: invalid_request_error } }原因就三个Key 写错了、Key 过期了、Key 前面多了空格或者少了sk-前缀。检查一下你的环境变量或者配置文件确保 Key 完整复制。如果你用的是 TaoToken 的 Key到控制台重新生成一个再试。5.2 local proxy failed这个报错通常出现在你本地开了某些网络工具的情况下。错误信息类似Error: local proxy failed, please check your network settings解决办法是检查你的 HTTP_PROXY 和 HTTPS_PROXY 环境变量如果设置了但代理不可用就会报这个错。临时清掉unset HTTP_PROXY unset HTTPS_PROXY然后重新发请求。如果你确实需要走代理确保代理地址和端口正确。5.3 reading choices 报错这个错误一般长这样KeyError: choices或者TypeError: NoneType object is not subscriptable原因是接口返回的结构跟你预期的不一样。可能是模型名称写错了导致路由不到模型返回了一个错误结构。检查你的model参数是不是chatglm2-6b别写成chatglm-6b或者chatglm2。另外检查base_url是不是https://taotoken.net/api别漏了/api或者多加了/v1。5.4 OAuth 相关报错如果你用 Claude Code 或者某些 CLI 工具可能会遇到OAuth token expired, please re-authenticate这是因为工具默认走 OAuth 流程但你配置的是 API Key 模式。解决办法是在工具的配置文件里明确指定 API Key 模式而不是 OAuth。比如 Codex 的auth.json里要写api_key字段而不是oauth_token。Claude Code 的话检查~/.claude/settings.json里的apiKey配置。5.5 本地部署的显存溢出本地跑 ChatGLM2-6B 如果报RuntimeError: CUDA out of memory先降量化位数从 FP16 降到 INT8 再降到 INT4。如果 INT4 还爆检查是不是有其他进程占着显存用nvidia-smi看一下。另外把max_length和max_new_tokens调小别一上来就设 4096。6. 本地部署与 API 通道怎么选给个人开发者和中小团队的判断框架回到最初的问题ChatGLM2-6B 免费商用之后你到底该本地跑还是走 API我的判断框架是这样的。先问自己三个问题第一你的数据能不能出内网如果涉及用户隐私或者商业机密本地部署是唯一选择。第二你需不需要微调模型如果要微调本地部署是前提API 通道给不了你权重。第三你的调用频率和并发量有多大如果每天几千次调用API 通道的成本可能比维护一台 GPU 服务器更低。对于个人开发者我建议先用 API 通道快速验证想法。TaoToken 的模型对话功能可以让你在浏览器里直接测试 ChatGLM2-6B 的效果不用写代码。地址是https://taotoken.net/models选好模型直接聊觉得效果满意再决定要不要本地部署。对于中小团队如果只是做产品原型或者内部工具API 通道的 Coding Plan 更划算。地址是https://taotoken.net/coding-plan按量付费不用养 GPU 机器。等产品验证通过、调用量上来了再考虑把核心模型迁到本地。如果你确定要本地部署那就按第 2 节的步骤走先把环境跑通再考虑优化推理速度。如果你决定走 API 通道第 3 节的配置直接复制就能用记得把 Key 换成你自己的。最后说一个实际经验本地部署最大的成本不是硬件是维护时间。模型更新、依赖冲突、CUDA 版本升级这些事会持续消耗你的精力。API 通道把这些麻烦都接过去了你只需要关注业务逻辑。所以除非有明确的本地化需求否则我倾向于先用 API 通道把东西做出来再根据实际情况决定要不要下沉到本地。