
MinerU 最新出了3.0版本,今天在 Linux 服务器上部署了,试了一下文档解析效果。
测试结论在末尾。整体打分,对比paddle与DeepSeek-OCR 2,能在85分左右。
MinerU 就是把 PDF、图片、扫描件的内容提出来,转成 Markdown 或 JSON。扫描件走 OCR。3.0 主要加了多卡调度和 API 服务化。
服务器是双 4090D,下面是完整的安装脚本、运维命令和批量测试过程。
MinerU 有几种解析模式,-b 参数指定:

这次用的是 Router 模式,根据 GPU 自动调度,不用手动选后端。
一个脚本干完所有事:建目录、建 Conda 环境、装依赖、配国内镜像、装 MinerU、下模型、生成启动脚本、注册系统服务。
#!/usr/bin/env bash
set -euo pipefail
INSTALL_ROOT="/opt/minerU"
CONDA_ENV_PATH="${INSTALL_ROOT}/.conda-env"
CONDA_BASE_DEFAULT="/usr/local/anaconda3"
PYTHON_VERSION="3.12"
PIP_INDEX_URL="${PIP_INDEX_URL:-https://mirrors.aliyun.com/pypi/simple/}"
MINERU_MODEL_SOURCE_DEFAULT="${MINERU_MODEL_SOURCE_DEFAULT:-modelscope}"
ROUTER_PORT="${ROUTER_PORT:-8002}"
WORKER_HOST="${WORKER_HOST:-127.0.0.1}"
LOCAL_GPUS="${LOCAL_GPUS:-auto}"
ENABLE_VLM_PRELOAD="${ENABLE_VLM_PRELOAD:-false}"
INSTALL_MODE="${INSTALL_MODE:-auto}" source "${CONDA_BASE}/etc/profile.d/conda.sh"
conda create -y -p "${CONDA_ENV_PATH}" "python=${PYTHON_VERSION}"
conda activate "${CONDA_ENV_PATH}" 先装 mineru[all],失败自动回退 mineru[core]:
python -m pip install -U "mineru[all]" "modelscope" \
-i "https://mirrors.aliyun.com/pypi/simple/" 国内服务器用 ModelScope:
export MINERU_MODEL_SOURCE="modelscope"
export HF_ENDPOINT="https://hf-mirror.com"
mineru-models-download 模型下载失败不影响安装,日志在 /tmp/mineru-models-download.log。
exec mineru-router \
--host 0.0.0.0 \
--port 8002 \
--worker-host 127.0.0.1 \
--local-gpus auto \
--enable-vlm-preload false --host 0.0.0.0 不加的话只能本机访问。
[Service]
Type=simple
ExecStart=/opt/minerU/bin/start_router.sh
Restart=always
RestartSec=5
Environment=CUDA_VISIBLE_DEVICES=0,1 CUDA_VISIBLE_DEVICES=0,1 指定用哪几张卡。
# 启动
systemctl daemon-reload
systemctl enable --now mineru-router
# 看状态
systemctl status mineru-router --no-pager
# 健康检查
curl http://127.0.0.1:8002/health
# 重启 / 停止
systemctl restart mineru-router
systemctl stop mineru-router
# 看日志
journalctl -u mineru-router -f # 实时
journalctl -u mineru-router -n 100 # 最近100行 跑起来之后,http://<服务器IP>:8002/docs 能看到 API 文档。
同时丢多个 PDF 和图片,并行跑,自动解压结果:
#!/usr/bin/env bash
set -euo pipefail
API_URL="${API_URL:-http://127.0.0.1:8002}"
FILES=(
"/opt/minerU/input/test1.pdf"
"/opt/minerU/input/test2.pdf"
"/opt/minerU/input/test3.pdf"
"/opt/minerU/input/test_image1.png"
)
OUT_ROOT="/opt/minerU/test_result_$(date +%F_%H%M%S)"
mkdir -p "${OUT_ROOT}" 调 /file_parse 接口:
curl -sS \
-X POST "${API_URL}/file_parse" \
-F "files=@${file}" \
-F "return_md=true" \
-F "response_format_zip=true" \
-F "return_original_file=true" return_md=true 返回 Markdown,response_format_zip=true 打成 zip,return_original_file=true 带上原文件方便对照。
跑完输出:
========== 汇总 ==========
test1: HTTP 200 | /opt/minerU/test_result_.../test1/unzipped
test2: HTTP 200 | /opt/minerU/test_result_.../test2/unzipped
test3: HTTP 200 | /opt/minerU/test_result_.../test3/unzipped
test_image1: HTTP 200 | /opt/minerU/test_result_.../test_image1/unzipped 查看结果:
# Markdown
find /opt/minerU/test_result_*/ -type f | egrep '\.md$'
# 版面分析、表格、图片
find /opt/minerU/test_result_*/ -type f | \
egrep 'layout\.pdf|content_list|middle\.json|\.png$|\.jpg$' MinerU 跑完除了 Markdown,还有几个文件可以看:
• layout.pdf:在原页面上画框,标出识别区域和阅读顺序
• span.pdf(pipeline 模式):不同颜色标文本块,OCR 丢字一眼能看出来
• middle.json / content_list_v2.json:结构化数据,带坐标
1、手写体识别问题较严重,很多识别不到:

2、财务报表会丢部分标题

3、鲜章遮盖部分识别较好,财务报表数字提取准确

抽查了十多个科目,数据准确。
4、显存资源消耗尚可,本次4个并发跑,3个pdf,1个文档,大概花了20秒不到结束识别


总结:日常使用足够