minicpmvocr-sdk
安装、部署和验证 MiniCPM-OCR 1.0 文档解析(PDF / 图片 → Markdown)。在用户要安装 minicpmvocr SDK、启动 vLLM 或 transformers 推理服务(含 DSpark 加速版)、解析文档、排查安装与推理报错,或做 vLLM 与 transformers 双端逐字验证时使用。
Source facts
- Repository
- OpenBMB/MiniCPM-OCR
- Last source activity
- October 28, 2026 at 12:40
- Detected SKILL.md language
- Chinese
- Stars
- 139
- Forks
- 10
Install options
The review-first prompt is selected by default. You can switch to a direct command or download a local copy.
Review the source files
Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.
File Explorer
44 filesShowing SKILL.md
SKILL.md
Source instructions · Read-only preview- name
- minicpmvocr-sdk
- description
- 安装、部署和验证 MiniCPM-OCR 1.0 文档解析(PDF / 图片 → Markdown)。在用户要安装 minicpmvocr SDK、启动 vLLM 或 transformers 推理服务(含 DSpark 加速版)、解析文档、排查安装与推理报错,或做 vLLM 与 transformers 双端逐字验证时使用。
# MiniCPM-OCR 1.0 部署
SDK(`minicpmvocr`)负责版面检测(PP-DocLayoutV3)、切块、拼接和并发调度,通过 HTTP 调用推理服务。SDK 和推理服务装在不同的 venv 里。
## 1. 确定方案
先问清用户用哪个推理后端、SDK 与服务是否在同一台机器。用户没有偏好时用默认方案。
| 用户目标 | 环境 |
|---|---|
| 解析文档(默认) | `sdk-env` + `vllm-ocr-env`,DSpark 加速版 |
| 不想编译 vLLM | `sdk-env` + `tf-ocr-env` |
| 已有 llama.cpp / OpenAI 兼容服务 | 只装 `sdk-env` |
| vLLM 与 transformers 双端逐字验证 | 两个推理环境,或合并的 `ocr-env`(见第 7 节) |
- 推理环境只装一个,除非用户要做双端验证。
- `sdk-env` 不能和 torch / vLLM 装在一起,否则 numpy、opencv 版本冲突。
- SDK 可以在没有 GPU 的机器上运行,用 `--server-url` 或 SSH 隧道连接远程服务。
## 2. 安装前检查
```bash
nvidia-smi # 显存 ≥ 24 GB,驱动 ≥ 580
nvidia-smi --query-compute-apps=pid,used_memory --format=csv # 找一张空闲卡
df -h . # 剩余 ≥ 20 GB
```
- 驱动 535–579 跑不了默认组合(torch cu130)。告诉用户需要升级驱动,或改用 torch cu126 自行编译 vLLM(A100 上验证过,本 skill 不覆盖)。
- vLLM 环境需要 Python ≥ 3.11;SDK 和 transformers 环境 ≥ 3.10。
需要用户提供的路径(没有给出时先问,不要猜):
| 占位符 | 含义 |
|---|---|
| `<SDK_REPO>` | 官方仓库地址:`https://github.com/OpenBMB/MiniCPM-OCR.git` |
| `<VLLM_SRC>` | feat-ocr vLLM 源码目录(commit `5c2b92a5dc`) |
| `<TRANSFORMERS_SRC>` | feat-ocr transformers 源码目录(commit `69eafbc5bd`) |
以下命令都在同一个工作目录下执行:环境建在 `./sdk-env` 等目录,模型在 `./models/`,仓库克隆到 `./minicpmvocr-sdk/`,SDK 源码在其 `sdk/` 子目录。
## 3. 安装
### 3.1 sdk-env
```bash
python3 -m venv sdk-env && source sdk-env/bin/activate
pip install paddlepaddle-gpu==3.3.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu129/
# 没有 GPU 时改装 CPU 版:pip install paddlepaddle==3.2.1
git clone <SDK_REPO> minicpmvocr-sdk
pip install -e "./minicpmvocr-sdk/sdk[all]"
pip install paddlex==3.4.2
minicpmvocr list-backends
```
通过标准:输出包含 `vllm`、`llamacpp`、`openai` 后端和 `ppdoclayout3_paddlex`、`ppdoclayout3_torch`、`ppdoclayout3_server` 三个版面 provider。
装的是 CPU 版 paddle 时,后面每条 `minicpmvocr` 命令都要加 `--set layout.device=cpu`。
### 3.2 vllm-ocr-env
```bash
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update && sudo apt-get install -y gcc-13 g++-13 libdw-dev libelf-dev
python3.13 -m venv vllm-ocr-env && source vllm-ocr-env/bin/activate
pip install torch==2.14.0 torchaudio==2.11.0 torchvision==0.29.0
pip install "transformers>=5.16.1,<5.20.0"
pip install "setuptools-rust>=1.9.0" "setuptools-scm>=8.0" "setuptools>=77.0.3,<81.0.0" \
"cmake>=3.26.1" ninja packaging wheel jinja2
pip install nvidia-cuda-nvcc==13.0.48 nvidia-cuda-crt==13.0.48 nvidia-nvvm==13.0.48 \
nvidia-cuda-runtime==13.0.96 nvidia-cuda-nvrtc==13.0.88 nvidia-nvjitlink==13.4.92 \
nvidia-cuda-cccl==13.3.4.3.1
```
`nvidia-cuda-cccl` 不能省,缺了会报 `cuda_fp16.h: nv/target: No such file or directory`。
补齐 pip CUDA 包的目录布局:
```bash
CU="$VIRTUAL_ENV/lib/python$(python -c 'import sys; print("%d.%d" % sys.version_info[:2])')/site-packages/nvidia/cu13"
mkdir -p "$CU/nvvm/bin" && ln -sf "$CU/bin/cicc" "$CU/nvvm/bin/cicc"
ln -sfn lib "$CU/lib64"
ln -sf "$CU/lib/libcudart.so.13" "$CU/lib/libcudart.so"
ln -sf "$CU/lib/libnvrtc.so.13" "$CU/lib/libnvrtc.so"
mkdir -p "$CU/lib64/stubs" && ln -sf /usr/lib/x86_64-linux-gnu/libcuda.so.1 "$CU/lib64/stubs/libcuda.so"
```
如果 13.0.48 的包缺少 `bin/crt/link.stub`、`prelink.stub` 或 `bin/nvdisasm`,从同一台机器上装了 13.4.92 的环境复制到 `$CU/bin/` 对应位置。
编译(96 核约 20 分钟;内存小时调低 `MAX_JOBS`):
```bash
cd <VLLM_SRC>
# 无法访问 GitHub 时,先设置下面“离线编译”中的变量
CUDA_HOME="$CU" PATH="$VIRTUAL_ENV/bin:$CU/bin:$PATH" \
CC=gcc-13 CXX=g++-13 CUDAHOSTCXX=g++-13 MAX_JOBS=64 \
pip install -e . --no-build-isolation --progress-bar off
cd -
python -c "from vllm import LLM; print('vLLM OK')"
```
不要用 `import vllm._C` 判断编译是否成功。这个分支的扩展名是 `_C_stable_libtorch.abi3.so`。
DSpark 主模型是 `minicpm_ocr` 架构,PyPI 的 transformers 不支持。编译完 vLLM 后再装 feat-ocr transformers,顺序不能反:
```bash
pip install --no-deps -e <TRANSFORMERS_SRC>
python -c "import transformers; print(transformers.__version__)" # 应为 5.19.0.dev0
```
离线编译(CMake 拉取 CUTLASS 等依赖超时时):
```bash
DEPS=<已有 vLLM 源码>/.deps
export VLLM_CUTLASS_SRC_DIR="$DEPS/cutlass-src"
export VLLM_FLASH_ATTN_SRC_DIR="$DEPS/vllm-flash-attn-src"
export FLASH_KDA_SRC_DIR="$DEPS/flashkda-src"
export DEEPSELECT_SRC_DIR="$DEPS/deepselect-src"
export FLASH_MLA_SRC_DIR="$DEPS/flashmla-src"
export TRITON_KERNELS_SRC_DIR="$DEPS/triton_kernels-src/python/triton_kernels/triton_kernels"
export TML_FA4_SRC_DIR="$DEPS/tml_fa4-src"
export FMHA_SM100_SRC_DIR="$DEPS/fmha_sm100-src"
export QUTLASS_SRC_DIR="$DEPS/qutlass-src"
export DEEPGEMM_SRC_DIR="$DEPS/deepgemm-src"
export CMAKE_ARGS="-DCUTLASS_ENABLE_TESTS=OFF" # 否则还会拉取 googletest
```
编译后可以忽略的告警:
- `vllm.third_party.deep_gemm ... undefined symbol: _ZSt8to_charsPcS_DF128_`:OCR 模型不用 DeepGEMM。
- `FlashInfer's precompiled kernels are missing or do not match`:冷启动会慢一些(实测初始化约 104 秒),不影响结果。
### 3.3 tf-ocr-env
```bash
python3 -m venv tf-ocr-env && source tf-ocr-env/bin/activate
pip install torch==2.14.0 torchvision
pip install -e <TRANSFORMERS_SRC> # 需要 OpenAI 兼容服务时装 "<TRANSFORMERS_SRC>[serving]"
pip install accelerate
# 可选加速内核,不装时回退参考实现,结果相同但更慢:
# pip install causal-conv1d flash-linear-attention
```
### 3.4 下载模型
主模型:[MiniCPM-OCR-1.0](https://huggingface.co/openbmb/MiniCPM-OCR-1.0);DSpark 草稿模型:[MiniCPM-OCR-1.0-DSpark](https://huggingface.co/openbmb/MiniCPM-OCR-1.0-DSpark)。
```bash
# DSpark:主模型和 draft 必须来自同一次发布,不能和其他 checkpoint 混用
HF_ENDPOINT=https://hf-mirror.com hf download openbmb/MiniCPM-OCR-1.0 --local-dir ./models/MiniCPM-OCR-1.0
HF_ENDPOINT=https://hf-mirror.com hf download openbmb/MiniCPM-OCR-1.0-DSpark --local-dir ./models/MiniCPM-OCR-1.0-DSpark
sha256sum ./models/MiniCPM-OCR-1.0-DSpark/model.safetensors # 对照 release_manifest.json 的 weight_sha256
curl -L -o PP-DocLayoutV3_infer.tar \
https://paddle-model-ecology.bj.bcebos.com/paddlex/official_inference_model/paddle3.0.0/PP-DocLayoutV3_infer.tar
tar xf PP-DocLayoutV3_infer.tar
export OCR_LAYOUT_MODEL_DIR=$PWD/PP-DocLayoutV3_infer
test -f "$OCR_LAYOUT_MODEL_DIR/inference.pdiparams" && echo "layout OK"
```
- ModelScope:`modelscope download --model <MS_REPO_ID> --local_dir <同名目录>`。
- 主模型目录应包含 `config.json`、`model.safetensors`、`tokenizer.json`、`preprocessor_config.json`、`chat_template.jinja`。
- `OCR_LAYOUT_MODEL_DIR` 必须是 Paddle inference 目录(含 `inference.pdiparams`、`inference.json`、`inference.yml`),不是 safetensors 目录。
## 4. 启动推理服务
每个新 shell 里启动 vLLM 前都要设置 `CUDA_HOME`,否则 Blackwell 显卡首次启动会报 `Could not find nvcc`:
```bash
source vllm-ocr-env/bin/activate
CU="$VIRTUAL_ENV/lib/python$(python -c 'import sys; print("%d.%d" % sys.version_info[:2])')/site-packages/nvidia/cu13"
export CUDA_HOME="$CU" PATH="$VIRTUAL_ENV/bin:$CU/bin:$PATH"
```
### 4.1 DSpark 加速版(默认)
```bash
CUDA_VISIBLE_DEVICES=<空闲卡> python -m vllm.entrypoints.openai.api_server \
--model ./models/MiniCPM-OCR-1.0 \
--served-model-name minicpm-ocr \
--port 18499 \
--max-model-len 40960 \
--max-num-batched-tokens 40960 \
--max-num-seqs 1 \
--attention-backend FLASH_ATTN \
--mm-encoder-attn-backend FLASH_ATTN \
--mm-processor-kwargs '{"downsample_mode":"4x"}' \
--gpu-memory-utilization 0.85 \
--trust-request-mm-kwargs \
--speculative-config '{"method":"dspark","model":"./models/MiniCPM-OCR-1.0-DSpark","num_speculative_tokens":15,"enable_adaptive_verification":false}' \
--default-chat-template-kwargs '{"enable_thinking":false}'
```
- `--max-num-seqs 1` 表示一次只处理一个请求,SDK 的并发请求会排队。用户需要高吞吐时,起多个实例并重复传 `--server-url`,或改用标准版。
- 服务启动时使用 `--served-model-name minicpm-ocr`,SDK 解析命令对应使用 `--model minicpm-ocr`。修改名称时,两处需一起修改。
### 4.2 标准版(无投机采样)
```bash
CUDA_VISIBLE_DEVICES=<空闲卡> python -m vllm.entrypoints.openai.api_server \
--model ./models/MiniCPM-OCR-1.0 \
--served-model-name minicpm-ocr \
--port 18499 \
--max-model-len 40960 \
--limit-mm-per-prompt '{"image": 36}' \
--gpu-memory-utilization 0.85 \
--trust-request-mm-kwargs
```
两个版本都必须带 `--trust-request-mm-kwargs`。漏掉时服务对每个请求返回 400,SDK 会静默重试,直到 600 秒后才报错,看起来像卡死。
### 4.3 transformers serve
```bash
source tf-ocr-env/bin/activate
transformers serve ./models/MiniCPM-OCR-1.0 --port 18499 --host 0.0.0.0 --continuous-batching
```
### 4.4 就绪检查
```bash
curl --noproxy 127.0.0.1 http://127.0.0.1:18499/v1/models # 首次启动约 3 分钟
```
返回里有 `"id":"minicpm-ocr"` 才算就绪。首次启动在 CUDA graph capture 阶段超时或被 SIGTERM 时,直接重启一次(编译缓存已经生成);仍然失败再加 `--enforce-eager`。
## 5. 解析文档
```bash
source sdk-env/bin/activate
export OCR_LAYOUT_MODEL_DIR=$PWD/PP-DocLayoutV3_infer
export PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK=True
minicpmvocr parse --config minicpmvocr-sdk/configs/backends/vllm.yaml \
--server-url http://127.0.0.1:18499 \
--model minicpm-ocr \
--set input.limit=1 --input <文件> --output out.md
```
- 先用 `--set input.limit=1` 只解析一页,确认通过后再去掉,解析全部页面。
- 配置文件都在 `minicpmvocr-sdk/configs/backends/`:vLLM 用 `vllm.yaml`;transformers serve 和其他 OpenAI 兼容服务用 `openai.yaml`;llama.cpp 用 `llamacpp.yaml`。
- 用 `openai.yaml` 时加 `--set engine.extra_body='{"chat_template_kwargs":{"enable_thinking":false}}'`,否则输出可能为空或乱码。`vllm.yaml` 已自动关闭思考模式。
- 多卡机器上版面检测默认用 GPU 0。GPU 0 被占用时加 `--set layout.device=cuda:N`。
- 除 `parse` 外的命令(`run`、`parse-layout`、`prepare`、`infer`、`show-config`)都要用 `--set input.file_path`、`input.files_dir` 或 `input.image_dir` 指定输入。
- `--set` 里的相对路径按配置文件所在目录解析,一律写绝对路径(如 `$PWD/doc.pdf`)。`--input` 按当前目录解析。
- `run` 的输出目录由配置里固定的 `run.run_tag` 决定,已有结果的页面会被跳过。重跑前换 `--set run.run_tag=<新名字>`。
- 产物默认写在 SDK 目录的 `runs/` 下。磁盘紧张时加 `--set run.run_root=<其他盘的绝对路径>`。
## 6. 验证结果
```bash
python - <<'PY'
from pathlib import Path
md = Path("out.md").read_text(encoding="utf-8")
assert md.strip(), "输出为空"
assert "<otsl>" not in md, "表格仍是 OTSL,没有转成 HTML"
print("OK", len(md), "chars", "| table" if "<table>" in md else "")
PY
```
- 表格页应有 `<table>`,公式页应有 LaTeX(如 `\frac`),正文页应是可读文本。
- DSpark 版本还要确认投机采样生效。发几个请求后:
```bash
curl --noproxy 127.0.0.1 -s http://127.0.0.1:18499/metrics | grep spec_decode_num
```
应看到 `spec_decode_num_accepted_tokens_total` 和 `spec_decode_num_drafts_total`,且数值随请求增加。accept length = 1 + accepted / drafts,验证环境中为 5.2–7.0。没有这两项说明服务没带 `--speculative-config`。服务能响应不代表 DSpark 生效。
## 7. 可选:双端逐字验证
只有用户要求时才做。`verify_transformers.py` 和 `verify_vllm.py` 随 feat-ocr 源码提供,不在 SDK 里。用户没有这两个脚本时跳过,不要声称已验证双端一致。
如果想在一个环境里跑两端,在编译好 vLLM 的环境里执行(顺序不能反):
```bash
pip install --no-deps -e <TRANSFORMERS_SRC>
View on GitHubThis SKILL.md is very large, so SkillsMP previews the first section here. View on GitHub