chore: init monorepo snapshot

This commit is contained in:
liaibo
2025-11-23 10:55:04 +08:00
commit c70ff52869
941 changed files with 246586 additions and 0 deletions
@@ -0,0 +1 @@
<iframe src="https://opendatalab-mineru.ms.show" style="min-height: calc(-40px + 100vh); width: 100%; flex-grow: 1; border: medium; overflow: auto; height: 1746px;"></iframe>
+29
View File
@@ -0,0 +1,29 @@
# 常见问题解答
如果未能列出您的问题,您也可以使用[DeepWiki](https://deepwiki.com/opendatalab/MinerU)与AI助手交流,这可以解决大部分常见问题。
如果您仍然无法解决问题,您可通过[Discord](https://discord.gg/Tdedn9GTXq)或[WeChat](https://mineru.net/community-portal/?aliasId=3c430f94)加入社区,与其他用户和开发者交流。
??? question "在WSL2的Ubuntu22.04中遇到报错`ImportError: libGL.so.1: cannot open shared object file: No such file or directory`"
WSL2的Ubuntu22.04中缺少`libgl`库,可通过以下命令安装`libgl`库解决:
```bash
sudo apt-get install libgl1-mesa-glx
```
参考:[#388](https://github.com/opendatalab/MinerU/issues/388)
??? question "在 Linux 系统安装并使用时,解析结果缺失部份文字信息。"
MinerU在>=2.0的版本中使用`pypdfium2`代替`pymupdf`作为PDF页面的渲染引擎,以解决AGPLv3的许可证问题,在某些Linux发行版,由于缺少CJK字体,可能会在将PDF渲染成图片的过程中丢失部份文字。
为了解决这个问题,您可以通过以下命令安装noto字体包,这在Ubuntu/debian系统中有效:
```bash
sudo apt update
sudo apt install fonts-noto-core
sudo apt install fonts-noto-cjk
fc-cache -fv
```
也可以直接使用我们的[Docker部署](../quick_start/docker_deployment.md)方式构建镜像,镜像中默认包含以上字体包。
参考:[#2915](https://github.com/opendatalab/MinerU/issues/2915)
+69
View File
@@ -0,0 +1,69 @@
<div align="center" xmlns="http://www.w3.org/1999/html">
<!-- logo -->
<p align="center">
<img src="https://opendatalab.github.io/MinerU/images/MinerU-logo.png" width="300px" style="vertical-align:middle;">
</p>
</div>
<!-- icon -->
[![stars](https://img.shields.io/github/stars/opendatalab/MinerU.svg)](https://github.com/opendatalab/MinerU)
[![forks](https://img.shields.io/github/forks/opendatalab/MinerU.svg)](https://github.com/opendatalab/MinerU)
[![open issues](https://img.shields.io/github/issues-raw/opendatalab/MinerU)](https://github.com/opendatalab/MinerU/issues)
[![issue resolution](https://img.shields.io/github/issues-closed-raw/opendatalab/MinerU)](https://github.com/opendatalab/MinerU/issues)
[![PyPI version](https://img.shields.io/pypi/v/mineru)](https://pypi.org/project/mineru/)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mineru)](https://pypi.org/project/mineru/)
[![Downloads](https://static.pepy.tech/badge/mineru)](https://pepy.tech/project/mineru)
[![Downloads](https://static.pepy.tech/badge/mineru/month)](https://pepy.tech/project/mineru)
[![OpenDataLab](https://img.shields.io/badge/webapp_on_mineru.net-blue?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTM0IiBoZWlnaHQ9IjEzNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtMTIyLDljMCw1LTQsOS05LDlzLTktNC05LTksNC05LDktOSw5LDQsOSw5eiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Im0xMjIsOWMwLDUtNCw5LTksOXMtOS00LTktOSw0LTksOS05LDksNCw5LDl6IiBmaWxsPSIjMDEwMTAxIi8+PHBhdGggZD0ibTkxLDE4YzAsNS00LDktOSw5cy05LTQtOS05LDQtOSw5LTksOSw0LDksOXoiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJtOTEsMThjMCw1LTQsOS05LDlzLTktNC05LTksNC05LDktOSw5LDQsOSw5eiIgZmlsbD0iIzAxMDEwMSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMzksNjJjMCwxNiw4LDMwLDIwLDM4LDctNiwxMi0xNiwxMi0yNlY0OWMwLTQsMy03LDYtOGw0Ni0xMmM1LTEsMTEsMywxMSw4djMxYzAsMzctMzAsNjYtNjYsNjYtMzcsMC02Ni0zMC02Ni02NlY0NmMwLTQsMy03LDYtOGwyMC02YzUtMSwxMSwzLDExLDh2MjF6bS0yOSw2YzAsMTYsNiwzMCwxNyw0MCwzLDEsNSwxLDgsMSw1LDAsMTAtMSwxNS0zQzM3LDk1LDI5LDc5LDI5LDYyVjQybC0xOSw1djIweiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMzksNjJjMCwxNiw4LDMwLDIwLDM4LDctNiwxMi0xNiwxMi0yNlY0OWMwLTQsMy03LDYtOGw0Ni0xMmM1LTEsMTEsMywxMSw4djMxYzAsMzctMzAsNjYtNjYsNjYtMzcsMC02Ni0zMC02Ni02NlY0NmMwLTQsMy03LDYtOGwyMC02YzUtMSwxMSwzLDExLDh2MjF6bS0yOSw2YzAsMTYsNiwzMCwxNyw0MCwzLDEsNSwxLDgsMSw1LDAsMTAtMSwxNS0zQzM3LDk1LDI5LDc5LDI5LDYyVjQybC0xOSw1djIweiIgZmlsbD0iIzAxMDEwMSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4=&labelColor=white)](https://mineru.net/OpenSourceTools/Extractor?source=github)
[![ModelScope](https://img.shields.io/badge/Demo_on_ModelScope-purple?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIzIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCiA8Zz4KICA8dGl0bGU+TGF5ZXIgMTwvdGl0bGU+CiAgPHBhdGggaWQ9InN2Z18xNCIgZmlsbD0iIzYyNGFmZiIgZD0ibTAsODkuODRsMjUuNjUsMGwwLDI1LjY0OTk5bC0yNS42NSwwbDAsLTI1LjY0OTk5eiIvPgogIDxwYXRoIGlkPSJzdmdfMTUiIGZpbGw9IiM2MjRhZmYiIGQ9Im05OS4xNCwxMTUuNDlsMjUuNjUsMGwwLDI1LjY1bC0yNS42NSwwbDAsLTI1LjY1eiIvPgogIDxwYXRoIGlkPSJzdmdfMTYiIGZpbGw9IiM2MjRhZmYiIGQ9Im0xNzYuMDksMTQxLjE0bC0yNS42NDk5OSwwbDAsMjIuMTlsNDcuODQsMGwwLC00Ny44NGwtMjIuMTksMGwwLDI1LjY1eiIvPgogIDxwYXRoIGlkPSJzdmdfMTciIGZpbGw9IiMzNmNmZDEiIGQ9Im0xMjQuNzksODkuODRsMjUuNjUsMGwwLDI1LjY0OTk5bC0yNS42NSwwbDAsLTI1LjY0OTk5eiIvPgogIDxwYXRoIGlkPSJzdmdfMTgiIGZpbGw9IiMzNmNmZDEiIGQ9Im0wLDY0LjE5bDI1LjY1LDBsMCwyNS42NWwtMjUuNjUsMGwwLC0yNS42NXoiLz4KICA8cGF0aCBpZD0ic3ZnXzE5IiBmaWxsPSIjNjI0YWZmIiBkPSJtMTk4LjI4LDg5Ljg0bDI1LjY0OTk5LDBsMCwyNS42NDk5OWwtMjUuNjQ5OTksMGwwLC0yNS42NDk5OXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIwIiBmaWxsPSIjMzZjZmQxIiBkPSJtMTk4LjI4LDY0LjE5bDI1LjY0OTk5LDBsMCwyNS42NWwtMjUuNjQ5OTksMGwwLC0yNS42NXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjNjI0YWZmIiBkPSJtMTUwLjQ0LDQybDAsMjIuMTlsMjUuNjQ5OTksMGwwLDI1LjY1bDIyLjE5LDBsMCwtNDcuODRsLTQ3Ljg0LDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18yMiIgZmlsbD0iIzM2Y2ZkMSIgZD0ibTczLjQ5LDg5Ljg0bDI1LjY1LDBsMCwyNS42NDk5OWwtMjUuNjUsMGwwLC0yNS42NDk5OXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIzIiBmaWxsPSIjNjI0YWZmIiBkPSJtNDcuODQsNjQuMTlsMjUuNjUsMGwwLC0yMi4xOWwtNDcuODQsMGwwLDQ3Ljg0bDIyLjE5LDBsMCwtMjUuNjV6Ii8+CiAgPHBhdGggaWQ9InN2Z18yNCIgZmlsbD0iIzYyNGFmZiIgZD0ibTQ3Ljg0LDExNS40OWwtMjIuMTksMGwwLDQ3Ljg0bDQ3Ljg0LDBsMCwtMjIuMTlsLTI1LjY1LDBsMCwtMjUuNjV6Ii8+CiA8L2c+Cjwvc3ZnPg==&labelColor=white)](https://www.modelscope.cn/studios/OpenDataLab/MinerU)
[![HuggingFace](https://img.shields.io/badge/Demo_on_HuggingFace-yellow.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAABYCAMAAACkl9t/AAAAk1BMVEVHcEz/nQv/nQv/nQr/nQv/nQr/nQv/nQv/nQr/wRf/txT/pg7/yRr/rBD/zRz/ngv/oAz/zhz/nwv/txT/ngv/0B3+zBz/nQv/0h7/wxn/vRb/thXkuiT/rxH/pxD/ogzcqyf/nQvTlSz/czCxky7/SjifdjT/Mj3+Mj3wMj15aTnDNz+DSD9RTUBsP0FRO0Q6O0WyIxEIAAAAGHRSTlMADB8zSWF3krDDw8TJ1NbX5efv8ff9/fxKDJ9uAAAGKklEQVR42u2Z63qjOAyGC4RwCOfB2JAGqrSb2WnTw/1f3UaWcSGYNKTdf/P+mOkTrE+yJBulvfvLT2A5ruenaVHyIks33npl/6C4s/ZLAM45SOi/1FtZPyFur1OYofBX3w7d54Bxm+E8db+nDr12ttmESZ4zludJEG5S7TO72YPlKZFyE+YCYUJTBZsMiNS5Sd7NlDmKM2Eg2JQg8awbglfqgbhArjxkS7dgp2RH6hc9AMLdZYUtZN5DJr4molC8BfKrEkPKEnEVjLbgW1fLy77ZVOJagoIcLIl+IxaQZGjiX597HopF5CkaXVMDO9Pyix3AFV3kw4lQLCbHuMovz8FallbcQIJ5Ta0vks9RnolbCK84BtjKRS5uA43hYoZcOBGIG2Epbv6CvFVQ8m8loh66WNySsnN7htL58LNp+NXT8/PhXiBXPMjLSxtwp8W9f/1AngRierBkA+kk/IpUSOeKByzn8y3kAAAfh//0oXgV4roHm/kz4E2z//zRc3/lgwBzbM2mJxQEa5pqgX7d1L0htrhx7LKxOZlKbwcAWyEOWqYSI8YPtgDQVjpB5nvaHaSnBaQSD6hweDi8PosxD6/PT09YY3xQA7LTCTKfYX+QHpA0GCcqmEHvr/cyfKQTEuwgbs2kPxJEB0iNjfJcCTPyocx+A0griHSmADiC91oNGVwJ69RudYe65vJmoqfpul0lrqXadW0jFKH5BKwAeCq+Den7s+3zfRJzA61/Uj/9H/VzLKTx9jFPPdXeeP+L7WEvDLAKAIoF8bPTKT0+TM7W8ePj3Rz/Yn3kOAp2f1Kf0Weony7pn/cPydvhQYV+eFOfmOu7VB/ViPe34/EN3RFHY/yRuT8ddCtMPH/McBAT5s+vRde/gf2c/sPsjLK+m5IBQF5tO+h2tTlBGnP6693JdsvofjOPnnEHkh2TnV/X1fBl9S5zrwuwF8NFrAVJVwCAPTe8gaJlomqlp0pv4Pjn98tJ/t/fL++6unpR1YGC2n/KCoa0tTLoKiEeUPDl94nj+5/Tv3/eT5vBQ60X1S0oZr+IWRR8Ldhu7AlLjPISlJcO9vrFotky9SpzDequlwEir5beYAc0R7D9KS1DXva0jhYRDXoExPdc6yw5GShkZXe9QdO/uOvHofxjrV/TNS6iMJS+4TcSTgk9n5agJdBQbB//IfF/HpvPt3Tbi7b6I6K0R72p6ajryEJrENW2bbeVUGjfgoals4L443c7BEE4mJO2SpbRngxQrAKRudRzGQ8jVOL2qDVjjI8K1gc3TIJ5KiFZ1q+gdsARPB4NQS4AjwVSt72DSoXNyOWUrU5mQ9nRYyjp89Xo7oRI6Bga9QNT1mQ/ptaJq5T/7WcgAZywR/XlPGAUDdet3LE+qS0TI+g+aJU8MIqjo0Kx8Ly+maxLjJmjQ18rA0YCkxLQbUZP1WqdmyQGJLUm7VnQFqodmXSqmRrdVpqdzk5LvmvgtEcW8PMGdaS23EOWyDVbACZzUJPaqMbjDxpA3Qrgl0AikimGDbqmyT8P8NOYiqrldF8rX+YN7TopX4UoHuSCYY7cgX4gHwclQKl1zhx0THf+tCAUValzjI7Wg9EhptrkIcfIJjA94evOn8B2eHaVzvBrnl2ig0So6hvPaz0IGcOvTHvUIlE2+prqAxLSQxZlU2stql1NqCCLdIiIN/i1DBEHUoElM9dBravbiAnKqgpi4IBkw+utSPIoBijDXJipSVV7MpOEJUAc5Qmm3BnUN+w3hteEieYKfRZSIUcXKMVf0u5wD4EwsUNVvZOtUT7A2GkffHjByWpHqvRBYrTV72a6j8zZ6W0DTE86Hn04bmyWX3Ri9WH7ZU6Q7h+ZHo0nHUAcsQvVhXRDZHChwiyi/hnPuOsSEF6Exk3o6Y9DT1eZ+6cASXk2Y9k+6EOQMDGm6WBK10wOQJCBwren86cPPWUcRAnTVjGcU1LBgs9FURiX/e6479yZcLwCBmTxiawEwrOcleuu12t3tbLv/N4RLYIBhYexm7Fcn4OJcn0+zc+s8/VfPeddZHAGN6TT8eGczHdR/Gts1/MzDkThr23zqrVfAMFT33Nx1RJsx1k5zuWILLnG/vsH+Fv5D4NTVcp1Gzo8AAAAAElFTkSuQmCC&labelColor=white)](https://huggingface.co/spaces/opendatalab/MinerU)
[![Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/gist/myhloli/a3cb16570ab3cfeadf9d8f0ac91b4fca/mineru_demo.ipynb)
[![arXiv](https://img.shields.io/badge/MinerU-Technical%20Report-b31b1b.svg?logo=arXiv)](https://arxiv.org/abs/2409.18839)
[![arXiv](https://img.shields.io/badge/MinerU2.5-Technical%20Report-b31b1b.svg?logo=arXiv)](https://arxiv.org/abs/2509.22186)
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/opendatalab/MinerU)
<div align="center">
<a href="https://trendshift.io/repositories/11174" target="_blank"><img src="https://trendshift.io/api/badge/repositories/11174" alt="opendatalab%2FMinerU | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
<!-- hot link -->
<p align="center">
🚀<a href="https://mineru.net/?source=github">MinerU 官网入口→✅ 免装在线版 ✅ 全功能客户端 ✅ 开发者API在线调用,省去部署麻烦,多种产品形态一键get,速冲!</a>
</p>
<!-- join us -->
<p align="center">
👋 join us on <a href="https://discord.gg/Tdedn9GTXq" target="_blank">Discord</a> and <a href="https://mineru.net/community-portal/?aliasId=3c430f94" target="_blank">WeChat</a>
</p>
</div>
## 项目简介
MinerU是一款将PDF转化为机器可读格式的工具(如markdown、json),可以很方便地抽取为任意格式。
MinerU诞生于[书生-浦语](https://github.com/InternLM/InternLM)的预训练过程中,我们将会集中精力解决科技文献中的符号转化问题,希望在大模型时代为科技发展做出贡献。
相比国内外知名商用产品MinerU还很年轻,如果遇到问题或者结果不及预期请到[issue](https://github.com/opendatalab/MinerU/issues)提交问题,同时**附上相关PDF**。
![type:video](https://github.com/user-attachments/assets/4bea02c9-6d54-4cd6-97ed-dff14340982c)
## 主要功能
- 删除页眉、页脚、脚注、页码等元素,确保语义连贯
- 输出符合人类阅读顺序的文本,适用于单栏、多栏及复杂排版
- 保留原文档的结构,包括标题、段落、列表等
- 提取图像、图片描述、表格、表格标题及脚注
- 自动识别并转换文档中的公式为LaTeX格式
- 自动识别并转换文档中的表格为HTML格式
- 自动检测扫描版PDF和乱码PDF,并启用OCR功能
- OCR支持109种语言的检测与识别
- 支持多种输出格式,如多模态与NLP的Markdown、按阅读顺序排序的JSON、含有丰富信息的中间格式等
- 支持多种可视化结果,包括layout可视化、span可视化等,便于高效确认输出效果与质检
- 支持纯CPU环境运行,并支持 GPU(CUDA)/NPU(CANN)/MPS 加速
- 兼容Windows、Linux和Mac平台
## 使用指南
- [快速上手指南](./quick_start/index.md)
- [详细使用说明](./usage/index.md)
@@ -0,0 +1,86 @@
# 使用docker部署Mineru
MinerU提供了便捷的docker部署方式,这有助于快速搭建环境并解决一些棘手的环境兼容问题。
## 使用 Dockerfile 构建镜像
```bash
wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/docker/china/Dockerfile
docker build -t mineru-vllm:latest -f Dockerfile .
```
> [!TIP]
> [Dockerfile](https://github.com/opendatalab/MinerU/blob/master/docker/china/Dockerfile)默认使用`vllm/vllm-openai:v0.10.1.1`作为基础镜像,
> 该版本的vLLM v1 engine对显卡型号支持有限,如您无法在Turing及更早架构的显卡上使用vLLM加速推理,可通过更改基础镜像为`vllm/vllm-openai:v0.10.2`来解决该问题。
## Docker说明
Mineru的docker使用了`vllm/vllm-openai`作为基础镜像,因此在docker中默认集成了`vllm`推理加速框架和必需的依赖环境。因此在满足条件的设备上,您可以直接使用`vllm`加速VLM模型推理。
> [!NOTE]
> 使用`vllm`加速VLM模型推理需要满足的条件是:
>
> - 设备包含Turing及以后架构的显卡,且可用显存大于等于8G。
> - 物理机的显卡驱动应支持CUDA 12.8或更高版本,可通过`nvidia-smi`命令检查驱动版本。
> - docker中能够访问物理机的显卡设备。
## 启动 Docker 容器
```bash
docker run --gpus all \
--shm-size 32g \
-p 30000:30000 -p 7860:7860 -p 8000:8000 \
--ipc=host \
-it mineru-vllm:latest \
/bin/bash
```
执行该命令后,您将进入到Docker容器的交互式终端,并映射了一些端口用于可能会使用的服务,您可以直接在容器内运行MinerU相关命令来使用MinerU的功能。
您也可以直接通过替换`/bin/bash`为服务启动命令来启动MinerU服务,详细说明请参考[通过命令启动服务](https://opendatalab.github.io/MinerU/zh/usage/quick_usage/#apiwebuihttp-clientserver)。
## 通过 Docker Compose 直接启动服务
我们提供了[compose.yml](https://github.com/opendatalab/MinerU/blob/master/docker/compose.yaml)文件,您可以通过它来快速启动MinerU服务。
```bash
# 下载 compose.yaml 文件
wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/docker/compose.yaml
```
>[!NOTE]
>
>- `compose.yaml`文件中包含了MinerU的多个服务配置,您可以根据需要选择启动特定的服务。
>- 不同的服务可能会有额外的参数配置,您可以在`compose.yaml`文件中查看并编辑。
>- 由于`vllm`推理加速框架预分配显存的特性,您可能无法在同一台机器上同时运行多个`vllm`服务,因此请确保在启动`vlm-vllm-server`服务或使用`vlm-vllm-engine`后端时,其他可能使用显存的服务已停止。
---
### 启动 vllm-server 服务
并通过`vlm-http-client`后端连接`vllm-server`
```bash
docker compose -f compose.yaml --profile vllm-server up -d
```
>[!TIP]
>在另一个终端中通过http client连接vllm server(只需cpu与网络,不需要vllm环境)
> ```bash
> mineru -p <input_path> -o <output_path> -b vlm-http-client -u http://<server_ip>:30000
> ```
---
### 启动 Web API 服务
```bash
docker compose -f compose.yaml --profile api up -d
```
>[!TIP]
>在浏览器中访问 `http://<server_ip>:8000/docs` 查看API文档。
---
### 启动 Gradio WebUI 服务
```bash
docker compose -f compose.yaml --profile gradio up -d
```
>[!TIP]
>
>- 在浏览器中访问 `http://<server_ip>:7860` 使用 Gradio WebUI。
>- 访问 `http://<server_ip>:7860/?view=api` 使用 Gradio API。
@@ -0,0 +1,29 @@
# MinerU 扩展模块安装指南
MinerU 支持根据不同需求,按需安装扩展模块,以增强功能或支持特定的模型后端。
## 常见场景
### 核心功能安装
`core` 模块是 MinerU 的核心依赖,包含了除`vllm`外的所有功能模块。安装此模块可以确保 MinerU 的基本功能正常运行。
```bash
uv pip install "mineru[core]"
```
---
### 使用`vllm`加速 VLM 模型推理
`vllm` 模块提供了对 VLM 模型推理的加速支持,适用于具有 Turing 及以后架构的显卡(8G 显存及以上)。安装此模块可以显著提升模型推理速度。
在配置中,`all`包含了`core``vllm`模块,因此`mineru[all]``mineru[core,vllm]`是等价的。
```bash
uv pip install "mineru[all]"
```
> [!TIP]
> 如在安装包含vllm的完整包过程中发生异常,请参考 [vllm 官方文档](https://docs.vllm.ai/en/latest/getting_started/installation/index.html) 尝试解决,或直接使用 [Docker](./docker_deployment.md) 方式部署镜像。
---
### 安装轻量版client连接vllm-server使用
如果您需要在边缘设备上安装轻量版的 client 端以连接 `vllm-server`,可以安装mineru的基础包,非常轻量,适合在只有cpu和网络连接的设备上使用。
```bash
uv pip install mineru
```
@@ -0,0 +1,134 @@
# 快速开始
如果遇到任何安装问题,请先查询 [FAQ](../faq/index.md)
## 在线体验
### 官网在线应用
官网在线版功能与客户端一致,界面美观,功能丰富,需要登录使用
- [![OpenDataLab](https://img.shields.io/badge/webapp_on_mineru.net-blue?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTM0IiBoZWlnaHQ9IjEzNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJtMTIyLDljMCw1LTQsOS05LDlzLTktNC05LTksNC05LDktOSw5LDQsOSw5eiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Im0xMjIsOWMwLDUtNCw5LTksOXMtOS00LTktOSw0LTksOS05LDksNCw5LDl6IiBmaWxsPSIjMDEwMTAxIi8+PHBhdGggZD0ibTkxLDE4YzAsNS00LDktOSw5cy05LTQtOS05LDQtOSw5LTksOSw0LDksOXoiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJtOTEsMThjMCw1LTQsOS05LDlzLTktNC05LTksNC05LDktOSw5LDQsOSw5eiIgZmlsbD0iIzAxMDEwMSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMzksNjJjMCwxNiw4LDMwLDIwLDM4LDctNiwxMi0xNiwxMi0yNlY0OWMwLTQsMy03LDYtOGw0Ni0xMmM1LTEsMTEsMywxMSw4djMxYzAsMzctMzAsNjYtNjYsNjYtMzcsMC02Ni0zMC02Ni02NlY0NmMwLTQsMy03LDYtOGwyMC02YzUtMSwxMSwzLDExLDh2MjF6bS0yOSw2YzAsMTYsNiwzMCwxNyw0MCwzLDEsNSwxLDgsMSw1LDAsMTAtMSwxNS0zQzM3LDk1LDI5LDc5LDI5LDYyVjQybC0xOSw1djIweiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJtMzksNjJjMCwxNiw4LDMwLDIwLDM4LDctNiwxMi0xNiwxMi0yNlY0OWMwLTQsMy03LDYtOGw0Ni0xMmM1LTEsMTEsMywxMSw4djMxYzAsMzctMzAsNjYtNjYsNjYtMzcsMC02Ni0zMC02Ni02NlY0NmMwLTQsMy03LDYtOGwyMC02YzUtMSwxMSwzLDExLDh2MjF6bS0yOSw2YzAsMTYsNiwzMCwxNyw0MCwzLDEsNSwxLDgsMSw1LDAsMTAtMSwxNS0zQzM3LDk1LDI5LDc5LDI5LDYyVjQybC0xOSw1djIweiIgZmlsbD0iIzAxMDEwMSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9Ijg0IiB5MT0iNDEiIHgyPSI3NSIgeTI9IjEyMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyZTJlMmUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4=&labelColor=white)](https://mineru.net/OpenSourceTools/Extractor?source=github)
### 基于Gradio的在线demo
基于gradio开发的webui,界面简洁,仅包含核心解析功能,免登录
- [![ModelScope](https://img.shields.io/badge/Demo_on_ModelScope-purple?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIzIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCiA8Zz4KICA8dGl0bGU+TGF5ZXIgMTwvdGl0bGU+CiAgPHBhdGggaWQ9InN2Z18xNCIgZmlsbD0iIzYyNGFmZiIgZD0ibTAsODkuODRsMjUuNjUsMGwwLDI1LjY0OTk5bC0yNS42NSwwbDAsLTI1LjY0OTk5eiIvPgogIDxwYXRoIGlkPSJzdmdfMTUiIGZpbGw9IiM2MjRhZmYiIGQ9Im05OS4xNCwxMTUuNDlsMjUuNjUsMGwwLDI1LjY1bC0yNS42NSwwbDAsLTI1LjY1eiIvPgogIDxwYXRoIGlkPSJzdmdfMTYiIGZpbGw9IiM2MjRhZmYiIGQ9Im0xNzYuMDksMTQxLjE0bC0yNS42NDk5OSwwbDAsMjIuMTlsNDcuODQsMGwwLC00Ny44NGwtMjIuMTksMGwwLDI1LjY1eiIvPgogIDxwYXRoIGlkPSJzdmdfMTciIGZpbGw9IiMzNmNmZDEiIGQ9Im0xMjQuNzksODkuODRsMjUuNjUsMGwwLDI1LjY0OTk5bC0yNS42NSwwbDAsLTI1LjY0OTk5eiIvPgogIDxwYXRoIGlkPSJzdmdfMTgiIGZpbGw9IiMzNmNmZDEiIGQ9Im0wLDY0LjE5bDI1LjY1LDBsMCwyNS42NWwtMjUuNjUsMGwwLC0yNS42NXoiLz4KICA8cGF0aCBpZD0ic3ZnXzE5IiBmaWxsPSIjNjI0YWZmIiBkPSJtMTk4LjI4LDg5Ljg0bDI1LjY0OTk5LDBsMCwyNS42NDk5OWwtMjUuNjQ5OTksMGwwLC0yNS42NDk5OXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIwIiBmaWxsPSIjMzZjZmQxIiBkPSJtMTk4LjI4LDY0LjE5bDI1LjY0OTk5LDBsMCwyNS42NWwtMjUuNjQ5OTksMGwwLC0yNS42NXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIxIiBmaWxsPSIjNjI0YWZmIiBkPSJtMTUwLjQ0LDQybDAsMjIuMTlsMjUuNjQ5OTksMGwwLDI1LjY1bDIyLjE5LDBsMCwtNDcuODRsLTQ3Ljg0LDB6Ii8+CiAgPHBhdGggaWQ9InN2Z18yMiIgZmlsbD0iIzM2Y2ZkMSIgZD0ibTczLjQ5LDg5Ljg0bDI1LjY1LDBsMCwyNS42NDk5OWwtMjUuNjUsMGwwLC0yNS42NDk5OXoiLz4KICA8cGF0aCBpZD0ic3ZnXzIzIiBmaWxsPSIjNjI0YWZmIiBkPSJtNDcuODQsNjQuMTlsMjUuNjUsMGwwLC0yMi4xOWwtNDcuODQsMGwwLDQ3Ljg0bDIyLjE5LDBsMCwtMjUuNjV6Ii8+CiAgPHBhdGggaWQ9InN2Z18yNCIgZmlsbD0iIzYyNGFmZiIgZD0ibTQ3Ljg0LDExNS40OWwtMjIuMTksMGwwLDQ3Ljg0bDQ3Ljg0LDBsMCwtMjIuMTlsLTI1LjY1LDBsMCwtMjUuNjV6Ii8+CiA8L2c+Cjwvc3ZnPg==&labelColor=white)](https://www.modelscope.cn/studios/OpenDataLab/MinerU)
- [![HuggingFace](https://img.shields.io/badge/Demo_on_HuggingFace-yellow.svg?logo=data:image/png;base64,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&labelColor=white)](https://huggingface.co/spaces/opendatalab/MinerU)
## 本地部署
> [!WARNING]
> **安装前必看——软硬件环境支持说明**
>
> 为了确保项目的稳定性和可靠性,我们在开发过程中仅对特定的软硬件环境进行优化和测试。这样当用户在推荐的系统配置上部署和运行项目时,能够获得最佳的性能表现和最少的兼容性问题。
>
> 通过集中资源和精力于主线环境,我们团队能够更高效地解决潜在的BUG,及时开发新功能。
>
> 在非主线环境中,由于硬件、软件配置的多样性,以及第三方依赖项的兼容性问题,我们无法100%保证项目的完全可用性。因此,对于希望在非推荐环境中使用本项目的用户,我们建议先仔细阅读文档以及FAQ,大多数问题已经在FAQ中有对应的解决方案,除此之外我们鼓励社区反馈问题,以便我们能够逐步扩大支持范围。
<table border="1">
<thead>
<tr>
<th rowspan="2">解析后端</th>
<th rowspan="2">pipeline <br> (精度<sup>1</sup> 82+)</th>
<th colspan="4" style="text-align:center;">vlm (精度<sup>1</sup> 90+)</th>
</tr>
<tr>
<th>transformers</th>
<th>mlx-engine</th>
<th>vllm-engine / <br>vllm-async-engine</th>
<th>http-client</th>
</tr>
</thead>
<tbody>
<tr>
<th>后端特性</th>
<td>速度快, 无幻觉</td>
<td>兼容性好, 速度较慢</td>
<td>比transformers快</td>
<td>速度快, 兼容vllm生态</td>
<td>适用于OpenAI兼容服务器<sup>5</sup></td>
</tr>
<tr>
<th>操作系统</th>
<td colspan="2" style="text-align:center;">Linux<sup>2</sup> / Windows / macOS</td>
<td style="text-align:center;">macOS<sup>3</sup></td>
<td style="text-align:center;">Linux<sup>2</sup> / Windows<sup>4</sup> </td>
<td>不限</td>
</tr>
<tr>
<th>CPU推理支持</th>
<td colspan="2" style="text-align:center;">✅</td>
<td colspan="2" style="text-align:center;">❌</td>
<td >不需要</td>
</tr>
<tr>
<th>GPU要求</th><td colspan="2" style="text-align:center;">Volta及以后架构, 6G显存以上或Apple Silicon</td>
<td>Apple Silicon</td>
<td>Volta及以后架构, 8G显存以上</td>
<td>不需要</td>
</tr>
<tr>
<th>内存要求</th>
<td colspan="4" style="text-align:center;">最低16GB以上, 推荐32GB以上</td>
<td>8GB</td>
</tr>
<tr>
<th>磁盘空间要求</th>
<td colspan="4" style="text-align:center;">20GB以上, 推荐使用SSD</td>
<td>2GB</td>
</tr>
<tr>
<th>python版本</th>
<td colspan="5" style="text-align:center;">3.10-3.13</td>
</tr>
</tbody>
</table>
<sup>1</sup> 精度指标为OmniDocBench (v1.5)的End-to-End Evaluation Overall分数,基于`MinerU`最新版本测试
<sup>2</sup> Linux仅支持2019年及以后发行版
<sup>3</sup> MLX需macOS 13.5及以上版本支持,推荐14.0以上版本使用
<sup>4</sup> Windows vLLM通过WSL2(适用于 Linux 的 Windows 子系统)实现支持
<sup>5</sup> 兼容OpenAI API的服务器,如通过`vLLM`/`SGLang`/`LMDeploy`等推理框架部署的本地模型服务器或远程模型服务
> [!TIP]
> 除以上主流环境与平台外,我们也收录了一些社区用户反馈的其他平台支持情况,详情请参考[其他加速卡适配](https://opendatalab.github.io/MinerU/zh/usage/)。
> 如果您有意将自己的环境适配经验分享给社区,欢迎通过[show-and-tell](https://github.com/opendatalab/MinerU/discussions/categories/show-and-tell)提交或提交PR至[其他加速卡适配](https://github.com/opendatalab/MinerU/tree/master/docs/zh/usage/acceleration_cards)文档。
### 安装 MinerU
#### 使用pip或uv安装MinerU
```bash
pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple
pip install uv -i https://mirrors.aliyun.com/pypi/simple
uv pip install -U "mineru[core]" -i https://mirrors.aliyun.com/pypi/simple
```
#### 通过源码安装MinerU
```bash
git clone https://github.com/opendatalab/MinerU.git
cd MinerU
uv pip install -e .[core] -i https://mirrors.aliyun.com/pypi/simple
```
> [!TIP]
> `mineru[core]`包含除`vllm`加速外的所有核心功能,兼容Windows / Linux / macOS系统,适合绝大多数用户。
> 如果您有使用`vllm`加速VLM模型推理,或是在边缘设备安装轻量版client端等需求,可以参考文档[扩展模块安装指南](./extension_modules.md)。
---
#### 使用docker部署Mineru
MinerU提供了便捷的docker部署方式,这有助于快速搭建环境并解决一些棘手的环境兼容问题。
您可以在文档中获取[Docker部署说明](./docker_deployment.md)。
---
### 使用 MinerU
最简单的命令行调用方式:
```bash
mineru -p <input_path> -o <output_path>
```
您可以通过命令行、API、WebUI等多种方式使用MinerU进行PDF解析,具体使用方法请参考[使用指南](../usage/index.md)。
@@ -0,0 +1,827 @@
# MinerU 输出文件说明
## 概览
`mineru` 命令执行后,除了输出主要的 markdown 文件外,还会生成多个辅助文件用于调试、质检和进一步处理。这些文件包括:
- **可视化调试文件**:帮助用户直观了解文档解析过程和结果
- **结构化数据文件**:包含详细的解析数据,可用于二次开发
下面将详细介绍每个文件的作用和格式。
## 可视化调试文件
### 布局分析文件 (layout.pdf)
**文件命名格式**`{原文件名}_layout.pdf`
**功能说明**
- 可视化展示每一页的布局分析结果
- 每个检测框右上角的数字表示阅读顺序
- 使用不同背景色块区分不同类型的内容块
**使用场景**
- 检查布局分析是否正确
- 确认阅读顺序是否合理
- 调试布局相关问题
![layout 页面示例](../images/layout_example.png)
### 文本片段文件 (spans.pdf)
> [!NOTE]
> 仅适用于 pipeline 后端
**文件命名格式**`{原文件名}_spans.pdf`
**功能说明**
- 根据 span 类型使用不同颜色线框标注页面内容
- 用于质量检查和问题排查
**使用场景**
- 快速排查文本丢失问题
- 检查行内公式识别情况
- 验证文本分割准确性
![span 页面示例](../images/spans_example.png)
## 结构化数据文件
> [!IMPORTANT]
> 2.5版本vlm后端的输出存在较大变化,与pipeline版本存在不兼容情况,如需基于结构化输出进行二次开发,请仔细阅读本文档内容。
### pipeline 后端 输出结果
#### 模型推理结果 (model.json)
**文件命名格式**`{原文件名}_model.json`
##### 数据结构定义
```python
from pydantic import BaseModel, Field
from enum import IntEnum
class CategoryType(IntEnum):
"""内容类别枚举"""
title = 0 # 标题
plain_text = 1 # 文本
abandon = 2 # 包括页眉页脚页码和页面注释
figure = 3 # 图片
figure_caption = 4 # 图片描述
table = 5 # 表格
table_caption = 6 # 表格描述
table_footnote = 7 # 表格注释
isolate_formula = 8 # 行间公式
formula_caption = 9 # 行间公式的标号
embedding = 13 # 行内公式
isolated = 14 # 行间公式
text = 15 # OCR 识别结果
class PageInfo(BaseModel):
"""页面信息"""
page_no: int = Field(description="页码序号,第一页的序号是 0", ge=0)
height: int = Field(description="页面高度", gt=0)
width: int = Field(description="页面宽度", ge=0)
class ObjectInferenceResult(BaseModel):
"""对象识别结果"""
category_id: CategoryType = Field(description="类别", ge=0)
poly: list[float] = Field(description="四边形坐标,格式为 [x0,y0,x1,y1,x2,y2,x3,y3]")
score: float = Field(description="推理结果的置信度")
latex: str | None = Field(description="LaTeX 解析结果", default=None)
html: str | None = Field(description="HTML 解析结果", default=None)
class PageInferenceResults(BaseModel):
"""页面推理结果"""
layout_dets: list[ObjectInferenceResult] = Field(description="页面识别结果")
page_info: PageInfo = Field(description="页面元信息")
# 完整的推理结果
inference_result: list[PageInferenceResults] = []
```
##### 坐标系统说明
`poly` 坐标格式:`[x0, y0, x1, y1, x2, y2, x3, y3]`
- 分别表示左上、右上、右下、左下四点的坐标
- 坐标原点在页面左上角
![poly 坐标示意图](../images/poly.png)
##### 示例数据
```json
[
{
"layout_dets": [
{
"category_id": 2,
"poly": [
99.1906967163086,
100.3119125366211,
730.3707885742188,
100.3119125366211,
730.3707885742188,
245.81326293945312,
99.1906967163086,
245.81326293945312
],
"score": 0.9999997615814209
}
],
"page_info": {
"page_no": 0,
"height": 2339,
"width": 1654
}
},
{
"layout_dets": [
{
"category_id": 5,
"poly": [
99.13092803955078,
2210.680419921875,
497.3183898925781,
2210.680419921875,
497.3183898925781,
2264.78076171875,
99.13092803955078,
2264.78076171875
],
"score": 0.9999997019767761
}
],
"page_info": {
"page_no": 1,
"height": 2339,
"width": 1654
}
}
]
```
#### 中间处理结果 (middle.json)
**文件命名格式**`{原文件名}_middle.json`
##### 顶层结构
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `pdf_info` | `list[dict]` | 每一页的解析结果数组 |
| `_backend` | `string` | 解析模式:`pipeline``vlm` |
| `_version_name` | `string` | MinerU 版本号 |
##### 页面信息结构 (pdf_info)
| 字段名 | 说明 |
|--------|------|
| `preproc_blocks` | PDF 预处理后的未分段中间结果 |
| `page_idx` | 页码,从 0 开始 |
| `page_size` | 页面的宽度和高度 `[width, height]` |
| `images` | 图片块信息列表 |
| `tables` | 表格块信息列表 |
| `interline_equations` | 行间公式块信息列表 |
| `discarded_blocks` | 需要丢弃的块信息 |
| `para_blocks` | 分段后的内容块结果 |
##### 块结构层次
```
一级块 (table | image)
└── 二级块
└── 行 (line)
└── 片段 (span)
```
##### 一级块字段
| 字段名 | 说明 |
|--------|------|
| `type` | 块类型:`table``image` |
| `bbox` | 块的矩形框坐标 `[x0, y0, x1, y1]` |
| `blocks` | 包含的二级块列表 |
##### 二级块字段
| 字段名 | 说明 |
|--------|------|
| `type` | 块类型(详见下表) |
| `bbox` | 块的矩形框坐标 |
| `lines` | 包含的行信息列表 |
##### 二级块类型
| 类型 | 说明 |
|------|------|
| `image_body` | 图像本体 |
| `image_caption` | 图像描述文本 |
| `image_footnote` | 图像脚注 |
| `table_body` | 表格本体 |
| `table_caption` | 表格描述文本 |
| `table_footnote` | 表格脚注 |
| `text` | 文本块 |
| `title` | 标题块 |
| `index` | 目录块 |
| `list` | 列表块 |
| `interline_equation` | 行间公式块 |
##### 行和片段结构
**行 (line) 字段**
- `bbox`:行的矩形框坐标
- `spans`:包含的片段列表
**片段 (span) 字段**
- `bbox`:片段的矩形框坐标
- `type`:片段类型(`image``table``text``inline_equation``interline_equation`
- `content` | `img_path`:文本内容或图片路径
##### 示例数据
```json
{
"pdf_info": [
{
"preproc_blocks": [
{
"type": "text",
"bbox": [
52,
61.956024169921875,
294,
82.99800872802734
],
"lines": [
{
"bbox": [
52,
61.956024169921875,
294,
72.0000228881836
],
"spans": [
{
"bbox": [
54.0,
61.956024169921875,
296.2261657714844,
72.0000228881836
],
"content": "dependent on the service headway and the reliability of the departure ",
"type": "text",
"score": 1.0
}
]
}
]
}
],
"layout_bboxes": [
{
"layout_bbox": [
52,
61,
294,
731
],
"layout_label": "V",
"sub_layout": []
}
],
"page_idx": 0,
"page_size": [
612.0,
792.0
],
"_layout_tree": [],
"images": [],
"tables": [],
"interline_equations": [],
"discarded_blocks": [],
"para_blocks": [
{
"type": "text",
"bbox": [
52,
61.956024169921875,
294,
82.99800872802734
],
"lines": [
{
"bbox": [
52,
61.956024169921875,
294,
72.0000228881836
],
"spans": [
{
"bbox": [
54.0,
61.956024169921875,
296.2261657714844,
72.0000228881836
],
"content": "dependent on the service headway and the reliability of the departure ",
"type": "text",
"score": 1.0
}
]
}
]
}
]
}
],
"_backend": "pipeline",
"_version_name": "0.6.1"
}
```
#### 内容列表 (content_list.json)
**文件命名格式**`{原文件名}_content_list.json`
##### 功能说明
这是一个简化版的 `middle.json`,按阅读顺序平铺存储所有可读内容块,去除了复杂的布局信息,便于后续处理。
##### 内容类型
| 类型 | 说明 |
|------|------|
| `image` | 图片 |
| `table` | 表格 |
| `text` | 文本/标题 |
| `equation` | 行间公式 |
##### 文本层级标识
通过 `text_level` 字段区分文本层级:
-`text_level``text_level: 0`:正文文本
- `text_level: 1`:一级标题
- `text_level: 2`:二级标题
- 以此类推...
##### 通用字段
- 所有内容块都包含 `page_idx` 字段,表示所在页码(从 0 开始)。
- 所有内容块都包含 `bbox` 字段,表示内容块的边界框坐标 `[x0, y0, x1, y1]` 映射在0-1000范围内的结果。
##### 示例数据
```json
[
{
"type": "text",
"text": "The response of flow duration curves to afforestation ",
"text_level": 1,
"bbox": [
62,
480,
946,
904
],
"page_idx": 0
},
{
"type": "image",
"img_path": "images/a8ecda1c69b27e4f79fce1589175a9d721cbdc1cf78b4cc06a015f3746f6b9d8.jpg",
"image_caption": [
"Fig. 1. Annual flow duration curves of daily flows from Pine Creek, Australia, 19892000. "
],
"image_footnote": [],
"bbox": [
62,
480,
946,
904
],
"page_idx": 1
},
{
"type": "equation",
"img_path": "images/181ea56ef185060d04bf4e274685f3e072e922e7b839f093d482c29bf89b71e8.jpg",
"text": "$$\nQ _ { \\% } = f ( P ) + g ( T )\n$$",
"text_format": "latex",
"bbox": [
62,
480,
946,
904
],
"page_idx": 2
},
{
"type": "table",
"img_path": "images/e3cb413394a475e555807ffdad913435940ec637873d673ee1b039e3bc3496d0.jpg",
"table_caption": [
"Table 2 Significance of the rainfall and time terms "
],
"table_footnote": [
"indicates that the rainfall term was significant at the $5 \\%$ level, $T$ indicates that the time term was significant at the $5 \\%$ level, \\* represents significance at the $10 \\%$ level, and na denotes too few data points for meaningful analysis. "
],
"table_body": "<html><body><table><tr><td rowspan=\"2\">Site</td><td colspan=\"10\">Percentile</td></tr><tr><td>10</td><td>20</td><td>30</td><td>40</td><td>50</td><td>60</td><td>70</td><td>80</td><td>90</td><td>100</td></tr><tr><td>Traralgon Ck</td><td>P</td><td>P,*</td><td>P</td><td>P</td><td>P,</td><td>P,</td><td>P,</td><td>P,</td><td>P</td><td>P</td></tr><tr><td>Redhill</td><td>P,T</td><td>P,T</td><td>*</td><td>**</td><td>P.T</td><td>P,*</td><td>P*</td><td>P*</td><td>*</td><td>*</td></tr><tr><td>Pine Ck</td><td></td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>T</td><td>T</td><td>T</td><td>na</td><td>na</td></tr><tr><td>Stewarts Ck 5</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P.T</td><td>P.T</td><td>P,T</td><td>na</td><td>na</td><td>na</td></tr><tr><td>Glendhu 2</td><td>P</td><td>P,T</td><td>P,*</td><td>P,T</td><td>P.T</td><td>P,ns</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td></tr><tr><td>Cathedral Peak 2</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>*,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>T</td></tr><tr><td>Cathedral Peak 3</td><td>P.T</td><td>P.T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>T</td></tr><tr><td>Lambrechtsbos A</td><td>P,T</td><td>P</td><td>P</td><td>P,T</td><td>*,T</td><td>*,T</td><td>*,T</td><td>*,T</td><td>*,T</td><td>T</td></tr><tr><td>Lambrechtsbos B</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>P,T</td><td>T</td><td>T</td></tr><tr><td>Biesievlei</td><td>P,T</td><td>P.T</td><td>P,T</td><td>P,T</td><td>*,T</td><td>*,T</td><td>T</td><td>T</td><td>P,T</td><td>P,T</td></tr></table></body></html>",
"bbox": [
62,
480,
946,
904
],
"page_idx": 5
}
]
```
### VLM 后端 输出结果
#### 模型推理结果 (model.json)
**文件命名格式**`{原文件名}_model.json`
##### 文件格式说明
- 该文件为 VLM 模型的原始输出结果,包含两层嵌套list,外层表示页面,内层表示该页的内容块
- 每个内容块都是一个dict,包含 `type``bbox``angle``content` 字段
##### 支持的内容类型
```json
{
"text": "文本",
"title": "标题",
"equation": "行间公式",
"image": "图片",
"image_caption": "图片描述",
"image_footnote": "图片脚注",
"table": "表格",
"table_caption": "表格描述",
"table_footnote": "表格脚注",
"phonetic": "拼音",
"code": "代码块",
"code_caption": "代码描述",
"ref_text": "参考文献",
"algorithm": "算法块",
"list": "列表",
"header": "页眉",
"footer": "页脚",
"page_number": "页码",
"aside_text": "装订线旁注",
"page_footnote": "页面脚注"
}
```
##### 坐标系统说明
`bbox` 坐标格式:`[x0, y0, x1, y1]`
- 分别表示左上、右下两点的坐标
- 坐标原点在页面左上角
- 坐标为相对于原始页面尺寸的百分比,范围在0-1之间
##### 示例数据
```json
[
[
{
"type": "header",
"bbox": [
0.077,
0.095,
0.18,
0.181
],
"angle": 0,
"score": null,
"block_tags": null,
"content": "ELSEVIER",
"format": null,
"content_tags": null
},
{
"type": "title",
"bbox": [
0.157,
0.228,
0.833,
0.253
],
"angle": 0,
"score": null,
"block_tags": null,
"content": "The response of flow duration curves to afforestation",
"format": null,
"content_tags": null
}
]
]
```
#### 中间处理结果 (middle.json)
**文件命名格式**`{原文件名}_middle.json`
##### 文件格式说明
vlm 后端的 middle.json 文件结构与 pipeline 后端类似,但存在以下差异:
- list变成二级block,增加`sub_type`字段区分list类型:
* `text`(文本类型)
* `ref_text`(引用类型)
- 增加code类型blockcode类型包含两种"sub_type":
* 分别是`code``algorithm`
* 至少有`code_body`, 可选`code_caption`
- `discarded_blocks`内元素type增加以下类型:
* `header`(页眉)
* `footer`(页脚)
* `page_number`(页码)
* `aside_text`(装订线文本)
* `page_footnote`(脚注)
- 所有block增加`angle`字段,用来表示旋转角度,0,90,180,270
##### 示例数据
- list block 示例
```json
{
"bbox": [
174,
155,
818,
333
],
"type": "list",
"angle": 0,
"index": 11,
"blocks": [
{
"bbox": [
174,
157,
311,
175
],
"type": "text",
"angle": 0,
"lines": [
{
"bbox": [
174,
157,
311,
175
],
"spans": [
{
"bbox": [
174,
157,
311,
175
],
"type": "text",
"content": "H.1 Introduction"
}
]
}
],
"index": 3
},
{
"bbox": [
175,
182,
464,
229
],
"type": "text",
"angle": 0,
"lines": [
{
"bbox": [
175,
182,
464,
229
],
"spans": [
{
"bbox": [
175,
182,
464,
229
],
"type": "text",
"content": "H.2 Example: Divide by Zero without Exception Handling"
}
]
}
],
"index": 4
}
],
"sub_type": "text"
}
```
- code block 示例
```json
{
"type": "code",
"bbox": [
114,
780,
885,
1231
],
"blocks": [
{
"bbox": [
114,
780,
885,
1231
],
"lines": [
{
"bbox": [
114,
780,
885,
1231
],
"spans": [
{
"bbox": [
114,
780,
885,
1231
],
"type": "text",
"content": "1 // Fig. H.1: DivideByZeroNoExceptionHandling.java \n2 // Integer division without exception handling. \n3 import java.util.Scanner; \n4 \n5 public class DivideByZeroNoExceptionHandling \n6 { \n7 // demonstrates throwing an exception when a divide-by-zero occurs \n8 public static int quotient( int numerator, int denominator ) \n9 { \n10 return numerator / denominator; // possible division by zero \n11 } // end method quotient \n12 \n13 public static void main(String[] args) \n14 { \n15 Scanner scanner = new Scanner(System.in); // scanner for input \n16 \n17 System.out.print(\"Please enter an integer numerator: \"); \n18 int numerator = scanner.nextInt(); \n19 System.out.print(\"Please enter an integer denominator: \"); \n20 int denominator = scanner.nextInt(); \n21"
}
]
}
],
"index": 17,
"angle": 0,
"type": "code_body"
},
{
"bbox": [
867,
160,
1280,
189
],
"lines": [
{
"bbox": [
867,
160,
1280,
189
],
"spans": [
{
"bbox": [
867,
160,
1280,
189
],
"type": "text",
"content": "Algorithm 1 Modules for MCTSteg"
}
]
}
],
"index": 19,
"angle": 0,
"type": "code_caption"
}
],
"index": 17,
"sub_type": "code"
}
```
#### 内容列表 (content_list.json)
**文件命名格式**`{原文件名}_content_list.json`
##### 文件格式说明
vlm 后端的 content_list.json 文件结构与 pipeline 后端类似,伴随本次middle.json的变化,做了以下调整:
- 新增`code`类型,code类型包含两种"sub_type":
* 分别是`code`和`algorithm`
* 至少有`code_body`, 可选`code_caption`
- 新增`list`类型,list类型包含两种"sub_type":
* `text`
* `ref_text`
- 增加所有所有`discarded_blocks`的输出内容
* `header`
* `footer`
* `page_number`
* `aside_text`
* `page_footnote`
##### 示例数据
- code 类型 content
```json
{
"type": "code",
"sub_type": "algorithm",
"code_caption": [
"Algorithm 1 Modules for MCTSteg"
],
"code_body": "1: function GETCOORDINATE(d) \n2: $x \\gets d / l$ , $y \\gets d$ mod $l$ \n3: return $(x, y)$ \n4: end function \n5: function BESTCHILD(v) \n6: $C \\gets$ child set of $v$ \n7: $v' \\gets \\arg \\max_{c \\in C} \\mathrm{UCTScore}(c)$ \n8: $v'.n \\gets v'.n + 1$ \n9: return $v'$ \n10: end function \n11: function BACK PROPAGATE(v) \n12: Calculate $R$ using Equation 11 \n13: while $v$ is not a root node do \n14: $v.r \\gets v.r + R$ , $v \\gets v.p$ \n15: end while \n16: end function \n17: function RANDOMSEARCH(v) \n18: while $v$ is not a leaf node do \n19: Randomly select an untried action $a \\in A(v)$ \n20: Create a new node $v'$ \n21: $(x, y) \\gets \\mathrm{GETCOORDINATE}(v'.d)$ \n22: $v'.p \\gets v$ , $v'.d \\gets v.d + 1$ , $v'.\\Gamma \\gets v.\\Gamma$ \n23: $v'.\\gamma_{x,y} \\gets a$ \n24: if $a = -1$ then \n25: $v.lc \\gets v'$ \n26: else if $a = 0$ then \n27: $v.mc \\gets v'$ \n28: else \n29: $v.rc \\gets v'$ \n30: end if \n31: $v \\gets v'$ \n32: end while \n33: return $v$ \n34: end function \n35: function SEARCH(v) \n36: while $v$ is fully expanded do \n37: $v \\gets$ BESTCHILD(v) \n38: end while \n39: if $v$ is not a leaf node then \n40: $v \\gets$ RANDOMSEARCH(v) \n41: end if \n42: return $v$ \n43: end function",
"bbox": [
510,
87,
881,
740
],
"page_idx": 0
}
```
- list 类型 content
```json
{
"type": "list",
"sub_type": "text",
"list_items": [
"H.1 Introduction",
"H.2 Example: Divide by Zero without Exception Handling",
"H.3 Example: Divide by Zero with Exception Handling",
"H.4 Summary"
],
"bbox": [
174,
155,
818,
333
],
"page_idx": 0
}
```
- discarded 类型 content
```json
[{
"type": "header",
"text": "Journal of Hydrology 310 (2005) 253-265",
"bbox": [
363,
164,
623,
177
],
"page_idx": 0
},
{
"type": "page_footnote",
"text": "* Corresponding author. Address: Forest Science Centre, Department of Sustainability and Environment, P.O. Box 137, Heidelberg, Vic. 3084, Australia. Tel.: +61 3 9450 8719; fax: +61 3 9450 8644.",
"bbox": [
71,
815,
915,
841
],
"page_idx": 0
}]
```
## 总结
以上文件为 MinerU 的完整输出结果,用户可根据需要选择合适的文件进行后续处理:
- **模型输出**(使用原始输出):
* model.json
- **调试和验证**(使用可视化文件):
* layout.pdf
* spans.pdf
- **内容提取**(使用简化文件):
* *.md
* content_list.json
- **二次开发**(使用结构化文件):
* middle.json
@@ -0,0 +1,365 @@
## 基于Triton的ROCm 不同后端实现优化,基本实现vllm后端正常推理,以及pipeline后端中第一步layout用的DocLayout-YOLO
**已有完整python vllm和mineru环境直接跳转第五步!!!**
**其他GPU执行问题可以参考,先prof查看定位找到哪个算子问题,然后triton后端实现即可**
测试了一下,基本和MinerU官网效果差不多,用AMD的人也不是很多,就在评论区分享给大家了
### 1.结果介绍
**补充一个200页的PDF python编程书测试一下速度,可以到1.99it/s:**
Two Step Extraction: 100%|████████████████████████████████████████| 200/200 [01:40<00:00, 1.99it/s]
**下面为之前14学术论文测试结果:**
7900xtx mineru-gradio --server-name 0.0.0.0 --server-port 7860 --enable-vllm-engine true 速度大概为**1.6-1.8s/it**,没有仔细测试,简单试了两个文档。第二种矩阵乘法代替原来的dots点乘可以进一步提速到1.3s/it,优化后的主要算子耗时在hipblast(这个没法提升了)和vllm triton后端,各占25%耗时吧,vllm tirion后端这个这个只能等官方优化了。。。。
doclayout-yolo的layout速度从原来的1.6it/s提高到15it/s,注意需要缓存一下输入的pdf尺寸后,triton必须要缓存尺寸没办法。主要是为了保留模型输入输出接口,最小代码改动。
采用-b vlm-vllm-engine模式举个例子
---
**测试结果为优化为5d矩阵乘代替原来的点积结果:**
2025-10-05 15:45:12.985 | INFO | mineru.backend.vlm.vlm_analyze:get_model:128 - get vllm-engine predictor cost: 18.45s
Adding requests: 100%|████████████████████████████████████████████████████████████████████████████████| 14/14 [00:01<00:00, 12.20it/s]
Processed prompts: 100%|█████████████████████| 14/14 [00:08<00:00, 1.56it/s, est. speed input: 2174.18 toks/s, output: 791.87 toks/s]
Adding requests: 100%|█████████████████████████████████████████████████████████████████████████████| 278/278 [00:00<00:00, 323.03it/s]
Processed prompts: 100%|██████████████████| 278/278 [00:07<00:00, 37.63it/s, est. speed input: 5264.66 toks/s, output: 2733.31 toks/s]
mineru-gradio --server-name 0.0.0.0 --server-port 7860 --enable-vllm-engine true测试:
2025-10-05 15:46:55.953 | WARNING | mineru.cli.common:convert_pdf_bytes_to_bytes_by_pypdfium2:54 - end_page_id is out of range, use pdf_docs length
Two Step Extraction: 100%|████████████████████████████████████████████████████████████████████████████| 14/14 [00:18<00:00, 1.30s/it]
---
### 2.原因介绍
AMD RDNA使用vllm后端有严重的性能问题,原因是因为vllm的**qwen2_vl.py**中有一个算子在rocm kernel上没有对应的实现,导致性能出现严重的卷积计算回退,一次执行花了12s,。。。。。。。。一言难尽。即**MIOpen 库中缺少模型中特定 Conv3d(bfloat16) 的优化内核**。
DocLayout-YOLO的**g2l_crm.py**空洞卷积也是这个问题,专业的CDNA MI210也没解决这个问题
正好一起处理了。
---
### 3.环境介绍
System: Ubuntu 24.04.3 Kernel: Linux 6.14.0-33-generic ROCm version: 7.0.1
python环境:
python 3.12
pytorch-triton-rocm 3.5.0+gitbbb06c03
torch 2.10.0.dev20251001+rocm7.0
torchvision 0.25.0.dev20251003+rocm7.0
vllm 0.11.0rc2.dev198+g736fbf4c8.rocm701
不同版本无所谓,处理方法是一样的。
---
### 4.前置环境安装
```
uv venv --python python3.12
source .venv/bin/activate
uv pip install --pre torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple/ --extra-index-url https://download.pytorch.org/whl/nightly/rocm7.0
uv pip install pip
# 避免覆盖我们本地的pytorch,改用pip而没有继续使用uv pip
pip install -U "mineru[core]" -i https://pypi.mirrors.ustc.edu.cn/simple/
```
vllm 安装参考官方手册[Vllm](https://docs.vllm.com.cn/en/latest/getting_started/installation/gpu.html#amd-rocm)
```
#手动安装aitervllmamd-smi等,自行找一个位置clone,然后进入该目录吧
git clone --recursive https://github.com/ROCm/aiter.git
cd aiter
git submodule sync; git submodule update --init --recursive
python setup.py develop
cd ..
git clone https://github.com/vllm-project/vllm.git
cd vllm/
cp -r /opt/rocm/share/amd_smi ~/Pytorch/vllm/
pip install amd_smi/
pip install --upgrade numba \
scipy \
huggingface-hub[cli,hf_transfer] \
setuptools_scm
pip install -r requirements/rocm.txt
export PYTORCH_ROCM_ARCH="gfx1100" #根据自己的GPU架构 rocminfo | grep gfx
python setup.py develop
```
---
### 5.vllm中关键triton算子添加
#### 这里我给出两种解决方法,第一种解决方法就是前面提到的优化到1.5到1.8s/it,第二种方法有手动优化算子到矩阵乘法,7900xtx肯定适用,大概1.3s/it,其他AMD GPU相对方案一也有提速,但是不一定是最佳速度实现,里面的手动部分可能需要微调。
**注意pip把triton 后端的flash_attn卸载了,搞了半天各种尝试还是报错,问题比较大,直接不用就行了**
```
#定位自己vllm位置XXX
pip show vllm
```
**关键更改**
XXX/vllm/model_executor/models/qwen2_vl.py文件:
**1.qwen2_vl.py文件33行下增加from .qwen2_vl_vision_kernels import triton_conv3d_patchify**
```
from collections.abc import Iterable, Mapping, Sequence
from functools import partial
from typing import Annotated, Any, Callable, Literal, Optional, Union
import torch
import torch.nn as nn
import torch.nn.functional as F
from .qwen2_vl_vision_kernels import triton_conv3d_patchify
```
**接下来分为方案一(2.1和3.1)和方案二(2.2和3.2),选取一种实现即可**
---
**方案1**
**2.1qwen2_vl.py文件498行class Qwen2VisionPatchEmbed(nn.Module),PS.就是这玩意AMD没有现成的内核算子导致回退**
```
class Qwen2VisionPatchEmbed(nn.Module):
def __init__(
self,
patch_size: int = 14,
temporal_patch_size: int = 2,
in_channels: int = 3,
embed_dim: int = 1152,
) -> None:
super().__init__()
self.patch_size = patch_size
self.temporal_patch_size = temporal_patch_size
self.embed_dim = embed_dim
kernel_size = (temporal_patch_size, patch_size, patch_size)
self.proj = nn.Conv3d(in_channels,
embed_dim,
kernel_size=kernel_size,
stride=kernel_size,
bias=False)
def forward(self, x: torch.Tensor) -> torch.Tensor:
L, C = x.shape
x_reshaped = x.view(L, -1, self.temporal_patch_size, self.patch_size,
self.patch_size)
# Call your custom Triton kernel instead of self.proj
x_out = triton_conv3d_patchify(x_reshaped, self.proj.weight)
# The output of our kernel is already the correct shape [L, embed_dim]
return x_out
```
**3.1XXX/vllm/model_executor/models/目录下创建qwen2_vl_vision_kernels.py文件,用triton实现**
```
import torch
from vllm.triton_utils import tl, triton
@triton.jit
def _conv3d_patchify_kernel(
# Pointers to tensors
X, W, Y,
# Tensor dimensions
N, C_in, D_in, H_in, W_in,
C_out, KD, KH, KW,
# Stride and padding for memory access
stride_xn, stride_xc, stride_xd, stride_xh, stride_xw,
stride_wn, stride_wc, stride_wd, stride_wh, stride_ww,
stride_yn, stride_yc,
# Triton-specific metaparameters
BLOCK_SIZE: tl.constexpr,
):
"""
Triton kernel for a non-overlapping 3D patching convolution.
Each kernel instance computes one output value for one patch.
"""
# Get the program IDs for the N (patch) and C_out (output channel) dimensions
pid_n = tl.program_id(0) # The index of the patch we are processing
pid_cout = tl.program_id(1) # The index of the output channel we are computing
# --- Calculate memory pointers ---
# Pointer to the start of the current input patch
x_ptr = X + (pid_n * stride_xn)
# Pointer to the start of the current filter (weight)
w_ptr = W + (pid_cout * stride_wn)
# Pointer to where the output will be stored
y_ptr = Y + (pid_n * stride_yn + pid_cout * stride_yc)
# --- Perform the convolution (element-wise product and sum) ---
# This is a dot product between the flattened patch and the flattened filter.
accumulator = tl.zeros((BLOCK_SIZE,), dtype=tl.float32)
# Iterate over the elements of the patch/filter
for c_offset in range(0, C_in):
for d_offset in range(0, KD):
for h_offset in range(0, KH):
# Unrolled loop for the innermost dimension (width) for performance
for w_offset in range(0, KW, BLOCK_SIZE):
# Create masks to handle cases where KW is not a multiple of BLOCK_SIZE
w_range = w_offset + tl.arange(0, BLOCK_SIZE)
w_mask = w_range < KW
# Calculate offsets to load data
patch_offset = (c_offset * stride_xc + d_offset * stride_xd +
h_offset * stride_xh + w_range * stride_xw)
filter_offset = (c_offset * stride_wc + d_offset * stride_wd +
h_offset * stride_wh + w_range * stride_ww)
# Load patch and filter data, applying masks
patch_vals = tl.load(x_ptr + patch_offset, mask=w_mask, other=0.0)
filter_vals = tl.load(w_ptr + filter_offset, mask=w_mask, other=0.0)
# Multiply and accumulate
accumulator += patch_vals.to(tl.float32) * filter_vals.to(tl.float32)
# Sum the accumulator block and store the single output value
output_val = tl.sum(accumulator, axis=0)
tl.store(y_ptr, output_val)
def triton_conv3d_patchify(x: torch.Tensor, weight: torch.Tensor) -> torch.Tensor:
"""
Python wrapper for the 3D patching convolution Triton kernel.
"""
# Get tensor dimensions
N, C_in, D_in, H_in, W_in = x.shape
C_out, _, KD, KH, KW = weight.shape
# Create the output tensor
# The output of this specific conv is (N, C_out, 1, 1, 1), which we squeeze
Y = torch.empty((N, C_out), dtype=x.dtype, device=x.device)
# Define the grid for launching the Triton kernel
# Each kernel instance handles one patch (N) for one output channel (C_out)
grid = (N, C_out)
# Launch the kernel
# We pass all strides to make the kernel flexible
_conv3d_patchify_kernel[grid](
x, weight, Y,
N, C_in, D_in, H_in, W_in,
C_out, KD, KH, KW,
x.stride(0), x.stride(1), x.stride(2), x.stride(3), x.stride(4),
weight.stride(0), weight.stride(1), weight.stride(2), weight.stride(3), weight.stride(4),
Y.stride(0), Y.stride(1),
BLOCK_SIZE=16, # A reasonable default, can be tuned
)
return Y
```
---
**方案2**
**2.2qwen2_vl.py文件498行class Qwen2VisionPatchEmbed(nn.Module)函数,PS.就是这玩意AMD没有现成的内核算子导致回退,这里我们直接5D张量一步到位,改为矩阵乘法**
```
class Qwen2VisionPatchEmbed(nn.Module):
def __init__(
self,
patch_size: int = 14,
temporal_patch_size: int = 2,
in_channels: int = 3,
embed_dim: int = 1152,
) -> None:
super().__init__()
self.patch_size = patch_size
self.temporal_patch_size = temporal_patch_size
self.embed_dim = embed_dim
kernel_size = (temporal_patch_size, patch_size, patch_size)
self.proj = nn.Conv3d(in_channels,
embed_dim,
kernel_size=kernel_size,
stride=kernel_size,
bias=False)
def forward(self, x: torch.Tensor) -> torch.Tensor:
L, C = x.shape
x_reshaped_5d = x.view(L, -1, self.temporal_patch_size, self.patch_size,
self.patch_size)
return triton_conv3d_patchify(x_reshaped_5d, self.proj.weight)
```
**3.2XXX/vllm/model_executor/models/目录下创建qwen2_vl_vision_kernels.py文件,用triton实现**
```
import torch
from vllm.triton_utils import tl, triton
@triton.jit
def _conv_gemm_kernel(
A, B, C, M, N, K,
stride_am, stride_ak,
stride_bk, stride_bn,
stride_cm, stride_cn,
BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr, BLOCK_K: tl.constexpr,
):
pid_m = tl.program_id(0)
pid_n = tl.program_id(1)
offs_m = pid_m * BLOCK_M + tl.arange(0, BLOCK_M)
offs_n = pid_n * BLOCK_N + tl.arange(0, BLOCK_N)
offs_k = tl.arange(0, BLOCK_K)
a_ptrs = A + (offs_m[:, None] * stride_am + offs_k[None, :] * stride_ak)
b_ptrs = B + (offs_k[:, None] * stride_bk + offs_n[None, :] * stride_bn)
accumulator = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)
for k in range(0, K, BLOCK_K):
a = tl.load(a_ptrs, mask=(offs_m[:, None] < M) & (offs_k[None, :] < K), other=0.0)
b = tl.load(b_ptrs, mask=(offs_k[:, None] < K) & (offs_n[None, :] < N), other=0.0)
accumulator += tl.dot(a, b)
a_ptrs += BLOCK_K * stride_ak
b_ptrs += BLOCK_K * stride_bk
offs_k += BLOCK_K
c = accumulator.to(C.dtype.element_ty)
offs_cm = pid_m * BLOCK_M + tl.arange(0, BLOCK_M)
offs_cn = pid_n * BLOCK_N + tl.arange(0, BLOCK_N)
c_ptrs = C + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :]
c_mask = (offs_cm[:, None] < M) & (offs_cn[None, :] < N)
tl.store(c_ptrs, c, mask=c_mask)
def triton_conv3d_patchify(x_5d: torch.Tensor, weight_5d: torch.Tensor) -> torch.Tensor:
N_patches, _, _, _, _ = x_5d.shape
C_out, _, _, _, _ = weight_5d.shape
A = x_5d.view(N_patches, -1)
B = weight_5d.view(C_out, -1).transpose(0, 1).contiguous()
M, K = A.shape
_K, N = B.shape
assert K == _K
C = torch.empty((M, N), device=A.device, dtype=A.dtype)
# --- 针对7900xtx的手动调优配置,其他GPU的最优组合可能需要自行寻找,AMD的autotune效果就是没有效果 ---
best_config = {
'BLOCK_M': 128,
'BLOCK_N': 128,
'BLOCK_K': 32,
}
num_stages = 4
num_warps = 8
grid = (triton.cdiv(M, best_config['BLOCK_M']),
triton.cdiv(N, best_config['BLOCK_N']))
_conv_gemm_kernel[grid](
A, B, C,
M, N, K,
A.stride(0), A.stride(1),
B.stride(0), B.stride(1),
C.stride(0), C.stride(1),
**best_config,
num_stages=num_stages,
num_warps=num_warps
)
return C
```
---
**4.关闭终端后再次使用mineru-gradio会报一个Lora错误,修改代码跳过它**
```
pip show mineru_vl_utils
```
打开该文件XXX/mineru_vl_utils/vlm_client/vllm_async_engine_client.py修改第58行self.tokenizer = vllm_async_llm.tokenizer.get_lora_tokenizer()为:
```
try:
self.tokenizer = vllm_async_llm.tokenizer.get_lora_tokenizer()
except AttributeError:
# 如果没有 get_lora_tokenizer 方法,直接使用原始 tokenizer
self.tokenizer = vllm_async_llm.tokenizer
```
**最后整两个环境变量后愉快玩耍即可**
```
export MINERU_MODEL_SOURCE=modelscope
export TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1
```
---
### 6.vllm后端已经没有问题,下面是pipeline 中layout用的doclayout-yolo模型空洞卷积问题
### 我在 [DocLayout-YOLO](https://github.com/opendatalab/DocLayout-YOLO/issues/120#issuecomment-3368144275) 下做了一个回答,因此 pipeline 的空洞卷积问题不在这里赘述,直接点击链接查看即可。
查看自己doclayout-yolo安装位置如下,然后进入修改链接中回复介绍的文件即可
```
pip show doclayout-yolo
```
@@ -0,0 +1,64 @@
#### 1 系统
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
昇腾910B2
驱动 23.0.6.2
CANN 7.5.X
Miner U 2.1.9
#### 2 踩坑记录
坑1 **图形库相关的问题,总之就是动态库导致TLS的内存分配失败(OpenCV库在ARM64架构上的兼容性问题)**
⭐这个错误 ImportError: /lib/aarch64-linux-gnu/libGLdispatch.so.0: cannot allocate memory in static TLS block 是由于OpenCV库在ARM64架构上的兼容性问题导致的。从错误堆栈可以看到,问题出现在导入cv2模块时,这发生在MinerU的VLM后端初始化过程中。
解决方法:
1 安装减少内存问题的opencv版本
```
pip install --upgrade albumentations albucore simsimd# Uninstall current opencv
pip uninstall opencv-python opencv-contrib-python
# Install headless version (no GUI dependencies)
pip install opencv-python-headless
python -c "import cv2; print(cv2.__version__)"2 apt-get install一些包
```
换成清华源然后重命名为sources.list.tuna,然后挪到根目录下面
```
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiversesudo apt-get update -o Dir::Etc::sourcelist="sources.list.tuna" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
sudo apt-get install libgl1-mesa-glx -o Dir::Etc::sourcelist="sources.list.tuna" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
sudo apt-get install libglib2.0-0 libsm6 libxext6 libxrender-dev libgomp1 -o Dir::Etc::sourcelist="sources.list.tuna" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
sudo apt-get install libgl1-mesa-dev libgles2-mesa-dev -o Dir::Etc::sourcelist="sources.list.tuna" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
sudo apt-get install libgomp1 -o Dir::Etc::sourcelist="sources.list.tuna" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
export OPENCV_IO_ENABLE_OPENEXR=0 export QT_QPA_PLATFORM=offscreen
```
↑这些不知道哪些好使,或者有没有好使的
3 强制覆盖conda环境自带的动态库(conda的和系统的冲突)
```
查找:find /usr/lib /lib /root/.local/conda -name "libgomp.so*" 2>/dev/null
export LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libstdc++.so.6:/usr/lib/aarch64-linux-gnu/libgomp.so.1"
export LD_PRELOAD=/lib/aarch64-linux-gnu/libGLdispatch.so.0:$LD_PRELOAD
```
此外,还可以把conda环境中自带的的强制挪走
```
mv $CONDA_PREFIX/lib/libstdc++.so.6 $CONDA_PREFIX/lib/libstdc++.so.6.bak
mv $CONDA_PREFIX/lib/libgomp.so.1 $CONDA_PREFIX/lib/libgomp.so.1.bak
mv $CONDA_PREFIX/lib/libGLdispatch.so.0 $CONDA_PREFIX/lib/libGLdispatch.so.0.bak # 如果有的话
simsimd包相关:
mv /root/.local/conda/envs/pdfparser/lib/python3.10/site-packages/simsimd./libgomp-947d5fa1.so.1.0.0 /root/.local/conda/envs/pdfparser/lib/python3.10/site-packages/simsimd./libgomp-947d5fa1.so.1.0.0.bak
```
或者:
降级simsimd 3.7.2
降级albumentations 1.3.1
sklean包相关:
```
# 找到 scikit-learn 内部的 libgomp 路径
SKLEARN_LIBGOMP="/root/.local/conda/envs/pdfparser/lib/python3.10/site-packages/scikit_learn.libs/libgomp-947d5fa1.so.1.0.0"
# 预加载这个特定的 libgomp 版本
export LD_PRELOAD="$SKLEARN_LIBGOMP:$LD_PRELOAD"
```
4 其他
torch / torch_npu 2.5.1
pip install "numpy<2.0" 2.0和昇腾不兼容
export MINERU_MODEL_SOURCE=modelscope
@@ -0,0 +1,117 @@
## 在C500+MACA上部署并使用Mineru
### 获取MACA镜像,包含torch-maca,maca,sglang-maca
镜像获取地址:https://developer.metax-tech.com/softnova/docker ,
选择maca-c500-pytorch:2.33.0.6-ubuntu22.04-amd64
若在docker上部署镜像则需要启动GPU设备访问
```bash
docker run --device=/dev/dri --device=/dev/mxcd....
```
#### 注意事项
由于此镜像默认开启TORCH_ALLOW_TF32_CUBLAS_OVERRIDE,会导致backed:vlm-transformers推理结果错误
```bash
unset TORCH_ALLOW_TF32_CUBLAS_OVERRIDE
```
### 安装MinerU
使用--no-deps,去除对一些cuda版本包的依赖,后续采用pip install-r requirements.txt 安装其他依赖
```bash
pip install -U "mineru[core]" --no-deps
```
```tex
boto3>=1.28.43
click>=8.1.7
loguru>=0.7.2
numpy==1.26.4
pdfminer.six==20250506
tqdm>=4.67.1
requests
httpx
pillow>=11.0.0
pypdfium2>=4.30.0
pypdf>=5.6.0
reportlab
pdftext>=0.6.2
modelscope>=1.26.0
huggingface-hub>=0.32.4
json-repair>=0.46.2
opencv-python>=4.11.0.86
fast-langdetect>=0.2.3,<0.3.0
transformers>=4.51.1
accelerate>=1.5.1
pydantic
matplotlib>=3.10,<4
ultralytics>=8.3.48,<9
dill>=0.3.8,<1
rapid_table>=1.0.5,<2.0.0
PyYAML>=6.0.2,<7
ftfy>=6.3.1,<7
openai>=1.70.0,<2
shapely>=2.0.7,<3
pyclipper>=1.3.0,<2
omegaconf>=2.3.0,<3
transformers>=4.49.0,!=4.51.0,<5.0.0
fastapi
python-multipart
uvicorn
gradio>=5.34,<6
gradio-pdf>=0.0.22
albumentations
beautifulsoup4
scikit-image==0.25.0
outlines==0.1.11
magika>=0.6.2,<0.7.0
mineru-vl-utils>=0.1.6,<1
```
上述内容保存为requirments.txt,进行安装
```bash
pip install -r requirments.txt
```
安装doclayout_yolo,这里doclayout_yolo会依赖torch-cuda,使用--no-deps
```bash
pip install doclayout-yolo --no-deps
```
### 在线使用
**基础使用命令为:mineru -p <input_path> -o <output_path> -b vlm-transformers**
- `<input_path>`: Local PDF/image file or directory
- `<output_path>`: Output directory
- -b --backend [pipeline|vlm-transformers|vlm-vllm-engine|vlm-http-client] (default:pipeline)<br/>
其他详细使用命令可参考官方文档[Quick Usage - MinerU](https://opendatalab.github.io/MinerU/usage/quick_usage/#quick-model-source-configuration)
### 离线使用
**所用模型为本地模型,需要设置环境变量和config配置文件**<br/>
#### 下载模型到本地
通过mineru交互式命令行工具进行下载,下载完后会自动更新mineru.json配置文件
```bash
mineru-models-download
```
也可以在[HuggingFace](http://www.huggingface.co.)或[ModelScope](https://www.modelscope.cn/home)找到所需模型源(PDF-Extract-Kit-1.0和MinerU2.5-2509-1.2B)进行下载,
下载完成后,创建mineru.json文件,按如下进行修改
```json
{
"models-dir": {
"pipeline": "/path/pdf-extract-kit-1.0/",
"vlm": "/path/MinerU2.5-2509-1.2B"
},
"config_version": "1.3.0"
}
```
path为本地模型的存储路径,其中models-dir为本地模型的路径,pipeline代表backend为pipeline时,所需要的模型路径,vlm代表backend为vlm-开头,所需要的模型路径
#### 修改环境变量
```bash
export MINERU_MODEL_SOURCE=local
export MINERU_TOOLS_CONFIG_JSON=/path/mineru.json //此环境变量为配置文件的路径
```
修改完成后即可正常使用<br/>
@@ -0,0 +1,73 @@
# TECO适配
## 快速开始
使用本工具执行推理的主要流程如下:
1. 基础环境安装:介绍推理前需要完成的基础环境检查和安装。
3. 构建Docker环境:介绍如何使用Dockerfile创建模型推理时所需的Docker环境。
4. 启动推理:介绍如何启动推理。
### 1 基础环境安装
请参考[Teco用户手册的安装准备章节](http://docs.tecorigin.com/release/torch_2.4/v2.2.0/#fc980a30f1125aa88bad4246ff0cedcc),完成训练前的基础环境检查和安装。
### 2 构建docker
#### 2.1 执行以下命令,下载Docker镜像至本地(Docker镜像包:pytorch-3.0.0-torch_sdaa3.0.0.tar
wget 镜像下载链接(链接获取请联系太初内部人员)
#### 2.2 校验Docker镜像包,执行以下命令,生成MD5码是否与官方MD5码b2a7f60508c0d199a99b8b6b35da3954一致:
md5sum pytorch-3.0.0-torch_sdaa3.0.0.tar
#### 2.3 执行以下命令,导入Docker镜像
docker load < pytorch-3.0.0-torch_sdaa3.0.0.tar
#### 2.4 执行以下命令,构建名为MinerU的Docker容器
docker run -itd --name="MinerU" --net=host --device=/dev/tcaicard0 --device=/dev/tcaicard1 --device=/dev/tcaicard2 --device=/dev/tcaicard3 --cap-add SYS_PTRACE --cap-add SYS_ADMIN --shm-size 64g jfrog.tecorigin.net/tecotp-docker/release/ubuntu22.04/x86_64/pytorch:3.0.0-torch_sdaa3.0.0 /bin/bash
#### 2.5 执行以下命令,进入名称为tecopytorch_docker的Docker容器。
docker exec -it MinerU bash
### 3 执行以下命令安装MinerU
- 安装前的准备
```
cd <MinerU>
pip install --upgrade pip
pip install uv
```
- 由于镜像中安装了torch,并且不需要安装nvidia-nccl-cu12、nvidia-cudnn-cu12等包,因此需要注释掉一部分安装依赖。
- 请注释掉<MinerU>/pyproject.toml文件中所有的"doclayout_yolo==0.0.4"依赖,并且将torch开头的包也注释掉。
- 执行以下命令安装MinerU
```
uv pip install -e .[core]
```
- 下载安装doclayout_yolo==0.0.4
```
pip install doclayout_yolo==0.0.4 --no-deps
```
- 下载安装其他包(doclayout_yolo==0.0.4的依赖)
```
pip install albumentations py-cpuinfo seaborn thop numpy==1.24.4
```
- 由于部分张量内部内存分布不连续,需要修改如下两个文件
<ultralytics安装路径>/ultralytics/utils/tal.py(330行左右,将view --> reshape)
<doclayout_yolo安装路径>/doclayout_yolo/utils/tal.py(375行左右,将view --> reshape)
### 4 执行推理
- 开启sdaa环境
```
export TORCH_SDAA_AUTOLOAD=cuda_migrate
```
- 首次运行推理命令前请添加以下环境下载模型权重
```
export HF_ENDPOINT=https://hf-mirror.com
```
- 运行以下命令执行推理
```
mineru -p 'input path' -o 'output_path' --lang 'model_name'
```
其中model_name可从'ch', 'ch_server', 'ch_lite', 'en', 'korean', 'japan', 'chinese_cht', 'ta', 'te', 'ka', 'latin', 'arabic', 'east_slavic', 'cyrillic', 'devanagari'选择
### 5 适配用到的软件栈版本列表
使用v3.0.0软件栈版本适配,获取方式联系太初内部人员
@@ -0,0 +1,53 @@
# 命令行参数进阶
## vllm 加速参数优化
### 性能优化参数
> [!TIP]
> 如果您已经可以正常使用vllm对vlm模型进行加速推理,但仍然希望进一步提升推理速度,可以尝试以下参数:
>
> - 如果您有超过多张显卡,可以使用vllm的多卡并行模式来增加吞吐量:`--data-parallel-size 2`
### 参数传递说明
> [!TIP]
> - 所有vllm官方支持的参数都可用通过命令行参数传递给 MinerU,包括以下命令:`mineru`、`mineru-vllm-server`、`mineru-gradio`、`mineru-api`
> - 如果您想了解更多有关`vllm`的参数使用方法,请参考 [vllm官方文档](https://docs.vllm.ai/en/latest/cli/serve.html)
## GPU 设备选择与配置
### CUDA_VISIBLE_DEVICES 基本用法
> [!TIP]
> - 任何情况下,您都可以通过在命令行的开头添加`CUDA_VISIBLE_DEVICES` 环境变量来指定可见的 GPU 设备:
> ```bash
> CUDA_VISIBLE_DEVICES=1 mineru -p <input_path> -o <output_path>
> ```
> - 这种指定方式对所有的命令行调用都有效,包括 `mineru`、`mineru-vllm-server`、`mineru-gradio` 和 `mineru-api`,且对`pipeline`、`vlm`后端均适用。
### 常见设备配置示例
> [!TIP]
> 以下是一些常见的 `CUDA_VISIBLE_DEVICES` 设置示例:
> ```bash
> CUDA_VISIBLE_DEVICES=1 # Only device 1 will be seen
> CUDA_VISIBLE_DEVICES=0,1 # Devices 0 and 1 will be visible
> CUDA_VISIBLE_DEVICES="0,1" # Same as above, quotation marks are optional
> CUDA_VISIBLE_DEVICES=0,2,3 # Devices 0, 2, 3 will be visible; device 1 is masked
> CUDA_VISIBLE_DEVICES="" # No GPU will be visible
> ```
## 实际应用场景
> [!TIP]
> 以下是一些可能的使用场景:
>
> - 如果您有多张显卡,需要指定卡0和卡1,并使用多卡并行来启动`vllm-server`,可以使用以下命令:
> ```bash
> CUDA_VISIBLE_DEVICES=0,1 mineru-vllm-server --port 30000 --data-parallel-size 2
> ```
>
> - 如果您有多张显卡,需要在卡0和卡1上启动两个`fastapi`服务,并分别监听不同的端口,可以使用以下命令:
> ```bash
> # 在终端1中
> CUDA_VISIBLE_DEVICES=0 mineru-api --host 127.0.0.1 --port 8000
> # 在终端2中
> CUDA_VISIBLE_DEVICES=1 mineru-api --host 127.0.0.1 --port 8001
> ```
@@ -0,0 +1,108 @@
# 命令行工具使用说明
## 查看帮助信息
要查看 MinerU 命令行工具的帮助信息,可以使用 `--help` 参数。以下是各个命令行工具的帮助信息示例:
```bash
mineru --help
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-vllm-engine|vlm-http-client]
解析后端(默认为 pipeline)
-l, --lang [ch|ch_server|ch_lite|en|korean|japan|chinese_cht|ta|te|ka|th|el|latin|arabic|east_slavic|cyrillic|devanagari]
指定文档语言(可提升 OCR 准确率,仅用于 pipeline 后端)
-u, --url TEXT 当使用 http-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 显示帮助信息
```
```bash
mineru-api --help
Usage: mineru-api [OPTIONS]
Options:
--host TEXT 服务器主机地址(默认:127.0.0.1)
--port INTEGER 服务器端口(默认:8000)
--reload 启用自动重载(开发模式)
--help 显示此帮助信息并退出
```
```bash
mineru-gradio --help
Usage: mineru-gradio [OPTIONS]
Options:
--enable-example BOOLEAN 启用示例文件输入(需要将示例文件放置在当前
执行命令目录下的 `example` 文件夹中)
--enable-vllm-engine BOOLEAN 启用 vllm 引擎后端以提高处理速度
--enable-api BOOLEAN 启用 Gradio API 以提供应用程序服务
--max-convert-pages INTEGER 设置从 PDF 转换为 Markdown 的最大页数
--server-name TEXT 设置 Gradio 应用程序的服务器主机名
--server-port INTEGER 设置 Gradio 应用程序的服务器端口
--latex-delimiters-type [a|b|all]
设置在 Markdown 渲染中使用的 LaTeX 分隔符类型
('a' 表示 '$' 类型,'b' 表示 '()[]' 类型,
'all' 表示两种类型都使用)
--help 显示此帮助信息并退出
```
## 环境变量说明
MinerU命令行工具的某些参数存在相同功能的环境变量配置,通常环境变量配置的优先级高于命令行参数,且在所有命令行工具中都生效。
以下是常用的环境变量及其说明:
- `MINERU_DEVICE_MODE`
* 用于指定推理设备
* 支持`cpu/cuda/cuda:0/npu/mps`等设备类型
* 仅对`pipeline`后端生效。
- `MINERU_VIRTUAL_VRAM_SIZE`
* 用于指定单进程最大 GPU 显存占用(GB)
* 仅对`pipeline`后端生效。
- `MINERU_MODEL_SOURCE`
* 用于指定模型来源
* 支持`huggingface/modelscope/local`
* 默认为`huggingface`可通过环境变量切换为`modelscope`或使用本地模型。
- `MINERU_TOOLS_CONFIG_JSON`
* 用于指定配置文件路径
* 默认为用户目录下的`mineru.json`,可通过环境变量指定其他配置文件路径。
- `MINERU_FORMULA_ENABLE`
* 用于启用公式解析
* 默认为`true`,可通过环境变量设置为`false`来禁用公式解析。
- `MINERU_FORMULA_CH_SUPPORT`
* 用于启用中文公式解析优化(实验性功能)
* 默认为`false`,可通过环境变量设置为`true`来启用中文公式解析优化。
* 仅对`pipeline`后端生效。
- `MINERU_TABLE_ENABLE`
* 用于启用表格解析
* 默认为`true`,可通过环境变量设置为`false`来禁用表格解析。
- `MINERU_TABLE_MERGE_ENABLE`
* 用于启用表格合并功能
* 默认为`true`,可通过环境变量设置为`false`来禁用表格合并功能。
- `MINERU_PDF_RENDER_TIMEOUT`
* 用于设置将PDF渲染为图片的超时时间(秒)
* 默认为`300`秒,可通过环境变量设置为其他值以调整渲染图片的超时时间。
- `MINERU_INTRA_OP_NUM_THREADS`
* 用于设置onnx模型的intra_op线程数,影响单个算子的计算速度
* 默认为`-1`(自动选择),可通过环境变量设置为其他值以调整线程数。
- `MINERU_INTER_OP_NUM_THREADS`
* 用于设置onnx模型的inter_op线程数,影响多个算子的并行执行
* 默认为`-1`(自动选择),可通过环境变量设置为其他值以调整线程数。
@@ -0,0 +1,33 @@
# 使用指南
本章节提供了项目的完整使用说明。我们将通过以下几个部分,帮助您从基础到进阶逐步掌握项目的使用方法:
## 目录
- 本地部署
* [快速使用](./quick_usage.md) - 快速上手和基本使用
* [模型源配置](./model_source.md) - 模型源的详细配置说明
* [命令行工具](./cli_tools.md) - 命令行工具的详细参数说明
* [进阶优化参数](./advanced_cli_parameters.md) - 一些适配命令行工具的进阶参数说明
- 插件与生态
* [Cherry Studio](plugin/Cherry_Studio.md)
* [Sider](plugin/Sider.md)
* [Dify](plugin/Dify.md)
* [n8n](plugin/n8n.md)
* [Coze](plugin/Coze.md)
* [FastGPT](plugin/FastGPT.md)
* [ModelWhale](plugin/ModelWhale.md)
* [DingTalk](plugin/DingTalk.md)
* [DataFlow](plugin/DataFlow.md)
* [BISHENG](plugin/BISHENG.md)
* [RagFlow](plugin/RagFlow.md)
- 其他加速卡适配(由社区贡献)
* [昇腾 Ascend](acceleration_cards/Ascend.md) [#3233](https://github.com/opendatalab/MinerU/discussions/3233)
* [沐曦 METAX](acceleration_cards/METAX.md) [#3477](https://github.com/opendatalab/MinerU/pull/3477)
* [AMD](acceleration_cards/AMD.md) [#3662](https://github.com/opendatalab/MinerU/discussions/3662)
* [太初元碁 Tecorigin](acceleration_cards/Tecorigin.md) [#3767](https://github.com/opendatalab/MinerU/pull/3767)
## 开始使用
建议按照上述顺序阅读文档,这样可以帮助您更好地理解和使用项目功能。
如果您在使用过程中遇到问题,请查看 [FAQ](../faq/index.md)
@@ -0,0 +1,56 @@
# 模型源说明
MinerU使用 `HuggingFace``ModelScope` 作为模型仓库,用户可以根据需要切换模型源或使用本地模型。
- `HuggingFace` 是默认的模型源,在全球范围内提供了优异的加载速度和极高稳定性。
- `ModelScope` 是中国大陆地区用户的最佳选择,提供了无缝兼容的SDK模块,适用于无法访问`HuggingFace`的用户。
## 模型源的切换方法
### 通过命令行参数切换
目前仅`mineru`命令行工具支持通过命令行参数切换模型源,其他命令行工具如`mineru-api``mineru-gradio`等暂不支持。
```bash
mineru -p <input_path> -o <output_path> --source modelscope
```
### 通过环境变量切换
在任何情况下可以通过设置环境变量来切换模型源,这适用于所有命令行工具和API调用。
```bash
export MINERU_MODEL_SOURCE=modelscope
```
```python
import os
os.environ["MINERU_MODEL_SOURCE"] = "modelscope"
```
>[!TIP]
> 通过环境变量设置的模型源会在当前终端会话中生效,直到终端关闭或环境变量被修改。且优先级高于命令行参数,如同时设置了命令行参数和环境变量,命令行参数将被忽略。
## 使用本地模型
### 1. 下载模型到本地
```bash
mineru-models-download --help
```
或使用交互式命令行工具选择模型下载:
```bash
mineru-models-download
```
> [!NOTE]
>- 下载完成后,模型路径会在当前终端窗口输出,并自动写入用户目录下的 `mineru.json`
>- 您也可以通过将[配置模板文件](https://github.com/opendatalab/MinerU/blob/master/mineru.template.json)复制到用户目录下并重命名为 `mineru.json` 来创建配置文件。
>- 模型下载到本地后,您可以自由移动模型文件夹到其他位置,同时需要在 `mineru.json` 中更新模型路径。
>- 如您将模型文件夹部署到其他服务器上,请确保将 `mineru.json`文件一同移动到新设备的用户目录中并正确配置模型路径。
>- 如您需要更新模型文件,可以再次运行 `mineru-models-download` 命令,模型更新暂不支持自定义路径,如您没有移动本地模型文件夹,模型文件会增量更新;如您移动了模型文件夹,模型文件会重新下载到默认位置并更新`mineru.json`
### 2. 使用本地模型进行解析
```bash
mineru -p <input_path> -o <output_path> --source local
```
或通过环境变量启用:
```bash
export MINERU_MODEL_SOURCE=local
mineru -p <input_path> -o <output_path>
```
@@ -0,0 +1,11 @@
# BISHENG 简介
BISHENG毕昇 是一款开源 LLM应用开发平台,主攻企业场景, 已有大量行业头部组织及世界500强企业在使用。“毕昇”是活字印刷术的发明人,活字印刷术为人类知识的传递起到了巨大的推动作用。BISHENG毕昇团队希望“BISHENG毕昇”同样能够为智能应用的广泛落地提供有力支撑。
![](../../../assets/Images/BISHENG_01.png)
- 官网地址:https://bisheng.dataelem.com/
- Miner 在BISHENG毕昇 项目中的插件项目:https://github.com/dataelement/bisheng/pulls
特别鸣谢 [@pzc163](https://github.com/pzc163)
@@ -0,0 +1,238 @@
# Cherry Studio 简介
Cherry Studio 是一款功能强大的多模型 AI 客户端软件,支持 Windows、macOS 和 Linux 等多平台运行,集成了 OpenAI、DeepSeek、Gemini、Anthropic 等主流 AI 云服务,同时支持本地模型运行,用户可以灵活切换不同的AI模型。
目前,MinerU 强大的文档解析能力已深度集成到 Cherry Studio 的知识库与对话交互中,为用户带来更便捷的文档处理与信息获取体验。
![img](../../../assets/images/Cherry_Studio_1.png)
- Cherry Studio 官网地址:https://www.cherry-ai.com/
# MinerU 在 Cherry Studio 中的使用方法
## 进入 Cherry Studio 设置
a. 打开 Cherry Studio 应用程序
b. 点击左下角的"设置"按钮,进入设置页面
c. 在左侧菜单中,选择"MCP 服务器"
在右侧的 MCP 服务器配置界面中,您可以看到已有的 MCP 服务器列表。点击右上角的"添加服务器"按钮来创建新的 MCP 服务,或者点击现有服务来编辑配置。
## 添加 MinerU-MCP 配置
点击"添加服务器"后,您将看到一个配置表单。请按以下步骤填写:
**a. 名称**:输入"MinerU-MCP"或您喜欢的其他名称
**b. 描述**:可选,如"文档转换为Markdown工具"
**c. 类型**:选择"标准输入/输出(stdio"
**d. 命令**:输入 uvx
**e. 参数**:输入 mineru-mcp
**f. 环境变量**:添加以下环境变量
```Plain
MINERU_API_BASE=https://mineru.net
MINERU_API_KEY=您的API密钥
OUTPUT_DIR=./downloads
USE_LOCAL_API=false
LOCAL_MINERU_API_BASE=http://localhost:8888
```
使用 *`uvx`* 命令可以自动处理 mineru-mcp 的安装和运行,**无需预先手动安装 mineru-mcp 包**。这是最简单的配置方式。
## 保存配置
确认无误后,点击界面右上角的"保存"按钮完成配置。保存后,MCP 服务器列表中会显示您刚刚添加的 MinerU-MCP 服务。
![img](../../../assets/images/Cherry_Studio_2.png)
![img](../../../assets/images/Cherry_Studio_3.png)
## 使用 Cherry Studio 中的 MinerU MCP
一旦配置完成,您可以在 Cherry Studio 中的对话中使用 MinerU MCP 工具。在 Cherry Studio 中,您可以使用如下提示让模型调用 MinerU MCP 工具。模型会自动识别任务并调用相应的工具。
## 示例 1: 使用 URL 转换文档
**用户输入:**
```Plain
请使用 MinerU MCP 将以下 URL 的 PDF 文档转换为 Markdown 格式:https://example.com/sample.pdf
```
**模型将执行的步骤:**
模型识别这是文档转换任务,并调用 *`parse_documents`* 工具,参数为:
```Plain
{"file_sources": "https://example.com/sample.pdf"}
```
工具处理完成后,模型会告知您转换结果。
![img](../../../assets/images/Cherry_Studio_4.png)
## 示例 2: 转换本地文档
**用户输入:**
```Plain
请使用 MinerU-MCP 将本地的 D://sample.pdf 文件转换为 Markdown 格式
```
**模型将执行的步骤:**
模型识别这是本地文档转换任务,调用 `parse_documents` 工具,参数为:
```Plain
{"file_sources": "D://sample.pdf"}
```
![img](../../../assets/images/Cherry_Studio_5.png)
## 示例 3: 启用 OCR 处理扫描文档
**用户输入:**
```Plain
请使用 MinerU-MCP 将以下 URL 的扫描版 PDF 文档转换为 Markdown 格式,并启用 OCR 功能:
https://example.com/scanned.pdf
```
**模型将执行的步骤:**
模型识别这是需要 OCR 处理的文档转换任务,调用 `parse_documents` 工具,并启用 OCR 参数:
```Plain
{"file_sources": "https://example.com/scanned.pdf","enable_ocr": true}
```
![img](../../../assets/images/Cherry_Studio_6.png)
## 示例 4: 完整对话流程
以下是一个完整的对话流程示例:
**用户:**
```Plain
我有一份学术论文的 PDF,网址是 https://arxiv.org/pdf/2303.08774.pdf,能帮我转换成 Markdown 格式吗?
```
**模型:**
```Plain
我可以帮您将这份学术论文转换为 Markdown 格式。我将使用 MinerU-MCP 工具来处理这个任务。
[模型调用 parse_documents 工具,处理过程中...]
论文已成功转换为 Markdown 格式。转换结果如下:
# The Capacity of Diffusion Models to Memorize and Generate Training Data
## Abstract
Recent diffusion models can generate high-quality images that are nearly indistinguishable from real ones...
[显示论文内容...]
```
![img](../../../assets/images/Cherry_Studio_7.png)
## 工具参数详解
在使用过程中,模型会根据您的指令自动选择合适的工具和参数。以下是主要工具的参数说明:
### ● *parse_documents* 工具参数
![img](../../../assets/images/Cherry_Studio_8.png)
### ● *get_ocr_languages* 工具参数
无需参数,用于获取OCR支持的语言列表。
## 高级用法
### 指定语言和页码范围
**用户输入:**
```Plain
请使用 MinerU MCP 将以下 URL 的文档转换为 Markdown 格式,只处理第 5-10 页,并指定语言为中文:https://example.com/document.pdf
```
模型会使用 *`parse_documents`* 工具,并设置 *`language`* 参数为 "ch"*`page_ranges`* 参数为 "5-10"。
### 批量处理多个文档
**用户输入:**
```Plain
请使用 MinerU-MCP 将以下多个 URL 的文档转换为 Markdown 格式:
https://example.com/doc1.pdf
https://example.com/doc2.pdf
https://example.com/doc3.pdf
```
模型会调用 *`parse_documents`* 工具,并将多个 URL 以逗号分隔传入 *`file_sources`* 参数。
## 注意事项
● 当设置 *`USE_LOCAL_API=true`* 时,使用本地配置的API进行解析
● 当设置 *`USE_LOCAL_API=false`* 时,会使用 MinerU 官网的API进行解析
● 处理大型文档可能需要较长时间,请耐心等待
● 如果遇到超时问题,请考虑分批处理文档或使用本地API模式
## 常见问题与解决方案
### 无法启动 MCP 服务
**问题**:运行 *`uv run -m mineru.cli`*` `时报错。
**解决方案**
● 确保已激活虚拟环境
● 检查是否已安装所有依赖
● 尝试使用 *`python -m mineru.cli`*` `命令替代
### 文件转换失败
**问题**:文件上传成功但转换失败。
**解决方案**
● 检查文件格式是否受支持
● 确认API密钥是否正确
● 查看MCP服务日志获取详细错误信息
### 文件路径问题
**问题**:使用 `parse_documents` 工具处理本地文件时报找不到文件错误。
**解决方案**:请确保使用绝对路径,或者相对于服务器运行目录的正确相对路径。
### MCP 服务调用超时问题
**问题**:调用 *`parse_documents`* 工具时出现 *`Error calling tool 'parse_documents': MCP error -32001: Request timed out`* 错误。
**解决方案**:这个问题常见于处理大型文档或网络不稳定的情况。在某些 MCP 客户端(如 Cursor)中,超时后可能导致无法再次调用 MCP 服务,需要重启客户端。最新版本的 Cursor 中可能会显示正在调用 MCP,但实际上没有真正调用成功。建议:
**● 等待官方修复**:这是Cursor客户端的已知问题,建议等待Cursor官方修复
**● 处理小文件**:尽量只处理少量小文件,避免处理大型文档导致超时
**● 分批处理**:将多个文件分成多次请求处理,每次只处理一两个文件
● 增加超时时间设置(如果客户端支持)
● 对于超时后无法再次调用的问题,需要重启 MCP 客户端
● 如果反复出现超时,请检查网络连接或考虑使用本地 API 模式
@@ -0,0 +1,92 @@
# Coze 简介
Coze(中文版名称:扣子) 是字节跳动推出的零代码 AI 应用开发平台。无论用户是否有编程经验,都可以通过该平台快速创建各种类型的聊天机器人、智能体、AI 应用和插件,并将其部署在社交平台和即时聊天应用程序中。
目前,MinerU 插件已在 Coze 插件商店上线,通过其强大的文档解析能力,为用户搭建智能体与工作流提供文档解析能力,加快用户 AI 应用的开发。
![img](../../../assets/images/coze_0.png)
- 扣子官网地址:https://www.coze.cn/
- MinerU 扣子插件下载地址:https://www.coze.cn/store/plugin/7527957359730360354
# MinerU 在 Coze 中的使用方法
## **Coze:集成应用**
- 进入 https://www.coze.cn/home coze 开发平台
## 智能体
### 工作空间 -> 项目开发 -> 创建 -> 创建智能体 -> 创建 -> 输入项目名
![img](../../../assets/images/Coze_1.png)
![img](../../../assets/images/Coze_2.png)
### 插件配置 -> 添加 `插件` -> 搜索 `MinerU`
![img](../../../assets/images/Coze_3.png)
### 添加 `parse_file` 工具(在线版)
![img](../../../assets/images/Coze_4.png)
### 选择 `MinerU` 插件 -> 编辑参数 -> 填写 api key
![img](../../../assets/images/Coze_5.png)
![img](../../../assets/images/Coze_6.png)
> 记得关闭 url 和 token 显示
### 调试 `智能体`
![img](../../../assets/images/Coze_7.png)
## 工作流
> 用工作流的方式使用 minerU
### 工作流 -> 创建工作流
![img](../../../assets/images/Coze_8.png)
![img](../../../assets/images/Coze_9.png)
### 工作流插件配置 -> 添加 `插件` -> 搜索 `MinerU` -> 添加
![img](../../../assets/images/Coze_10.png)
![img](../../../assets/images/Coze_11.png)
### 选择`MinerU` 插件 -> 编辑参数 -> 填写 api key
![img](../../../assets/images/Coze_12.png)
### 选择开始节点 -> 配置 `input` 类型为文件类型 -> 连接到 `mineru` 节点
![img](../../../assets/images/Coze_13.png)
![img](../../../assets/images/Coze_14.png)
### 选择结束节点 -> 连接到 `mineru` 节点 -> 配置 `output` 输出为 `mineru` 节点的 `parse_file.text`
![img](../../../assets/images/Coze_15.png)
![img](../../../assets/images/Coze_16.png)
### 上传文件 -> 试运行
![img](../../../assets/images/Coze_17.png)
![img](../../../assets/images/Coze_18.png)
### 发布 -> 添加到当前智能体
![img](../../../assets/images/Coze_19.png)
![img](../../../assets/images/Coze_20.png)
### 移除 `mineru` 插件 -> 调试
![img](../../../assets/images/Coze_21.png)
@@ -0,0 +1,11 @@
# 元枢智汇 ADP 智能数据平台 简介
元枢智汇 ADP 智能数据平台基于自研 AI 数据库和 DataFlow数据准备框架打造,旨在帮助企业高效管理、检索、处理海量数据,并通过体系化、自动化数据治理降低模型/智能体训练的专业门槛,帮助企业结合业务场景发挥私有数据的价值,真正落地AI应用。
目前,MinerU 已深度集成于元枢智汇 ADP 智能数据平台的 DataFlow 模块中,其数据解析服务由文档语料提取引擎 MinerU 提供支持。
![](../../../assets/images/DataFLow_01.png)
![](../../../assets/images/DataFLow_02.png)
- 官网地址:https://adp.originhub.tech/agent
- Miner fastGPT 插件下载地址:https://cloud.fastgpt.io/dashboard/systemPlugin?type=productivity
@@ -0,0 +1,171 @@
# Dify 简介
**Dify** 是一个开源的大语言模型(LLM)应用开发平台,旨在简化和加速生成式 AI 应用的创建和部署。它结合了后端即服务(BaaS)和 LLMOps 的理念,为开发者提供了用户友好的界面和强大的工具,有效降低了 AI 应用开发的门槛。
目前 MinerU 与 Dify 联合研发的 MinerU 插件已在 Dify 市场上架,帮助用户搭建工作流,提供文档解析的工作。
![img](../../../assets/images/Dify_2.png)
- Dify 官网地址:https://dify.ai/zh
- MinerU Dify 插件下载地址:https://marketplace.dify.ai/plugins/langgenius/mineru
# MinerU 在 Dify 中的使用方法
## 一、**新版MinerU Dify插件亮点 (v0.4.0)**
- **完美适配MinerU2**:全面兼容MinerU2的最新功能,释放顶尖的文档解析能力。
- **超高灵活性**:同时支持官方在线API和本地化部署的API(并向下兼容 1.x 版本)。
- **赋能工作流**:让Dify的Agent拥有强大的文档“读写”能力,轻松处理复杂任务。
## **二、实战演练:两个案例带你快速上手**
空谈不如实战。下面我们通过两个典型场景,向你展示新版插件的强大之处。
### 准备
1. 在Dify插件页面安装MinerU插件(私有化部署的Dify同理)
2. 填写API URL等信息
![img](../../../assets/images/Dify_3.png)
使用官方API时令牌(Token)必须提供👆,使用本地部署API时令牌可不填写👇
![img](../../../assets/images/Dify_4.png)
### **案例一:解析单文件,搭建Chat PDF应用**
想借助AI与你的文档对话吗?跟着下面几步,轻松实现
#### 第一步:创建空白应用,选择“Chatflow”
输入应用名称与描述
![img](../../../assets/images/Dify_5.png)
#### 第二步:创建的初始模板中,选择“开始”节点
字段类型选为单文件,填写变量名称(此处填为input_file),支持文档类型选为文档与图片
![img](../../../assets/images/Dify_6.png)
#### 第三步:添加工具节点——MinerU插件来解析上一步开始节点上传的文件
![img](../../../assets/images/Dify_7.png)
#### 第四步:设置MinerU的输入变量,选择上一步开始节点添加的 `input_file`
![img](../../../assets/images/Dify_8.png)
#### 第五步:配置LLM模型
选择“LLM”节点后,如果没有模型可用,需要单独在插件市场安装(这里使用 Deepseek作为示例)
“上下文”选择MinerU的输出变量 `text`MinerU解析文档后的markdown格式)
![img](../../../assets/images/Dify_9.png)
在“SYSTEM”区域根据实际需求填写提示词,可如图填写“在Parse File `text`中提取用户的问题答案”
![img](../../../assets/images/Dify_10.png)
#### 第六步:预览,上传文件并提问机器人关于文档的内容
至此一个简单的文档问答应用Chat PDF搭建完成,点击“预览”,查看效果如何👇
![img](../../../assets/images/Dify_11.png)
结果如下:
![img](../../../assets/images/Dify_12.png)
#### **第七步:发布与测试**
保存并发布你的应用。现在,上传一份PDF或图片,你就可以和它自由对话了!
![img](../../../assets/images/Dify_13.png)
### **案例二:自动化批量处理文档,并上传至云端S3**
需要处理大量文档并归档?MinerU 插件同样能胜任
#### 第一步:安装 botos3 插件
![img](../../../assets/images/Dify_14.png)
#### 第二步:配置 S3 bucket
![img](../../../assets/images/Dify_15.png)
#### 第三步:创建工作流
选择字段类型为“文件列表”,填写变量名称(此处填为input_files),支持的文档类型选为文档与图片
![img](../../../assets/images/Dify_16.png)
#### 第四步:添加“迭代”
在“开始”节点后添加“迭代”,并配置迭代内的MinerU节点,设置迭代的输入为上一步开始节点的`upload_files`,输出节点暂时不填写,再整个迭代配置完成后选择MinerU节点Parse File的`full_zip_url`
![img](../../../assets/images/Dify_17.png)
将MinerU的输入参数file选择为迭代器的 `item`
![img](../../../assets/images/Dify_18.png)
![img](../../../assets/images/Dify_19.png)
#### 第五步:增加中间节点“代码执行”来转换MinerU的解析结果
**输入变量(变量名称需与代码定义一致)**
- **text**选择MinerU Parse File的输出变量`text`
- **uploadFiles**选择“开始”节点的文件列表`upload_files`,用来根据迭代的index索引下标找到对应的原始文件名
- **index:**迭代的下标索引,选择迭代器的`index`
**输出变量(变量名称需与代码定义一致)**
- **fileName**String
- **base64**String
![img](../../../assets/images/Dify_20.png)
代码选择JavaScript,编写转换代码:
暂时无法在飞书文档外展示此内容
以下为Python版本:
暂时无法在飞书文档外展示此内容
#### 第六步:配置 Botos3 插件来上传内容
添加工具节点Botos3,选择“通过s3上传base64”
![img](../../../assets/images/Dify_21.png)
文件base64选择代码执行(图中为**转换MINERU MD文本**)输出的base64字段
![img](../../../assets/images/Dify_22.png)
S3对象key,S3 对象key填写文件存储的路径,在 botos3 插件配置界面已经填写了 bucket 名称,这里只需要填写在bucket下存储的目录即可。选择代码执行**(图中为转换MINERU MD文本)**的`fileName`
![img](../../../assets/images/Dify_23.png)
#### 第七步:预览效果
连接结束节点,至此,一个简单的上传到s3的工作流配置完成,点击“运行”看看效果👇:
![img](../../../assets/images/Dify_24.png)
![img](../../../assets/images/Dify_25.png)
#### 第八步:Vis3查看文档
运行结束,可通过[vis3](https://github.com/opendatalab/Vis3?tab=readme-ov-file#features)来查看S3桶内是否已上传解析后的md文件,Vis3使用可参考
[新工具开源!Vis3大模型数据可视化利器:填 AK/SK 直接预览 S3 数据,JSON/视频/图片秒开!本地文件也可用](https://mp.weixin.qq.com/s/p3rH4EaoJB-AK7RWeDvOhg)
![img](../../../assets/images/Dify_26.png)
@@ -0,0 +1,12 @@
# 钉钉简介
钉钉(DingTalk)是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉整合了 IM 即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌、工作台等功能,旨在实现简单、高效、安全、智能的数字化工作方式。它支持企业组织数字化和业务数字化,覆盖“人、财、物、事、产、供、销、存”的全链路管理。
通过钉钉开放平台上的SaaS软件,企业可低成本搭建数字化应用,整合所有数字化系统。此外,钉钉提供超过2000个API接口,为企业数字化转型提供开放兼容环境。不会代码的用户也可利用低代码工具构建CRM、ERP、OA、项目管理、进销存等系统。
目前,钉钉文档、AI 表格等产品此前已深度集成 MinerU 能力,并通过开放平台向生态开发者开放文档解析功能,为 DLU 的联合研发提供了扎实的技术与场景基础。
![](../../../assets/images/DingTalk_01.png)
- 钉钉官网:https://www.dingtalk.com/
@@ -0,0 +1,13 @@
# FastGPT 简介
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,将智能对话与可视化编排完美结合,让 AI 应用开发变得简单自然。无论您是开发者还是业务人员,都能轻松打造专属的 AI 应用。
目前,MinerU 插件已在 Coze 插件商店上线,通过其强大的文档解析能力,为用户搭建智能体与工作流提供文档解析能力,加快用户 AI 应用的开发。
![img](../../../assets/images/FastGPT_01.png)
![img](../../../assets/images/FastGPT_02.png)
- 官网地址:https://fastgpt.cn
- Miner fastGPT 插件下载地址:https://cloud.fastgpt.io/dashboard/systemPlugin?type=productivity
@@ -0,0 +1,18 @@
# ModelWhale 简介
ModelWhale是一款高效率的数据科学云端协作工具,为数据工作者提供了即开即用的云端分析环境,Jupyter Notebook 交互式和Canvas 拖拽式两种分析界面,帮助科研者、教育工作者解决底层工程繁复、数据难以安全应用、成果流转复现困难等问题。基于不同使用场景,ModelWhale 为用户提供三个产品版本,分别是基础版、专业版、团队版。
目前,MinerU 插件已在 ModelWhale 工作中,通过其强大的文档解析能力,为用户搭建智能体与工作流提供文档解析能力,加快用户 AI 应用的开发。
images/DingTalk_01.png
![](../../../assets/images/ModelWhale_01.png)
![](../../../assets/images/ModelWhale_02.png)
- ModelWhale 官网:Mohttps://www.modelwhale.com/pricing?scroll=1
- MinerU 在ModelWhale 的使用地址:https://www.heywhale.com/org/7b38d/workspace/iframe?url=https://www.heywhale.com/api/model/services/68089d360b1519a862ccb9b4/app/
@@ -0,0 +1,9 @@
# RagFlow 简介
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,通过融合前沿的 RAG 技术与 Agent 能力,为大型语言模型提供卓越的上下文层。它提供可适配任意规模企业的端到端 RAG 工作流,凭借融合式上下文引擎与预置的 Agent 模板,助力开发者以极致效率与精度将复杂数据转化为高可信、生产级的人工智能系统。
目前 OpenDataLab 团队正在开发 MinerU 在 Ragflow 中的插件,近期即将开源,**敬请期待**。
![](../../../assets/images/RagFlow_01.png)
- 官网地址:https://ragflow.io/
@@ -0,0 +1,10 @@
# Sider 简介
Sider 是一款浏览器侧边栏类的 AI 助手扩展,主要在网页右侧开启一个“随处可用”的智能面板,将对话式 AI(如 GPT、Claude、Gemini 等)带到你正在浏览的任何页面中。它的核心定位是:提升阅读、写作、翻译、检索与总结效率,并与网页内容深度联动。
目前,Sider在 Wisebase 模块中深度集成了 MinerU 的相关功能。该模块是一个由AI驱动的知识库,您可以通过上传 PDF 等各类型文件,构建个人图书馆以实现高效的知识管理,MinerU 可以帮助您更好地解析此类文件,精准地提取文件中的信息。
![img](../../../assets/images/Sider_1.png)
- Sider 官网地址:https://sider.ai/zh-CN/chat
- 使用集成 MinerU 相关功能的 Sider 地址:https://sider.ai/zh-CN/wisebase
@@ -0,0 +1,54 @@
# n8n 简介
**n8n** 是一款以低代码(Low-code)、工作流自动化为核心的应用开发平台,许多企业都借助于其灵活的节点(Node)配置,实现业务流程的自动化执行。它通过可视化界面和代码扩展能力,帮助用户连接各种应用程序和服务,构建复杂的自动化流程,降低用户使用门槛。
目前,MinerU 已将其强大的文档解析能力封装为 n8n 节点,用户在搭建工作流时,可以更加便捷地处理复杂的文档解析任务。
![img](../../../assets/images/n8n_0.png)
- n8n 官网地址:https://n8n.io/
- MinerU n8n 插件下载地址:https://www.npmjs.com/package/n8n-nodes-mineru
# MinerU 在 n8n 中的使用方法
## step1 进入社区node安装界面
![img](../../../assets/images/n8n_1.png)
## step2 安装 n8n-nodes-mineru 节点
≈assets/images/n8n_2.png)
## step3 新建工作流,添加 n8n-nodes-mineru 节点,并设置 api key
![img](../../../assets/images/n8n_3.png)
![img](../../../assets/images/n8n_4.png)
![img](../../../assets/images/n8n_5.png)
![img](../../../assets/images/n8n_6.png)
### n8n使用节点文档
https://www.npmjs.com/package/n8n-nodes-mineru
### **在工作流内集成解压功能**
#### 导入 json 模板
暂时无法在飞书文档外展示此内容
![img](../../../assets/images/n8n_7.png)
### 配置 凭证和文档url
![img](../../../assets/images/n8n_8.png)
### 根据各自的需求配置所需的输出
![img](../../../assets/images/n8n_9.png)
### 调试
![img](../../../assets/images/n8n_10.png)
@@ -0,0 +1,110 @@
# 使用 MinerU
## 快速配置模型源
MinerU默认使用`huggingface`作为模型源,若用户网络无法访问`huggingface`,可以通过环境变量便捷地切换模型源为`modelscope`
```bash
export MINERU_MODEL_SOURCE=modelscope
```
有关模型源配置和自定义本地模型路径的更多信息,请参考文档中的[模型源说明](./model_source.md)。
## 通过命令行快速使用
MinerU内置了命令行工具,用户可以通过命令行快速使用MinerU进行PDF解析:
```bash
# 默认使用pipeline后端解析
mineru -p <input_path> -o <output_path>
```
> [!TIP]
> - `<input_path>`:本地 PDF/图片 文件或目录
> - `<output_path>`:输出目录
>
> 更多关于输出文件的信息,请参考[输出文件说明](../reference/output_files.md)。
> [!NOTE]
> 命令行工具会在Linux和macOS系统自动尝试cuda/mps加速。Windows用户如需使用cuda加速,
> 请前往 [Pytorch官网](https://pytorch.org/get-started/locally/) 选择适合自己cuda版本的命令安装支持加速的`torch`和`torchvision`。
```bash
# 或指定vlm后端解析
mineru -p <input_path> -o <output_path> -b vlm-transformers
```
> [!TIP]
> vlm后端另外支持`vllm`加速,与`transformers`后端相比,`vllm`的加速比可达20~30倍,可以在[扩展模块安装指南](../quick_start/extension_modules.md)中查看支持`vllm`加速的完整包安装方法。
如果需要通过自定义参数调整解析选项,您也可以在文档中查看更详细的[命令行工具使用说明](./cli_tools.md)。
## 通过api、webui、http-client/server进阶使用
- 通过python api直接调用:[Python 调用示例](https://github.com/opendatalab/MinerU/blob/master/demo/demo.py)
- 通过fast api方式调用:
```bash
mineru-api --host 0.0.0.0 --port 8000
```
>[!TIP]
>在浏览器中访问 `http://127.0.0.1:8000/docs` 查看API文档。
- 启动gradio webui 可视化前端:
```bash
# 使用 pipeline/vlm-transformers/vlm-http-client 后端
mineru-gradio --server-name 0.0.0.0 --server-port 7860
# 或使用 vlm-vllm-engine/pipeline 后端(需安装vllm环境)
mineru-gradio --server-name 0.0.0.0 --server-port 7860 --enable-vllm-engine true
```
>[!TIP]
>
>- 在浏览器中访问 `http://127.0.0.1:7860` 使用 Gradio WebUI。
- 使用`http-client/server`方式调用:
```bash
# 启动vllm server(需要安装vllm环境)
mineru-vllm-server --port 30000
```
>[!TIP]
>在另一个终端中通过http client连接vllm server(只需cpu与网络,不需要vllm环境)
> ```bash
> mineru -p <input_path> -o <output_path> -b vlm-http-client -u http://127.0.0.1:30000
> ```
> [!NOTE]
> 所有vllm官方支持的参数都可用通过命令行参数传递给 MinerU,包括以下命令:`mineru`、`mineru-vllm-server`、`mineru-gradio`、`mineru-api`
> 我们整理了一些`vllm`使用中的常用参数和使用方法,可以在文档[命令行进阶参数](./advanced_cli_parameters.md)中获取。
## 基于配置文件扩展 MinerU 功能
MinerU 现已实现开箱即用,但也支持通过配置文件扩展功能。您可通过编辑用户目录下的 `mineru.json` 文件,添加自定义配置。
>[!IMPORTANT]
>`mineru.json` 文件会在您使用内置模型下载命令 `mineru-models-download` 时自动生成,也可以通过将[配置模板文件](https://github.com/opendatalab/MinerU/blob/master/mineru.template.json)复制到用户目录下并重命名为 `mineru.json` 来创建。
以下是一些可用的配置选项:
- `latex-delimiter-config`
* 用于配置 LaTeX 公式的分隔符
* 默认为`$`符号,可根据需要修改为其他符号或字符串。
- `llm-aided-config`
* 用于配置 LLM 辅助标题分级的相关参数,兼容所有支持`openai协议`的 LLM 模型
* 默认使用`阿里云百炼`的`qwen3-next-80b-a3b-instruct`模型
* 您需要自行配置 API 密钥并将`enable`设置为`true`来启用此功能
* 如果您的api供应商不支持`enable_thinking`参数,请手动将该参数删除
* 例如,在您的配置文件中,`llm-aided-config` 部分可能如下所示:
```json
"llm-aided-config": {
"api_key": "your_api_key",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "qwen3-next-80b-a3b-instruct",
"enable_thinking": false,
"enable": false
}
```
* 要移除`enable_thinking`参数,只需删除包含`"enable_thinking": false`的那一行,结果如下:
```json
"llm-aided-config": {
"api_key": "your_api_key",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "qwen3-next-80b-a3b-instruct",
"enable": false
}
```
- `models-dir`
* 用于指定本地模型存储目录,请为`pipeline`和`vlm`后端分别指定模型目录,
* 指定目录后您可通过配置环境变量`export MINERU_MODEL_SOURCE=local`来使用本地模型。