MinerU

docker部署

使用dockerfile构建镜像:

1
2
wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/docker/china/Dockerfile
docker build -t mineru-sglang:latest -f Dockerfile .

使用wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU @master/docker/china/Dockerfile -O Dockerfile将指定的 Dockerfile 下载到本地

Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用官方的 sglang 镜像作为基础镜像
FROM lmsysorg/sglang:v0.4.9-cu126

# 安装 OpenCV 依赖库
RUN apt-get update && apt-get install -y libgl1 && apt-get clean && rm -rf /var/lib/apt/lists/*

# 安装 mineru Python 包
RUN python3 -m pip install -U 'mineru[core]' -i https://mirrors.aliyun.com/pypi/simple --break-system-packages

# 下载模型并配置
RUN /bin/bash -c "mineru-models-download -s modelscope -m all"

# 设置容器入口命令
ENTRYPOINT ["/bin/bash", "-c", "export MINERU_MODEL_SOURCE=local && exec \"$@\"", "--"]

SGLang(全称可能为 Serving Large Language Models with Golang )是由斯坦福大学研究团队开发的一个高效的大语言模型(LLM)推理服务框架 ,旨在通过优化模型推理过程,显著提升生成式AI服务的吞吐量和响应速度。

  • SGlang 版本v0.4.8.post1(SGlang 是一个用于大语言模型(LLM)推理和服务的高性能框架)。
  • CUDA 版本cu126 表示使用 CUDA 12.6 ,适用于 Turing/Ampere/Ada Lovelace/Hopper 架构的 GPU (如 RTX 30/40 系列、A100、H100)。

报错排查

之前由于默认dockerfile内容为FROM lmsysorg/sglang:v0.4.8.post1-cu126报错

1
lmsysorg/sglang:v0.4.8.post1-cu126: failed to resolve source metadata for docker.io/lmsysorg/sglang:v0.4.8.post1-cu126: unexpected status from HEAD request to https://yaj2teeh.mirror.aliyuncs.com/v2/lmsysorg/sglang/manifests/v0.4.8.post1-cu126?ns=docker.io: 403 Forbidden

之前以为是sglang版本问题,然后去dockerhub上查找,并通过docker pull sglang:v0.4.8.post1-cu126测试,是可以拉取的,最后认为原因还是网络问题

解决方法,更换了镜像源

镜像源配置

1
2
3
4
5
6
7
8
9
10
11
12
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://dockerhub.azk8s.cn",
"https://mirror.ccs.tencentyun.com",
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud"
]

保姆级Docker安装+镜像加速 计算机系必备技能_哔哩哔哩_bilibili

为什么要指定基础镜像

  • 提供操作系统和依赖 基础镜像包含操作系统(如 Ubuntu、Alpine)、运行时环境(如 Python、Node.js)或框架(如 TensorFlow、PyTorch)等核心组件,后续所有操作(如安装依赖、拷贝文件)都基于此环境。
    • 例如:FROM python:3.9 提供了 Python 3.9 的运行环境,后续可以直接用 pip install 安装 Python 包。
  • 避免重复造轮子 如果直接从空镜像(scratch)开始,需要手动安装所有依赖,效率低下且容易出错。使用现有基础镜像可以复用已验证的环境配置。

确认支持的cuda版本

命令nvidia-smi

image-20250708160948192

CUDA Version 显示当前驱动支持的最高 CUDA 版本

问题:使用dockerfile直接部署,始终出现网络问题

解决方案

先修改了一下docker储存镜像的位置,太大了

先拉取基础镜像docker pull lmsysorg/sglang:v0.4.8.post1-cu126

再使用docker build -t mineru-sglang:latest -f Dockerfile .,可以直接跳过基础镜像的拉取

启动

官方启动命令

1
2
3
4
5
6
7
8
docker run -d \
--name sglang-server \ # 容器命名(便于管理)
--gpus all \ # 启用所有GPU
--shm-size 32g \ # 共享内存大小
-p 30000:30000 \ # 端口映射(主机端口:容器端口)
--ipc=host \ # 共享主机IPC命名空间
mineru-sglang:latest \
mineru-sglang-server --host 0.0.0.0 --port 30000
1
docker run -d --name sglang-server --gpus all --shm-size 32g -p 30000:30000 --ipc=host mineru-sglang:latest mineru-sglang-server --host 0.0.0.0 --port 30000

将mineru-sglang-server暴露到30000端口的作用

为了支持 vlm-sglang-client 后端模式,使得MinerU客户端可以通过网络连接到这个服务器,实现多个客户端可以同时连接到同一个服务器

使用docker exec -it sglang-server bash命令进入容器

使用docker desk

image-20250709152627120
1
2
3
4
5
docker run -d --name mineru-server --gpus all --shm-size 32g -p 30000:30000 -p 7860:7860 -p 8000:8000 --ipc=host \
-v "F:/project python/实习/mineru/demo/pdfs:/pdfs" \
-v "F:/project python/实习/mineru/output:/output" \
mineru-sglang:latest \
mineru-sglang-server --host 0.0.0.0 --port 30000

使用挂载卷启动

  • 将本地的PDF文件目录挂载到容器内的 /pdfs 目录
  • 将本地的输出目录挂载到容器内的 /output 目录
  • 把8000,和7860端口暴露,方便调用fastapi与gradio webui 可视化
image-20250710100047464
image-20250710103505453

调用

命令行调用sglang-server/client 模式

docker exec mineru-server mineru -p /pdfs/demo1.pdf -o /output -b vlm-sglang-client -u http://localhost:30000

这条命令在名为 mineru-server 的容器内执行 mineru 工具,处理 /pdfs 目录下的 demo1.pdf 文件,输出结果到 /output 目录,使用 vlm-sglang-client 后端,并连接到 http://localhost:30000 的SGLang服务器。

image-20250710103615272

fastapi调用与gradio webui 可视化

在完成docker的端口映射之后,运行mineru-api --host 0.0.0.0 --port 8080启动fastapi服务,

FastAPI服务的使用场景

FastAPI服务提供了一个/file_parse端点,用于处理PDF和图像文件的解析请求

微服务架构部署,FastAPI服务可以独立部署

服务提供了标准的HTTP API接口,允许客户端通过网络请求进行文档解析

运行mineru-gradio --server-name 0.0.0.0 --server-port 7860启动gradio webui服务

mineru-gradio --server-name 0.0.0.0 --server-port 7860 --enable-sglang-engine true

注意,模型下载需要配置环境变量

1
2
3
4
# 在容器内设置环境变量
export MINERU_MODEL_SOURCE=local
# 验证环境变量是否设置成功
echo $MINERU_MODEL_SOURCE
115678648318f55f1fe3a5baaeac2aaf

在调用过程中关于端口的问题与思考

调用过程中发现,在容器中使用mineru-api --host 127.0.0.1 --port 8000,宿主机无法访问http://127.0.0.1:8000/docs/,经过查询ai,命令改为mineru-api --host 0.0.0.0 --port 8000就可以正常访问,那么关键在于对这两个地址的理解

查看端口netstat -ano | findstr LISTENING

127.0.0.1与0.0.0.0

  • 127.0.0.1 (localhost) :仅表示本机回环地址,只能在 同一设备内 访问
  • 0.0.0.0 :表示监听所有可用的网络接口,允许 来自任何地址 的连接

当您在Docker容器内运行服务时:

  1. 使用127.0.0.1作为绑定地址 :

    • 服务只接受来自容器内部的连接
    • 即使您映射了端口,宿主机也无法访问该服务
    • 只有容器内的应用程序可以通过 127.0.0.1:端口 访问
  2. 使用0.0.0.0作为绑定地址 :

    • 服务接受来自任何网络接口的连接请求
    • 允许从容器外部(包括宿主机)访问该服务
    • 当您映射端口时(如 -p 8000:8000 ),宿主机可以通过 localhost:8000 或 127.0.0.1:8000 访问

为什么需要在容器内使用0.0.0.0

在Docker环境中,容器有自己独立的网络命名空间,这意味着容器内的 127.0.0.1 与宿主机的 127.0.0.1 是完全不同的两个环境。因此:

  • 当您在容器内使用 –host 0.0.0.0 启动服务时,该服务会监听容器的所有网络接口
  • 当您在宿主机上访问 127.0.0.1:映射端口 时,Docker会将请求转发到容器内监听在 0.0.0.0:容器端口 的服务

mineru相关知识

参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Usage: mineru [OPTIONS]

Options:
-v, --version 显示版本并退出
-p, --path PATH 输入文件路径或目录(必填)
-o, --output PATH 输出目录(必填)
-m, --method [auto|txt|ocr] 解析方法:auto(默认)、txt、ocr(仅用于 pipeline 后端)
-b, --backend [pipeline|vlm-transformers|vlm-sglang-engine|vlm-sglang-client]
解析后端(默认为 pipeline)
-l, --lang [ch|ch_server|ch_lite|en|korean|japan|chinese_cht|ta|te|ka|latin|arabic|east_slavic|cyrillic|devanagari]
指定文档语言(可提升 OCR 准确率,仅用于 pipeline 后端)
-u, --url TEXT 当使用 sglang-client 时,需指定服务地址
-s, --start INTEGER 开始解析的页码(从 0 开始)
-e, --end INTEGER 结束解析的页码(从 0 开始)
-f, --formula BOOLEAN 是否启用公式解析(默认开启)
-t, --table BOOLEAN 是否启用表格解析(默认开启)
-d, --device TEXT 推理设备(如 cpu/cuda/cuda:0/npu/mps,仅 pipeline 后端)
--vram INTEGER 单进程最大 GPU 显存占用(GB)(仅 pipeline 后端)
--source [huggingface|modelscope|local]
模型来源,默认 huggingface
--help 显示帮助信息

后端的区别

pipeline (默认后端) :

  • 含义 : 这是 MinerU 的默认后端,它使用本地安装的 mineru 库来执行文档解析任务。它通常不依赖于外部的 VLM(视觉语言模型)服务,而是直接在本地处理 PDF 文件。
10d6d1a7f702c5806e29ee7b1c51283

vlm-transformers :

  • 含义 : 这个后端利用 Hugging Face transformers 库中提供的 VLM 模型进行文档分析。它会在本地加载并运行一个基于 transformers 的 VLM 模型来处理 PDF 中的视觉信息和文本内容。

VLM(Vision-Language Model,视觉语言模型)是一种结合计算机视觉和自然语言处理能力的多模态人工智能模型。

OCR 是 Optical Character Recognition(光学字符识别)的缩写。它是一种技术,用于将图像中的手写、打印或打字文本转换为机器编码的文本,使其可以被计算机编辑、搜索、存储和处理。

vlm-sglang-engine :

  • 含义 : 这个后端表示 MinerU 将直接集成并使用 SGLang 引擎进行 VLM 推理。SGLang 是一个高性能的推理引擎,旨在优化大型语言模型(LLM)和 VLM 的推理速度和效率。在这种模式下,SGLang 引擎作为 MinerU 进程的一部分运行。

vlm-sglang-client :

  • 含义 : 这个后端表示 MinerU 作为 SGLang 服务器的客户端。在这种模式下,MinerU 不会直接运行 VLM 模型,而是将 PDF 处理请求发送到一个独立的 SGLang 服务器(通过 -u 参数指定的 URL,例如 http://localhost:30000 )。SGLang 服务器负责执行实际的 VLM 推理,并将结果返回给 MinerU 客户端。

用场景 : 这是我们之前讨论的 Docker 容器部署场景中推荐的模式。它非常适合以下情况: - 资源隔离 : 将 VLM 推理的计算密集型任务从 MinerU 主进程中分离出来,允许独立扩展和管理 SGLang 服务器。 - 集中管理 : 可以在一个或多个 SGLang 服务器上集中管理 VLM 模型,供多个 MinerU 客户端共享使用。 - 性能优化 : SGLang 服务器可以针对 VLM 推理进行专门优化,提供更好的吞吐量和延迟。 - 灵活部署 : SGLang 服务器可以部署在不同的机器上,甚至作为微服务运行,提供更大的部署灵活性。

关于吞吐量的相关知识

“吞吐量”(throughput)*指的是系统在单位时间内能处理的 **Token 数量**,单位通常是 **tokens/秒**。这个指标衡量的是整体系统*处理并发请求的能力,而不仅仅是单个请求的速度。

SGLang 支持两种主要并行方式来提升吞吐量:

并行类型 作用 对吞吐量的影响
张量并行(TP) 把模型权重切分到多张卡上,减少单卡负载 提升单请求处理能力,但通信开销大
数据并行(DP) 把不同请求分发到不同卡上,并行处理多个请求 直接提升并发吞吐量,尤其适合高并发场景

mineru的并发测试和吞吐量测试

并发能力是测试mineru同时处理多个请求的能力,吞吐量是测试mineru处理文件时的tokens

明确要的是哪个吞吐量:一个是MinerU 内部推理引擎(如 vLLM/SGLang)的 token/s 输出,即 生成阶段(decode)的吞吐量,一个是你压测 /file_parse 接口时的 端到端 tokens/s

是否有缓存(kvcache)

测试场景:10页的pdf,50用户并发

工具:locust

1
2
3
4
5
6
7
8
locust \
-f locustfile.py \
--headless \
-u 50 \ # 并发用户数
-r 5 \ # 每秒启动用户数
--host=http://mineru-server:30000 \
--html=report.html \ # 自动生成 HTML 报告
--csv=result # 同时保存 csv(result_stats.csv / result_failures.csv)
1
locust -f locustfile.py --headless -u 100 -r 5 --host=http://mineru-server:30000 --html=report.html --csv=result

测试结果

image-20250805152017255

对于推理模型的吞吐量,在3个gpu开启数据并行的情况下,平均每秒单个gpu处理tokens为1500左右

image-20250805152149822

gpu状态如上:显存几乎打满 85–87 %,GPU 利用率 59–63 %,功耗 170–188 W / 350 W

image-20250805153516235

完整压测结果如上

重要指标:

指标 数值 通俗解释
平均响应时间 241 秒4 分钟 上传一个 PDF → 拿到解析结果,平均要等 4 分钟。
中位数 215 秒3.6 分钟 一半请求在 3.6 分钟内完成。
95% 用户 361 秒6 分钟 最慢的 5% 要等 6 分钟以上。
吞吐量 0.18 req/s 这台 MinerU 每分钟只能处理约11 个 PDF
image-20250806104340935
image-20250806110438932

参考资料

MinerU/projects/multi_gpu_v2/README_zh.md at be4f3de32b58ccf81c6a6dcb9d3e4998424cee6a · opendatalab/MinerU

部署服务器并运行

load镜像

1
docker load -i mineru-sglang-latest.tar
1
2
free -h
nvidia-smi
image-20250716092152823

每秒刷新watch -n1 nvidia-smi # 每秒刷新

查看Linux路径

1
pwd 

启动容器

1
2
3
4
5
docker run -d --name mineru-server --gpus all --shm-size 32g -p 30000:30000 -p 7860:7860 -p 8000:8000 --ipc=host \
-v "/aisys/repo_dev/xizhang/pdfs:/pdfs" \
-v "/aisys/repo_dev/xizhang/outputs:/output" \
mineru-sglang:latest \
mineru-sglang-server --host 0.0.0.0 --port 30000
1
docker run -d --name mineru-server --gpus all --shm-size 32g -p 30000:30000 --ipc=host -v "/aisys/repo_dev/xizhang/pdfs:/pdfs" -v "/aisys/repo_dev/xizhang/outputs:/output" mineru-sglang:latest mineru-sglang-server --host 0.0.0.0 --port 30000

调用

1
docker exec mineru-server mineru -p /pdfs/demo1.pdf -o /output -b vlm-sglang-client -u http://localhost:30000`

进入容器

1
docker exec -it mineru-server /bin/bash

使用pipline解析后端模式

1
mineru -p /pdfs/demo1.pdf -o /output --source local

使用sglang加速推理

1
CUDA_VISIBLE_DEVICES=1,2,3 mineru -p /pdfs/small_ocr.pdf -o /output -b vlm-sglang-engine --source local

vlm模式同样可以处理扫描件

使用ocr解析扫描件

1
mineru -p /pdfs/small_ocr.pdf -o /output --source local -m ocr

增加推理设备

1
mineru -p /pdfs/small_ocr.pdf -o /output --source local -m ocr -d cuda

通过在命令行的开头添加CUDA_VISIBLE_DEVICES 环境变量来指定可见的 GPU 设备。

1
CUDA_VISIBLE_DEVICES=1,2,3 mineru -p /pdfs/small_ocr.pdf -o /output --source local -m ocr

使用sglang加速模式的多GPU并行

数据并行(dp-size)和张量并行(tp-size)

MinerU支持通过sglang的多GPU并行模式来提升推理速度。您可以使用以下参数:

  • --dp-size: 数据并行,通过多卡同时处理多个输入来增加吞吐量
  • --tp-size: 张量并行,将模型分布到多张GPU上以扩展可用显存

如果您已经可以正常使用sglang对vlm模型进行加速推理,但仍然希望进一步提升推理速度,可以尝试以下参数:

  • 如果您有超过多张显卡,可以使用sglang的多卡并行模式来增加吞吐量:--dp-size 2
  • 同时您可以启用torch.compile来将推理速度加速约15%:--enable-torch-compile
1
CUDA_VISIBLE_DEVICES=1,2,3 mineru -p /pdfs -o /output -b vlm-sglang-engine --source local --dp-size 3 --enable-torch-compile

将python文件上传docker并运行

1
2
3
4
5
6
docker cp demo.py mineru-server:/demo.py

docker exec mineru-server python /demo.py

#删除
rm -i demo.py

添加自定义网络,修改挂载卷

1
docker run -d --name mineru-server --gpus all --shm-size 32g -p 30000:30000 --ipc=host -v /aisys/:/aisys/ --network network_test mineru-sglang:latest mineru-sglang-server --host 0.0.0.0 --port 30000

后面才知道,上面这个命令会自动启动sglang-server服务

1
2
docker run -d --name mineru-server --gpus all --shm-size 32g -p 30000:30000 --ipc=host -v /aisys/:/aisys/ --network network_test mineru-sglang:latest tail -f /dev/null
docker start mineru-server

使用上面这个命令启动容器,但不启动sglang-server服务,使用下面指令手动启动

1
2
docker exec -it mineru-server /bin/bash
MINERU_MODEL_SOURCE=local CUDA_VISIBLE_DEVICES=1,2,3 mineru-sglang-server --port 30000 --dp-size 3 --enable-torch-compile

启动服务后在另一个容器尝试访问

1
curl http://mineru-server:30000/get_model_info

在另一个容器使用服务

1
mineru -p /test -o / -b vlm-sglang-client -u http://mineru-server:30000

启动fastapi服务

1
MINERU_MODEL_SOURCE=local CUDA_VISIBLE_DEVICES=1,2,3 mineru-api --host 0.0.0.0 --port 30000 --dp-size 3 --enable-torch-compile

在另一个容器验证

1
curl http://mineru-server:30000/openapi.json
1
2
3
4
5
6
7
8
9
# 在容器内设置环境变量
export CUDA_VISIBLE_DEVICES=1,2,3
# 验证环境变量是否设置成功
echo $CUDA_VISIBLE_DEVICES

# 在容器内设置环境变量
export MINERU_MODEL_SOURCE=local
# 验证环境变量是否设置成功
echo $MINERU_MODEL_SOURCE

资料

MinerU 2.0部署-CSDN博客

https://github.com/opendatalab/MinerU?tab=readme-ov-file#local-deployment

https://deepwiki.com/opendatalab/MinerU

MinerU:PDF处理神器的Pipeline和VLM两种模式大揭秘_哔哩哔哩_bilibili