日前,智谱开源发布了专为复杂文档理解设计的多模态 OCR 模型 GLM-OCR。该模型基于 GLM-V 编码器 - 解码器架构,集成了在大规模图文数据上预训练的 CogViT 视觉编码器、具有高效令牌下采样机制的轻量级跨模态连接器,以及 GLM-0.5B 语言解码器。为进一步提升性能,GLM-OCR 引入了多令牌预测(MTP)损失函数和稳定的全任务强化学习机制,并结合基于 PP-DocLayout-V3 的“版面分析与并行识别”两阶段流程,显著提高了训练效率、识别准确率和泛化能力,在各种文档布局中均展现出强大且高质量的 OCR 性能。

 

凭借这些技术优势,GLM-OCR 能够广泛适用于多种实际场景,包括:文档数字化与归档、发票/票据自动识别、合同/报告信息抽取、学术论文公式识别、复杂表格结构化以及代码截图文字提取。

 

GitHub: https://github.com/zai-org/GLM-OCR

模型链接:https://modelscope.cn/models/ZhipuAI/GLM-OCR

 

模型核心特性

特性 描述
SOTA 性能 OmniDocBench V1.5 综合排名第一(94.62 分)
轻量高效 仅 0.9B 参数,支持端侧部署
全场景覆盖 公式识别、表格识别、代码文档、印章等
易于集成 提供完整 SDK,一行代码调用
多部署方式 支持 vLLM、SGLang、Ollama、MLX 等

 

模型架构

 

模型下载

从 ModelScope 下载

# 安装 ModelScope SDK
pip install modelscope
modelscope download ZhipuAI/GLM-OCR --local_dir ./GLM-OCR

模型推理

使用 ModelScope 推理(兼容Transformers)

from modelscope import AutoModel, AutoTokenizer, AutoProcessor
from PIL import Image
# 加载模型和处理器
model_path = "ZhipuAI/GLM-OCR"  # 或本地路径
model = AutoModel.from_pretrained(
    model_path,
    trust_remote_code=True,
    torch_dtype="auto",
    device_map="auto"
)
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
# 加载图像
image = Image.open("document.png")
# 构建输入
prompt = "Recognize the text in the image and output in Markdown format."
messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": image},
            {"type": "text", "text": prompt}
        ]
    }
]
# 处理输入
inputs = processor(
    messages,
    return_tensors="pt",
    padding=True
).to(model.device)
# 生成输出
outputs = model.generate(
    **inputs,
    max_new_tokens=4096,
    temperature=0.8,
    top_p=0.9,
    do_sample=True
)
# 解码结果
result = processor.batch_decode(outputs, skip_special_tokens=True)[0]
print(result)

 

使用 GLM-OCR SDK 推理

便捷函数调用

from glmocr import parse
# 解析单张图片
result = parse("document.png")
# 查看结果
print(result.markdown_result)  # Markdown 格式
print(result.json_result)      # JSON 结构化格式
# 保存结果
result.save(output_dir="./output")

 

类接口调用

from glmocr import GlmOcr
# 使用上下文管理器
with GlmOcr() as parser:
    # 单张图片
    result = parser.parse("document.png")
    # 多页文档(作为同一文档的多页处理)
    results = parser.parse(["page1.png", "page2.png", "page3.png"])
    # URL 输入
    result = parser.parse("https://example.com/document.png")
    # 获取结果
    print(result.json_result)
    print(result.markdown_result)
    print(result.to_dict())
    # 保存结果
    result.save(output_dir="./results")

 

CLI 命令行使用

# 解析单张图片
glmocr parse document.png
# 解析整个目录
glmocr parse ./documents/
# 指定输出目录
glmocr parse document.png --output ./results/
# 使用自定义配置
glmocr parse document.png --config my_config.yaml
# 开启调试日志
glmocr parse document.png --log-level DEBUG

输出格式说明

JSON 格式

[
  [
    {
      "index": 0,
      "label": "doc_title",
      "content": "Annual Financial Report 2024",
      "bbox_2d": [100, 50, 900, 120]
    },
    {
      "index": 1,
      "label": "text",
      "content": "This report presents the financial performance...",
      "bbox_2d": [100, 140, 900, 400]
    },
    {
      "index": 2,
      "label": "table",
      "content": "| Item | Q1 | Q2 |\n|------|-----|-----|\n| Revenue | $1M | $1.2M |",
      "bbox_2d": [100, 420, 900, 600]
    }
  ]
]

 

Markdown 格式

# Annual Financial Report 2024
This report presents the financial performance...
| Item | Q1 | Q2 |
|------|-----|-----|
| Revenue | $1M | $1.2M |

高级配置

编辑 glmocr/config.yaml 进行自定义配置:

