日前,智谱开源发布了专为复杂文档理解设计的多模态 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>'