把 GLM-OCR、DeepSeek-OCR-2、Dots.
手头有几个不同来源的 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-ai或ModelTC都有现成转好的),三模型共享一张 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
免费 AI 工具箱 · 全部完全免费
之前在本地跑过类似的,但环境配置总有点小麻烦,Colab直接跑省心不少
有空把notebook里的关键参数也记录一下,方便后面复现