跳到主要内容

多模态视觉语言模型

CogVLM 本地部署:从 Int4 的 16GB 单卡 到 BF16 的 42GB,把显存账算清楚

视觉专家(visual expert)架构让 CogVLM 的显存开销比同参数量的纯文本模型高出一截。官方给过数字,我们把每一档对应到真正租得到的卡。

CogVLM 出自清华 KEG 与智谱,代码仓库和权重现在都挂在 zai-org 名下,Hugging Face 上原来的 THUDM/* 路径会自动跳到 zai-org/*,两种写法都能拉到权重。它和大多数 VLM 的区别在架构:不是把视觉特征拼进文本序列了事,而是在每个 Transformer 层里额外挂一套「视觉专家」权重。初代 CogVLM-17B 是 10B 视觉参数加 7B 语言参数(底座 Vicuna-7B-v1.5),CogVLM2 换成 Meta-Llama-3-8B-Instruct 底座,做成 19B。

这套架构的代价直接写在显存上。官方 basic_demo 的表格很明确:19B 系列 BF16 推理 42GB,Int4 推理 16GB,两者都是在 2K 对话长度下实测的。cli_demo.py 里甚至硬编码了一道检查——发现显存不足 48GB 而你又没开量化,它就会提示你改用多卡脚本或者加量化参数。再叠上 1344×1344 的输入分辨率带来的大量视觉 token,预填充阶段的峰值只会更难看。所以「CogVLM 需要多大显存」这个问题没有一个数字,只有一张表。

还有一件必须说清楚的事:CogVLM2 停在 2024 年 5 月,这条线的后继在 zai-org/GLM-V 仓库里——GLM-4.1V-9B-Thinking(2025-07-01,64K 上下文)、GLM-4.5V(2025-08-11)、以及 GLM-4.6V 与 GLM-4.6V-Flash(2026-04-02,128K 上下文,Flash 走 MIT 许可)。全新项目应该从 GLM-4.6V-Flash 起步,而不是从 CogVLM2 起步。但 cogvlm2-llama3-chat-19B 月下载量仍在七千次以上,grounding-generalist 那种专做框选的老权重也还有人留着,已上线的 pipeline 更不会为了换代重跑一遍评测——这页就是写给还要真刀真枪把它跑起来的人。

01 —

CogVLM 家族现有版本与显存对照

数字取自官方 basic_demo 表格与模型卡;官方没公布的地方我们直接留白,不替你猜。

版本参数量显存上下文说明
cogvlm2-llama3-chinese-chat-19B19B(Llama-3-8B-Instruct 底座 + 视觉专家)BF16 约 42GB / Int4 约 16GB8K 文本中英双语图像理解与多轮对话,输入分辨率最高 1344×1344,中文私有化场景默认就选它。
cogvlm2-llama3-chat-19B(含官方 -int4 权重)19BBF16 约 42GB / Int4 约 16GB8K 文本纯英文版。官方单独发了 -int4 仓库,用 bitsandbytes 4-bit,模型卡写明只能在 Linux + NVIDIA 上跑。
cogvlm2-video-llama3-chat / -base19B与 19B 系列同级,BF16 约 42GB2K 文本视频理解版,固定抽 24 帧、每帧 224×224,且只支持单轮对话。别拿它当图像模型用,分辨率差了一个数量级。
cogagent-9b-202412209B(GLM-4V-9B 底座)BF16 约 29GB / INT8 约 15GB / INT4 约 8GBdemo 默认 max_length 4096GUI Agent 执行模型而非聊天模型:看截图输出点击、输入、滚动等动作,支持 Windows / macOS / Android,分辨率 1120×1120。官方明确提醒 INT4 掉点明显、不建议用。
cogvlm-chat-hf(初代 CogVLM-17B)17B(10B 视觉 + 7B 语言,Vicuna-7B-v1.5)FP16 约 40GB / INT4 约 11GB约 4K(随 Vicuna-7B-v1.5 底座)490×490 分辨率,另有 base-224、base-490、grounding-generalist 三个兄弟。同期的 CogAgent-18B 是 11B 视觉 + 7B 语言、1120×1120,INT4 约 12.6GB。
GLM-4.6V / GLM-4.6V-Flash(后继线,zai-org/GLM-V)106B / 9B官方未公布显存表;106B 另发 FP8 权重128K2026-04-02 发布,vLLM 与 SGLang 都能直接 serve。Flash 为 MIT 许可,新项目从这里开始,别再从 CogVLM2 开始。

02 —

按变体选卡:NexGPU 上的四种打法

显存对得上才有意义。42GB 的 BF16 不会因为你想省钱就塞进 24GB。

  • Int4 跑 CogVLM2-19B(16GB),或初代 CogVLM-17B INT4(11GB)、CogAgent-18B INT4(12.6GB)

    RTX 3090 24GB$0.193/卡·时

    官方 INT4 指标本来就是按 1 张 RTX 3090(24G) 标定的,24GB 还能给 1344×1344 带来的视觉 token 留出预填充余量。

  • BF16 全精度单卡跑 cogvlm2-llama3-chinese-chat-19B(42GB)

    RTX A6000 48GB$0.817/卡·时

    cli_demo.py 里写死了 48GB 这道门槛:低于它又不量化就会被劝去改多卡。48GB 正好是脚本不啰嗦、你也不用碰 device_map 的那一档。

  • cogagent-9b-20241220 做 GUI Agent(BF16 29GB)

    RTX 5090 32GB$0.723/卡·时

    29GB 进 32GB 刚刚好,不用掉到官方不推荐的 INT4。而且这是整条线里唯一能被 vLLM 以 GLM4VForCausalLM 架构直接 serve 的成员,吞吐不再卡在 HF generate 上。

  • 解冻视觉专家做 BF16 LoRA 微调(官方 73GB/卡,8 卡 DeepSpeed ZeRO-2)

    A100 SXM4 80GB × 8$1.088/卡·时(8 卡合计 $8.704/时)

    官方就是在 8×A100 80G + ZeRO-2 上跑通的,照抄配置最省事。NexGPU 单节点最多 14 卡,8 卡开在同一台机器里,省掉跨机 NCCL 的调试时间。

03 —

在 NexGPU 上把 CogVLM2 跑起来

四步,从一台空实例到 OpenAI 兼容接口。踩不踩坑的分界线在第二步。

  1. 01

    开一台显存对得上的实例

    在 console.nexgpu.net 选卡:Int4 走 RTX 3090 24GB,BF16 全精度走 RTX A6000 48GB,GUI Agent 走 RTX 5090 32GB。镜像直接挑 PyTorch 预置镜像(平台有 2000+ 预置镜像,vLLM、ComfyUI、Jupyter 都在列),SSH、Jupyter、Web 终端、REST API、CLI 五种入口默认都开着。按秒计费、按小时定价,没有最低消费、没有开通费、不用提工单申请配额。

  2. 02

    先钉住 transformers 版本,这是最大的坑

    CogVLM2 靠 trust_remote_code=True 加载仓库自带的建模文件,而 basic_demo/requirements.txt 只写了 transformers>=4.40,没有上限。装到新版本会直接抛 AttributeError: 'CogVLMForCausalLM' object has no attribute '_extract_past_from_model_output'——仓库 issue 里有人在 transformers 4.52.4 上复现。新版 GenerationMixin 已经把这个内部方法删了,而远端建模代码还在调它。把版本压回 4.45 之前,再谈别的。

    pip install "transformers<4.45" "bitsandbytes>=0.43.1" accelerate xformers torchvision timm einops sse-starlette
  3. 03

    拉权重,按显存选量化档

    cli_demo.py 的 --quant 只接受 4 或 8,默认 0 表示不量化。24GB 单卡就用 --quant 4。要多卡的话走 cli_demo_multi_gpus.py,它用 infer_auto_device_map 并设了 no_split_module_classes=["CogVLMDecoderLayer"],官方在 3 张 16GB 卡上实测每卡占 13–14.5GB;但注意脚本对 2 卡及以下写死了每卡 16GiB 上限,你要跑 BF16 得自己把 max_memory 调高,否则会被切得装不下。另外初代 CogVLM 的 tokenizer 不在模型仓库里,要从 lmsys/vicuna-7b-v1.5 单独加载 LlamaTokenizer。

    huggingface-cli download zai-org/cogvlm2-llama3-chinese-chat-19B --local-dir ./cogvlm2-zh && python basic_demo/cli_demo.py --quant 4
  4. 04

    对外暴露接口,并想清楚要不要 vLLM

    basic_demo/openai_api_demo.py 会起一个 OpenAI 格式的服务,前端和现有网关可以直接对接;web_demo.py 走 chainlit 出一个交互页面。但别去找 vLLM 上的 CogVLM——CogVLM 和 CogVLM2 的架构从来没进过 vLLM 支持列表,能被 vLLM serve 的只有 cogagent-9b-20241220(GLM4VForCausalLM)以及 GLM-4.1V、GLM-4.5V、GLM-4.6V 那条线。要连续批处理和 PagedAttention,就得换模型,不是换参数。

    python basic_demo/openai_api_demo.py   # 需要吞吐时改用:vllm serve zai-org/cogagent-9b-20241220 --trust-remote-code

一笔真实的账:给两万张图做中文标注

用 cogvlm2-llama3-chinese-chat-19B 的 BF16 权重批量打标,选 RTX A6000 48GB,$0.817/卡·时。开机、下载 19B 的 BF16 权重(约 38GB safetensors)、装依赖,按 25 分钟算:0.42 × $0.817 ≈ $0.34。跑 6 小时批处理:6 × $0.817 = $4.90。导出 2GB 结果,出网按中位价 $0.0081/GB 计 ≈ $0.02。合计约 $5.26。换成 Int4 档呢?RTX 3090 24GB 是 $0.193/卡·时,同样 6 小时是 6 × $0.193 = $1.16,不到前者的四分之一——代价是量化掉点,做粗筛可以,出终稿别用。另有一个容易算错的对比:官方多卡脚本在 3 张 16GB 卡上实测每卡只占 13–14.5GB,看着很省,可 3 张 Tesla T4 16GB 是 3 × $0.298 = $0.894/时,比单张 A6000 的 $0.817/时 还贵,还要多调一套 device_map。在这个模型上,多卡不是省钱手段,是没办法时的办法。最后记得:计费按秒计、按小时定价,实例一停算力费就停;只有存储会一直算到卷被销毁为止(中位价 $0.414/GB·月,权重加缓存约 60GB 就是 $24.84/月),跑完顺手把不用的卷删掉。

04 —

常见问题

CogVLM2-19B 本地部署到底需要多大显存?

官方 basic_demo 给的是:BF16 推理 42GB,Int4 推理 16GB,都在 2K 对话长度下实测。cli_demo.py 还硬编码了 48GB 这道提示线,低于它又不量化就会劝你改多卡。所以 24GB 卡只能跑 Int4,全精度请直接上 48GB。在 NexGPU 上这两档分别是 RTX 3090 24GB $0.193/卡·时 和 RTX A6000 48GB $0.817/卡·时,按秒计费,试完就停。

CogVLM 能用 vLLM 部署吗?为什么我 serve 不起来?

因为它压根不在支持列表里。vLLM 的多模态架构列表里有 GLM4VForCausalLM(对应 glm-4v-9b 和 cogagent-9b-20241220)、Glm4vForConditionalGeneration(GLM-4.1V-Thinking)、Glm4vMoeForConditionalGeneration(GLM-4.5V),唯独没有 CogVLM 或 CogVLM2。CogVLM2 只能走 HF transformers 的 trust_remote_code 路径,等于放弃连续批处理。要吞吐就换 cogagent-9b-20241220 或 GLM-4.6V-Flash——NexGPU 的 2000+ 预置镜像里 vLLM 和 PyTorch 都现成,开两台实例并排比一下再定。

为什么装完依赖直接报 _extract_past_from_model_output 找不到?

transformers 装太新了。仓库 requirements.txt 只写 transformers>=4.40 而没有上限,新版 GenerationMixin 删掉了这个内部方法,远端建模代码却还在调用,issue 里有人在 4.52.4 上复现了同样的报错。解法是把 transformers 压回 4.45 之前。类似的还有 4-bit 加多卡时的 'Params4bit' object has no attribute '_parameters',以及默认脚本只用一张卡的问题。这类版本试错在按秒计费的实例上代价极低——NexGPU 上开一台 RTX 3090 试半小时不到一毛钱。

CogVLM 是不是已经被 GLM-4.6V 取代了,还值得部署吗?

这条线确实换代了:后继在 zai-org/GLM-V,依次是 GLM-4.1V-9B-Thinking(2025-07-01,64K)、GLM-4.5V(2025-08-11)、GLM-4.6V 与 GLM-4.6V-Flash(2026-04-02,128K,Flash 为 MIT)。新项目应该从那边起步。但 cogvlm2-llama3-chat-19B 月下载仍有七千多次,grounding-generalist 这类专用权重、以及已经调好 prompt 的老 pipeline,都没有理由为了换代重跑一遍评测。想做 A/B,NexGPU 上同一个账号可以同时开 RTX A6000 跑 CogVLM2、开 RTX 5090 跑 GLM-4.6V-Flash,跑完直接比。

CogVLM 的权重可以商用吗?

代码是 Apache-2.0,但权重不是:CogVLM 权重走单独的 Model License,学术用途开放、商用需要登记;CogVLM2 的权重是 CogVLM2 LICENSE,用到 Llama-3 底座的还要叠 Meta 的 LLAMA3_LICENSE。相比之下后继的 GLM-4.6V-Flash 是 MIT。许可怎么选是你的法务问题,算力这一侧我们不设门槛:NexGPU 按秒计费、无最低消费、无开通费、不用申请配额,中英双语支持走 Telegram,没有工单队列。

微调 CogVLM2 需要几张卡?

官方给的数字是 BF16 LoRA 且解冻视觉专家时 73GB/卡,配置为 8×A100 80G 加 DeepSpeed ZeRO-2,训练文本长度 2K。冻住视觉专家能省不少,但 19B 的量级摆在那儿,别指望消费级单卡。NexGPU 的 A100 SXM4 80GB 是 $1.088/卡·时,八卡合计 $8.704/时;单节点最多 14 卡、最大节点显存 2,152GB,8 卡能开在同一台机器上,省掉跨机通信调优。全网 1,175 个已验证可租节点、2,498 张 GPU、75 种卡型,跨 51 个国家和地区。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。