
1. 为什么要在本地跑 GLM-4.1V-9B-ThinkingGLM-4.1V-9B-Thinking 是智谱联合清华团队推出的多模态视觉语言模型底座是 GLM-4-9B-0414通过思维链推理机制和课程采样强化学习策略把跨模态推理能力往上拉了一截。官方给出的数据是 28 项评测里 23 项达到 10B 级别最佳其中 18 项持平甚至超过参数量 8 倍的 Qwen-2.5-VL-72B。这个成绩单放在 10B 这个量级里确实扎眼但评测归评测真正能不能用、显存吃多少、量化后掉不掉点还是得自己在本机跑一遍才算数。这篇教程面向的是想在 Ubuntu PyTorch 环境下把 GLM-4.1V-9B-Thinking 完整跑起来的人包括环境依赖、权重获取、量化加载、图像问答和基准任务验证。适合谁手里有一张 24G 显存的卡4090 单卡就能起步或者双卡想跑 BF16 全精度的同学也适合做多模态 Agent、文档理解、视频抽帧问答的开发者。我会把每一步的命令和参数都写清楚你照着敲就能复现。先说结论性的预期BF16 全精度加载大约需要 20G 左右显存单张 4090 能跑但留给 KV Cache 的空间不多长上下文会紧张INT8 量化后显存降到 12G 上下INT4 能压到 8G 以内但推理质量会有可感知的下降尤其是细粒度 OCR 和图表推理。所以如果你只有单卡建议先跑 BF16 验证效果再决定要不要量化部署。环境这块我用的组合是 Ubuntu 22.04.4 LTS Python 3.12 CUDA 12.6 PyTorch 2.7.1显卡是 RTX 4090 双卡。单卡也能跑只是批处理和长视频输入会受限。下面从系统准备开始一步步来。2. 环境准备与依赖安装Ubuntu 22.04 CUDA 12.62.1 系统信息确认与镜像源配置第一步永远是确认系统版本别上来就装依赖。执行cat /etc/os-release输出里能看到VERSION_ID22.04和VERSION_CODENAMEjammy确认是 22.04 就行。接着更新软件包列表apt-get update国内机器建议换成阿里云镜像源编辑/etc/apt/sources.listvim /etc/apt/sources.list按i进入编辑模式把内容替换成deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse按esc退出编辑模式输入:wq保存退出。然后再跑一次apt-get update让新源生效。2.2 创建 Conda 虚拟环境强烈建议用独立虚拟环境别污染系统 Python。Python 版本选 3.12conda create -n GLM-Thinking python3.12 conda activate GLM-Thinking激活后which python应该指向 conda 环境下的路径。接下来装 PyTorch。去 PyTorch 官网的 Start Locally 页面选 Stable 2.7.1、Linux、Pip、Python、CUDA 12.6复制生成的命令pip install torch2.7.1 torchvision0.22.1 torchaudio2.7.1 --index-url https://download.pytorch.org/whl/cu126装完验证一下 CUDA 是否可用python -c import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.device_count())正常输出应该是2.7.1 True 2双卡或2.7.1 True 1单卡。如果cuda.is_available()返回 False八成是驱动版本和 CUDA 12.6 不匹配用nvidia-smi看驱动版本需要 560 以上。2.3 克隆项目与安装依赖找个空间足够的目录克隆官方仓库cd /root/sj-tmp/ git clone https://github.com/THUDM/GLM-4.1V-Thinking.git cd GLM-4.1V-Thinking pip install -r requirements.txtrequirements.txt里主要是 transformers、accelerate、gradio、pillow、decord 这些。如果 pip 装得慢加个清华源pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple这里有个坑transformers版本必须够新GLM-4.1V 的模型类是新加的老版本会报KeyError: glm4v或者Unrecognized model。装完确认一下版本不低于 4.52pip show transformers | grep Version2.4 模型权重下载权重从魔搭社区拉先装 modelscopepip install modelscope然后下载完整模型库modelscope download --model ZhipuAI/GLM-4.1V-9B-Thinking默认会下到~/.cache/modelscope/hub/ZhipuAI/GLM-4.1V-9B-Thinking。9B 的 BF16 权重差不多 18G 左右网速正常十几分钟能下完。如果你想指定目录加--local_dir /your/path。下载完检查一下文件结构应该能看到config.json、model.safetensors分片、tokenizer.json这些。3. 可复制的推理配置与量化加载3.1 命令行交互推理项目里inference文件夹下有个trans_infer_cli.py直接跑就能连续对话cd inference python trans_infer_cli.py --model_path /root/sj-tmp/GLM-4.1V-9B-Thinking/--model_path指向你实际的权重目录。启动后会加载模型双卡 4090 大概 40 秒左右加载完。加载完就能输入文本提问也能传图片路径做图像问答。如果你想控制显存和精度可以自己写一个加载脚本用transformers的AutoModelForCausalLM配合torch_dtype和device_mapimport torch from transformers import AutoModelForCausalLM, AutoProcessor model_path /root/sj-tmp/GLM-4.1V-9B-Thinking/ model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, trust_remote_codeTrue, ) processor AutoProcessor.from_pretrained(model_path, trust_remote_codeTrue)device_mapauto会自动把层分到多张卡上。单卡的话显存吃紧可以加max_memory{0: 22GiB}限制一下让 accelerate 把部分层放到 CPU但速度会掉。3.2 量化加载配置显存不够就上量化。bitsandbytes是最省事的方案pip install bitsandbytesINT8 加载from transformers import BitsAndBytesConfig bnb_config BitsAndBytesConfig( load_in_8bitTrue, llm_int8_threshold6.0, ) model AutoModelForCausalLM.from_pretrained( model_path, quantization_configbnb_config, device_mapauto, trust_remote_codeTrue, )INT4 加载bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_quant_typenf4, bnb_4bit_use_double_quantTrue, )实测下来INT8 显存占用约 12GINT4 约 7.5G。但量化对视觉编码器的影响比对语言模型大图像里的细小文字识别会明显变差。如果你主要做图表推理和 OCR建议还是 BF16。3.3 Gradio WebUI 启动想要网页界面就跑trans_infer_gradio.pypython trans_infer_gradio.py默认监听 7860 端口。如果端口被占用先查进程lsof -i :7860 kill -9 PID或者直接改脚本里的server_port参数。启动后浏览器打开http://你的IP:7860页面上能上传图片、视频输入问题后模型会输出带思维链的推理过程。3.4 多模态输入格式GLM-4.1V 的输入格式和普通 LLM 不太一样图像要走 processor 处理。一个标准的图像问答调用from PIL import Image image Image.open(test_chart.png).convert(RGB) messages [ { role: user, content: [ {type: image, image: image}, {type: text, text: 这张图表展示了什么趋势请给出具体数据。}, ], } ] inputs processor.apply_chat_template( messages, add_generation_promptTrue, tokenizeTrue, return_dictTrue, return_tensorspt, ).to(model.device) outputs model.generate(**inputs, max_new_tokens1024, do_sampleFalse) response processor.decode(outputs[0][inputs[input_ids].shape[1]:], skip_special_tokensTrue) print(response)视频输入的话用decord抽帧后按多图传入或者直接用项目里封装好的视频处理函数。注意视频帧数别太多每帧都会占视觉 token长视频建议先抽关键帧。4. 验证请求与成功结果对照4.1 图像问答验证准备一张有明确答案的图比如一张柱状图。我用一张包含 2020-2024 年销售额的柱状图测试提问「2023 年的销售额是多少相比 2022 年增长了多少百分比」。BF16 精度下模型输出的思维链会先识别坐标轴再读取柱子高度最后做减法算百分比答案和图上数据一致。这个过程能在终端看到完整的thinking段落说明思维链机制确实在工作。如果输出里出现重复、截断或者答非所问先检查max_new_tokens是不是设太小思维链本身会消耗不少 token建议至少 1024。4.2 基准任务验证想验证是否达到评测宣称的水平可以跑几个标准 benchmark。项目里没直接带评测脚本但可以用lmms-eval框架pip install lmms-eval然后跑 MMBench 或者 MMStar 的一个子集python -m lmms_eval --model glm4v --model_args pretrained/root/sj-tmp/GLM-4.1V-9B-Thinking/ --tasks mmbench --batch_size 1单卡 4090 跑 MMBench 完整集大概要几个小时建议先跑--limit 20看前 20 题的结果确认流程通了再全量跑。输出会给出准确率和官方报告的数值对比一下差距在 1-2 个百分点内属于正常波动。4.3 显存与速度实测用nvidia-smi监控显存。BF16 双卡加载后每卡约 10G单卡约 20G。生成速度方面BF16 单卡约 25-30 token/sINT8 约 35 token/sINT4 约 45 token/s。视觉编码阶段是瓶颈一张 1024x1024 的图编码要 1-2 秒视频按帧数线性增长。如果你发现显存溢出OOM优先降max_new_tokens和输入图像分辨率其次考虑量化。别一上来就 INT4先试 INT8。5. 常见报错排查5.1 401 与鉴权类错误本地部署一般不涉及 401但如果你是通过 API 网关调用比如把本地模型挂到统一入口可能会遇到401 Unauthorized。这类错误通常是 Key 没带或者 Base URL 配错。检查请求头里的Authorization: Bearer 你的Key以及 Base URL 是否指向正确的端点。如果用 TaoToken 这类聚合入口做统一管理Base URL 填https://taotoken.net/apiKey 在控制台生成模型 ID 填glm-4.1v-9b-thinking。三件套缺一不可。5.2 local proxy failed这个报错通常出现在requests或httpx走系统代理时。本地推理不涉及外网但下载权重或调 API 时可能触发。检查环境变量echo $http_proxy $https_proxy如果有值且你不需要代理直接unset http_proxy https_proxy。另外~/.netrc里如果有残留配置也可能干扰检查一下。5.3 reading choices 报错Error reading choices一般出现在调用兼容 OpenAI 格式的接口时返回体结构不符合预期。原因可能是模型服务返回的是流式但客户端按非流式解析或者返回了错误信息被当成正常响应。先打印原始 responseprint(response.status_code) print(response.text)看返回的 JSON 里有没有choices字段。如果没有多半是服务端报错了错误信息在error字段里。5.4 OAuth 与 token 过期如果你用 Claude Code 或类似工具接入可能会遇到 OAuth token 过期。这类工具通常有自己的凭证管理重新登录或者刷新 token 即可。如果是 Codex 的auth.json检查文件里的access_token和refresh_token是否还在有效期内过期就重新走一遍授权流程。配置文件路径一般在~/.config/下对应工具目录里。5.5 模型加载报 Unrecognized model这个前面提过transformers版本太低。升级pip install -U transformers如果升级后还报错检查trust_remote_codeTrue有没有加GLM-4.1V 的自定义模型类需要这个参数才会加载。5.6 CUDA out of memory最直接的解法是降 batch size、降图像分辨率、降max_new_tokens。如果都不行上量化。另外注意device_mapauto在多卡时可能分配不均可以手动指定device_map {: 0} # 全部放卡0 # 或者 device_map balanced # 均匀分配6. 接入与长期使用建议本地跑通之后如果你想把 GLM-4.1V-9B-Thinking 接到日常开发流里比如做文档批处理、图表问答服务建议用 API 方式统一管理避免每次都要起本地进程占显存。TaoToken 的控制台可以生成 API Key接入文档里有各语言的示例。模型对话页面能直接测试glm-4.1v-9b-thinking的返回效果确认没问题再写进代码。对于长期做编码和 Agent 任务的场景Coding Plan 更适合因为多模态推理和代码生成经常要混着用统一入口省得来回切配置。API Keys 页面管理凭证接入文档看具体调用格式模型对话做快速验证这三个入口配合起来基本覆盖了从测试到上线的流程。最后说个实际经验GLM-4.1V-9B-Thinking 的思维链输出有时候会比较长做批量任务时记得把max_new_tokens和超时时间都放宽不然容易截断。另外视觉 token 占用的上下文比纯文本大得多长文档加多图的场景要提前算好上下文预算别等到跑一半 OOM 才回头改。