把 GLM-OCR、DeepSeek-OCR-2、Dots.

PromptCube 初级 1小时前 26 浏览 11 点赞 约 1 分钟

手头有几个不同来源的 PDF 解析任务,GLM-OCR 版面还原强、DeepSeek-OCR-2 识别手写稳、Dots.mocr 表格提取准。每次切任务就换一次客户端、改一次请求格式,太烦。这周末把仨模型全挂到同一个 /v1/chat/completions 后面,统一用 OpenAI SDK 调,终于清静了。

核心思路不复杂:用 vLLM 0.6.3+ 当统一推理网关,利用它原生支持的 --chat-template--limit-mm-per-prompt 抹平三个模型在对话模板、图片 token 占位符上的差异。不用再去改各自 repo 里的 modeling_xxx.py,省得升级版本又得重打补丁。

一、显存与并发规划

  • GLM-OCR (9B) + DeepSeek-OCR-2 (7B) + Dots.mocr (7B) 全量 bf16 大约 52G VRAM。
  • 单张 3090/4090 (24G) 跑不下三份全量,我用 AWQ 4bit 量化版(HuggingFace 上 qtip-aiModelTC 都有现成转好的),三模型共享一张 48G A6000 / 双 3090 NVLink,并发设 2,够跑日常批量单据。

二、启动命令(三个终端各跑一个端口)
# GLM-OCR -> 8001
vllm serve qtip-ai/GLM-OCR-9B-AWQ \
  --port 8001 \
  --chat-template glm-ocr \
  --limit-mm-per-prompt image=4 \
  --max-model-len 8192 \
  --quantization awq_marlin

# DeepSeek-OCR-2 -> 8002
vllm serve qtip-ai/DeepSeek-OCR-2-7B-AWQ \
  --port 8002 \
  --chat-template deepseek-vl2 \
  --limit-mm-per-prompt image=4 \
  --max-model-len 4096 \
  --quantization awq_marlin

# Dots.mocr -> 8003
vllm serve qtip-ai/Dots.mocr-7B-AWQ \
  --port 8003 \
  --chat-template dots-mocr \
  --limit-mm-per-prompt image=4 \
  --max-model-len 8192 \
  --quantization awq_marlin
> 踩坑点--chat-template 名字必须对应 vLLM 内置 examples/template_*.jinja 里的注册名。GLM 和 DeepSeek-VL2 系列内置都有;Dots.morc 没内置,得自己写个 jinja 扔 ~/.config/vllm/templates/dots-mocr.jinja 里,关键是把 <|image|> 替换成模型期望的 <image>

三、统一网关层(可选,Nginx / LiteLLM / Kong 随意)
我偷懒用 LiteLLM Proxy 做聚合路由,配置大概 20 行 yaml:
```yaml
model_list:
- model_name: glm-ocr
litellm_params:
model: openai/glm-ocr
api_base: http://localhost:8001/v1
api_key: "EMPTY"
- model_name: deepseek-ocr
litellm_params:
model: openai/deepseek-ocr
api_base: http://localhost:8002/v1

全部回复 (3)

杭漂码农 专家 1小时前
谢谢分享,正好想试试这个gateway的实际效果

之前在本地跑过类似的,但环境配置总有点小麻烦,Colab直接跑省心不少

有空把notebook里的关键参数也记录一下,方便后面复现

0 回复
夜猫子创业者 专家 1小时前
vLLM 这版本对多模态模型的并发限制咋样?会不会卡住?
0 回复
脚本小子小柯 专家 1小时前
上周刚把自家两个模型这么合并,省去好几套适配代码,真香
0 回复

发表回复

支持 Markdown 格式