在 Xinference 中部署 GLM-4V-9B 多模态模型:规格解析、引擎选择与启动实践
【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference
GLM-4V 是智谱 AI 推出的 GLM-4 系列最新一代开源预训练模型,同时具备chat(对话)与vision(视觉理解)两种能力。本文以仓库文档 doc/source/models/builtin/llm/glm-4v.rst 为主线,结合 Xinference 内置的模型注册表与引擎实现源码,带你完整掌握该模型的规格信息、vLLM / Transformers 双引擎的差异、启动命令的每个参数,以及如何通过 OpenAI 兼容 API 进行多模态推理调用。
模型概览:GLM-4 系列的多模态开源版本
根据 Xinference 内置模型注册表 xinference/model/llm/llm_family.json 中的定义,glm-4v 的核心元数据如下:
| 属性 | 值 |
|---|---|
| Context Length(上下文长度) | 8192 |
| Model Name(模型名) | glm-4v |
| Languages(支持语言) | en(英文)、zh(中文) |
| Abilities(模型能力) | chat(对话)、vision(视觉理解) |
| Description(模型描述) | GLM-4 系列最新一代预训练模型的开源版本,由智谱 AI(Zhipu AI)发布 |
| Architectures(模型架构) | ChatGLMModel |
| Model Type(模型类型) | chatglm |
从能力组合可以看出,glm-4v 是一个标准的多模态对话模型:既可以像普通 LLM 一样进行文本对话,也支持输入图片并结合图片内容回答问题。其架构类型为ChatGLMModel,底层沿用了 ChatGLM 家族的建模方式。
模型规格(Model Spec):9B PyTorch 权重,无量化分支
glm-4v 在当前仓库中只注册了一个规格(Model Spec 1),具体参数如下:
| 规格项 | 值 |
|---|---|
| Model Format(模型格式) | pytorch |
| Model Size(参数量) | 9 Billion(90 亿参数) |
| Quantizations(量化选项) | none(不量化,仅原精度权重) |
| Engines(可用推理引擎) | vLLM、Transformers |
| Model ID | zai-org/glm-4v-9b |
对应的模型来源(model_src)在注册表中被配置为三个主流模型分发平台(xinference/model/llm/llm_family.json):
- Hugging Face:
zai-org/glm-4v-9b,固定修订号01328faefe122fe605c1c127b62e6031d3ffebf7(该修订号确保了可复现的下载结果); - ModelScope:
ZhipuAI/glm-4v-9b,跟随master分支; - OpenMind Hub:
AI-Research/glm-4v-9b。
也就是说,启动模型时 Xinference 会根据你的配置自动从对应平台拉取权重,无需手动指定完整路径——只需给出模型名glm-4v与参数量9即可。
需要特别注意的两点
- 量化选项只有
none:该规格不提供 GPTQ、AWQ 等量化分支,因此启动时--quantization只能填none,模型将以 FP16 原精度加载(下文 Transformers 引擎加载逻辑中会看到torch_dtype=torch.float16的硬编码)。 - 引擎可选 vLLM 或 Transformers:两者在性能与部署约束上差异明显,下一节将分别说明。
启动命令逐参数解析
原文档给出了标准的启动命令,格式如下:
xinference launch --model-engine ${engine} --model-name glm-4v --size-in-billions 9 --model-format pytorch --quantization ${quantization}其中${engine}需替换为vllm或transformers,${quantization}需替换为none。实际可执行的命令示例:
# 使用 Transformers 引擎启动 xinference launch --model-engine transformers --model-name glm-4v --size-in-billions 9 --model-format pytorch --quantization none # 使用 vLLM 引擎启动 xinference launch --model-engine vllm --model-name glm-4v --size-in-billions 9 --model-format pytorch --quantization none各参数含义如下:
| 参数 | 含义 | 本模型的取值 |
|---|---|---|
--model-engine | 指定推理引擎,决定底层加载与调度框架 | vllm/transformers |
--model-name | Xinference 注册表中的模型名 | glm-4v |
--size-in-billions | 参数量(十亿),用于精确定位规格 | 9 |
--model-format | 权重格式 | pytorch |
--quantization | 量化方式,本规格无量化分支 | none |
命令执行成功后,Xinference 会返回一个包含模型 UID 的响应,后续所有推理请求都通过该 UID 访问模型实例。
引擎底层实现:Transformers 引擎的工作原理
glm-4v 的 Transformers 引擎实现在 xinference/model/llm/transformers/multimodal/glm4v.py,类Glm4VModel通过装饰器同时注册为多模态批处理模型与Transformer 模型。该实现有几个关键细节值得展开:
1. 权重加载方式
load_multimodal_model(glm4v.py)使用AutoModelForCausalLM加载权重,并显式指定:
torch_dtype=torch.float16:模型以 FP16 精度加载,这也是该规格不提供量化分支、推荐在具备足够显存的 GPU 上运行的原因;trust_remote_code=True(由allow_trust_remote_code决定):ChatGLM 系列需要运行远程代码(modeling_chatglm.py),必须开启;low_cpu_mem_usage=True与device_map:由decide_device根据device配置(默认auto)自动选择设备。
2. 单图限制:每轮消息最多一张图片
多模态消息预处理逻辑_get_processed_msgs(glm4v.py)表明:
- 消息内容支持 OpenAI 风格的
text/image_url两种内容块; - 每个消息只允许一张图片,若传入多张图片会抛出
RuntimeError("Only one image per message is supported"); - 图片通过
_decode_image解码后,以"image"字段拼入消息,再交给 tokenizer 的apply_chat_template处理。
3. 生成配置默认值
build_generate_kwargs(glm4v.py)和prepare_sanitize_generate_config(glm4v.py)定义了生成时的默认行为:
temperature默认0.7(若未在请求中显式指定,则在 sanitize 阶段回落为 0.8);top_p默认0.8;max_length默认取请求中max_tokens的值,缺省为2048;do_sample=True,即默认开启采样;eos_token_id为[151329, 151336, 151338],与注册表中的stop_token_ids一致。
4. 停止词与图像 token 注意力掩码
- 注册表中配置的
stop为["<|endoftext|>", "<|user|>", "<|observation|>"](llm_family.json),其中get_stop_strs在流式输出时以<|endoftext|>作为截断标记; - 视觉部分的关键实现是
get_full_attention_mask(glm4v.py):根据vision_config中的image_size与patch_size计算图像 patch 数((image_size // patch_size // 2) ** 2),在boi_token与eoi_token之间插入等长的全 1 注意力掩码,保证图像区域参与自注意力计算——这正是视觉输入能被模型"看见"的原理所在。
vLLM 引擎的部署约束
文档标注 glm-4v 可用 vLLM 引擎,但 vLLM 的多模态支持存在硬性平台要求。在 xinference/model/llm/vllm/core.py 中,多模态引擎的准入检查逻辑明确:
- 仅支持 Linux 系统;
- 仅支持 CUDA GPU、MLU GPU、VACC GPU 或 MUSA GPU;
- 仅支持
pytorch / gptq / awq / fp4 / fp8 / bnb格式(本模型的 pytorch 格式符合要求,但无量化分支); - 模型必须声明
vision、audio或omni能力(glm-4v 具备vision,满足条件)。
因此,若你的环境不满足上述 GPU 与操作系统条件,应改用 Transformers 引擎(CPU 或 Mac 等环境可尝试,但多模态推理对算力要求较高,建议优先使用 NVIDIA GPU)。
此外,从 llm_family.json 的virtualenv.packages可以看到,该模型的虚拟环境依赖按引擎条件化安装(#transformers_dependencies#/#vllm_dependencies#等),即选择不同引擎时只安装对应的推理依赖,避免环境臃肿。
推理调用:OpenAI 兼容的多模态请求
模型启动后,即可通过 Xinference 暴露的 OpenAI 兼容 Chat Completions API 进行多模态推理。典型的图片理解请求格式如下:
curl -X POST http://localhost:9997/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "<启动后返回的模型 UID>", "messages": [ { "role": "user", "content": [ {"type": "text", "text": "请描述这张图片的内容"}, {"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}} ] } ], "max_tokens": 512, "temperature": 0.7, "stream": true }'请求格式与 OpenAI 多模态接口保持一致,image_url同时支持公网图片地址与本地 base64 编码图片。需要注意上文提到的单图限制:一条 user 消息中最多携带一张图片;多轮对话中每一轮都可以附带一张新图片,模型会基于完整对话上下文与最新图片进行回答。
小结与使用建议
围绕 glm-4v 模型文档,本文完成了三件事:梳理了模型的完整规格(8192 上下文、9B 参数、chat + vision 能力、en/zh 双语);逐参数拆解了启动命令;并从 glm4v.py 与 vllm/core.py 源码层面验证了引擎实现的细节与约束。
实践要点回顾:
- 量化固定为
none,模型以 FP16 原精度加载,请预估约 18 GB 以上的显存占用(含 KV Cache 与运行时开销),显存不足时优先选择vllm引擎获得更好的批处理与显存管理; - vLLM 引擎仅限 Linux + 特定 GPU 平台,不满足条件时使用
transformers引擎; - 每轮消息仅支持一张图片,这是模型侧的实现限制,调用方需在应用层做好图片切分与多轮组织;
- 生成参数(
temperature=0.8、top_p=0.8)在未显式指定时由引擎自动填充,业务上如需确定性输出可显式设置更低的温度值。
通过上述命令与接口,你可以把 GLM-4V-9B 快速接入到现有的 OpenAI 兼容生态中,实现图像问答、视觉理解等多模态应用。
【免费下载链接】inferenceSwap GPT for any LLM by changing a single line of code. Xinference lets you run open-source, speech, and multimodal models on cloud, on-prem, or your laptop — all through one unified, production-ready inference API.项目地址: https://gitcode.com/GitHub_Trending/in/inference
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考