pipeline:
  # 页面加载器配置
  page_loader:
    max_tokens: 4096        # 最大生成 token 数
    temperature: 0.8        # 采样温度
    top_p: 0.9             # Top-p 采样
    image_format: JPEG      # 图像格式
    min_pixels: 12544       # 最小像素数
    max_pixels: 71372800    # 最大像素数
  # 版面检测配置(可选)
  enable_layout: true       # 启用版面检测
  layout:
    model_dir: PaddlePaddle/PP-DocLayoutV3_safetensors
    threshold: 0.3          # 检测阈值
  # 结果格式化
  result_formatter:
    output_format: both     # json, markdown, 或 both

模型部署

部署方式概览

部署方式 适用场景 性能 易用性
MaaS 云服务 快速测试、无 GPU 依赖网络 ⭐⭐⭐⭐⭐
vLLM 生产环境、高并发 ⭐⭐⭐⭐⭐ ⭐⭐⭐
SGLang 生产环境、低延迟 ⭐⭐⭐⭐⭐ ⭐⭐⭐
Ollama 本地测试、CPU 推理 ⭐⭐⭐ ⭐⭐⭐⭐⭐
MLX Apple Silicon Mac ⭐⭐⭐⭐ ⭐⭐⭐

Ollama 部署

Ollama 是最简单的本地部署方式,适合快速测试和 CPU 推理场景。

  • 安装 Ollama
# macOS / Linux
curl -fsSL https://ollama.ai/install.sh | sh
# Windows
# 从 https://ollama.ai/download 下载安装程序
# 验证安装
ollama --version
  • 拉取模型并启动服务
# 启动服务(默认端口 11434)
ollama run glm-ocr Text Recognition: ./image.png

 

vLLM 部署

  • 安装 vLLM
# 使用 pip 安装
uv pip install -U vllm --torch-backend=auto --extra-index-url https://wheels.vllm.ai/nightly
# 或使用 Docker
docker pull vllm/vllm-openai:nightly
  • 安装最新 Transformers
# vLLM 需要最新版 transformers
uv pip install git+https://github.com/huggingface/transformers.git
  • 启动 vLLM 服务
# 基础启动
VLLM_USE_MODELSCOPE=true vllm serve zai-org/GLM-OCR \
  --allowed-local-media-path / \
  --port 8080 \
  --served-model-name glm-ocr
# 启用 MTP 加速(推荐)
VLLM_USE_MODELSCOPE=true vllm serve zai-org/GLM-OCR \
  --allowed-local-media-path / \
  --port 8080 \
  --speculative-config '{"method": "mtp", "num_speculative_tokens": 1}' \
  --served-model-name glm-ocr
  • Docker 部署
docker run --gpus all \
  -v /path/to/images:/data \
  -p 8080:8080 \
  vllm/vllm-openai:nightly \
  --model zai-org/GLM-OCR \
  --allowed-local-media-path /data \
  --served-model-name glm-ocr
  • 配置 SDK
pipeline:
  maas:
    enabled: false
  ocr_api:
    api_host: localhost
    api_port: 8080
    api_path: /v1/chat/completions    # OpenAI 兼容端点
    model: glm-ocr                     # 匹配 --served-model-name
    api_mode: openai
  • 性能调优参数
VLLM_USE_MODELSCOPE=true vllm serve zai-org/GLM-OCR \
  --allowed-local-media-path / \
  --port 8080 \
  --served-model-name glm-ocr \
  --speculative-config '{"method": "mtp", "num_speculative_tokens": 1}' \
  --max-model-len 8192 \              # 最大序列长度
  --gpu-memory-utilization 0.9 \      # GPU 内存利用率
  --max-num-seqs 16 \                 # 最大并发序列数
  --tensor-parallel-size 1            # 张量并行(多 GPU)

SGLang 部署

  • 安装 SGLang
# 使用 Docker
docker pull lmsysorg/sglang:dev
# 或从源码安装
uv pip install git+https://github.com/sgl-project/sglang.git
#subdirectory
=python

 

  • 启动 SGLang 服务
# 安装 transformers
uv pip install git+https://github.com/huggingface/transformers.git
# 基础启动
SGLANG_USE_MODELSCOPE=true python -m sglang.launch_server \
  --model zai-org/GLM-OCR \
  --port 8080 \
  --served-model-name glm-ocr
# 启用 MTP 加速(推荐)
SGLANG_USE_MODELSCOPE=true python -m sglang.launch_server \
  --model zai-org/GLM-OCR \
  --port 8080 \
  --speculative-algorithm NEXTN \
  --speculative-num-steps 3 \
  --speculative-eagle-topk 1 \
  --speculative-num-draft-tokens 4 \
  --served-model-name glm-ocr

 

  • 配置 SDK

配置与 vLLM 相同(都使用 OpenAI 兼容接口):

pipeline:
  maas:
    enabled: false
  ocr_api:
    api_host: localhost
    api_port: 8080
    api_path: /v1/chat/completions
    model: glm-ocr
    api_mode: openai

MLX 部署(Apple Silicon)

MLX 是 Apple 专为 Apple Silicon 优化的机器学习框架

  • 环境要求
  • Apple Silicon Mac(M1/M2/M3 系列)
  • macOS 14.0 (Sonoma) 或更高版本
  • Python 3.10+

 

  • 设置双环境

由于依赖版本冲突,需要两个独立的 Python 环境

# 环境 1: mlx-vlm 服务器
conda create -n mlx-env python=3.12 -y
conda activate mlx-env
pip install git+https://github.com/Blaizzy/mlx-vlm.git
# 环境 2: GLM-OCR SDK
conda create -n sdk-env python=3.12 -y
conda activate sdk-env
cd glm-ocr
pip install -e .
pip install git+https://github.com/huggingface/transformers.git

 

  • 启动 mlx-vlm 服务
# 终端 1
conda activate mlx-env
mlx_vlm.server --trust-remote-code
# 服务运行在 http://localhost:8080

 

  • 配置 SDK
pipeline:
  maas:
    enabled: false
  ocr_api:
    api_host: localhost
    api_port: 8080
    model: mlx-community/GLM-OCR-bf16  # MLX 模型
    api_path: /chat/completions        # 注意:没有 /v1 前缀
    verify_ssl: false

 

  • 运行 SDK
# 终端 2
conda activate sdk-env
glmocr parse document.png

 

Flask Web 服务部署

GLM-OCR SDK 内置了 Flask Web 服务,便于集成到现有系统。

# 启动服务
python -m glmocr.server
# 指定端口和日志级别
python -m glmocr.server --port 5002 --log-level DEBUG

 

API 调用示例:

curl -X POST http://localhost:5002/glmocr/parse \
  -H "Content-Type: application/json" \
  -d '{"images": ["./document.png"]}'

 

模型微调

ms-swift支持了对GLM-OCR进行微调,训练和推理脚本参考:https://github.com/modelscope/ms-swift/tree/main/examples/train/multimodal

在开始微调之前,请确保您的环境已准备妥当。

# pip install git+https://github.com/modelscope/ms-swift.git
git clone https://github.com/modelscope/ms-swift.git
cd ms-swift
pip install -e .
pip install "transformers==5.1.0"

 

如果您需要自定义数据集微调模型,你可以将数据准备成以下格式,并在命令行中设置--dataset train.jsonl --val_dataset val.jsonl,验证集为可选。

{"messages": [{"role": "user", "content": "<image>Text Recognition:"}, {"role": "assistant", "content": "..."}], "images": ["/xxx/x.jpg"]}
{"messages": [{"role": "user", "content": "<image>Formula Recognition:"}, {"role": "assistant", "content": "xxx"}], "images": ["/xxx/x.jpg"]}
{"messages": [{"role": "user", "content": "<image>Table Recognition:"}, {"role": "assistant", "content": "xxx"}], "images": ["/xxx/x.jpg"]}

 

示例微调脚本如下,显存占用为4GiB:

CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model ZhipuAI/GLM-OCR \
    --dataset 'AI-ModelScope/LaTeX_OCR:human_handwrite
#20000
' \
    --load_from_cache_file true \
    --split_dataset_ratio 0.01 \
    --tuner_type lora \
    --torch_dtype bfloat16 \
    --num_train_epochs 1 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --learning_rate 1e-4 \
    --lora_rank 8 \
    --lora_alpha 32 \
    --target_modules all-linear \
    --freeze_vit true \
    --freeze_aligner true \
    --gradient_accumulation_steps 16 \
    --eval_steps 50 \
    --save_steps 50 \
    --save_total_limit 2 \
    --logging_steps 5 \
    --max_length 4096 \
    --output_dir output \
    --warmup_ratio 0.05 \
    --dataset_num_proc 4 \
    --dataloader_num_workers 4

 

训练完成后,使用以下命令对验证集进行推理:

swift infer \
    --adapters output/vx-xxx/checkpoint-xxx \
    --stream true \
    --load_data_args true \
    --max_new_tokens 2048

 

推送模型到ModelScope:

swift export \
    --adapters output/vx-xxx/checkpoint-xxx \
    --push_to_hub true \
    --hub_model_id '<your-model-id>' \
    --hub_token '<your-sdk-token>'

 

点击即可跳转模型链接https://modelscope.cn/models/ZhipuAI/GLM-OCR

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