mineru官方文档:Ascend - MinerU

1.  基于docker镜像启动

1.1 使用 Dockerfile 构建镜像 (vllm)

1.1.1 在项目目录下运行终端,输入以下命令下载配置文件

wget https://gcore.jsdelivr.net/gh/opendatalab/MinerU@master/docker/china/npu.Dockerfile

1.1.2 打开下载的npu.Dockerfile文件,对第三行内容进行修改。

针对使用的昇腾300i Duo卡,310p核心

FROM quay.m.daocloud.io/ascend/vllm-ascend:v0.10.0rc1-310p

1.1.3 构建镜像

输入以下命令构建镜像,构建完成后通过docker image list查看是否生成mineru:npu-vllm-latest镜像文件。

docker build --network=host -t mineru:npu-vllm-latest -f npu.Dockerfile .

1.2 启动 Docker 容器

注意:自行修改device设备,docker容器名称,下载的mineru模型权重已经在容器内路径下:/root/.cache/modelscope/hub/models/OpenDataLab/MinerU2___5-Pro-2605-1___2B, 启动时不要再对该路径进行映射。

docker run -u root --name mineru_docker --privileged=true \
    --ipc=host \
    --network=host \
    --device=/dev/davinci2 \
    --device=/dev/davinci3 \
    --device=/dev/davinci_manager \
    --device=/dev/devmm_svm \
    --device=/dev/hisi_hdc \
    -v /var/log/npu/:/usr/slog \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -e VLLM_WORKER_MULTIPROC_METHOD=spawn \
    -e MINERU_MODEL_SOURCE=local \
    -e MINERU_LMDEPLOY_DEVICE=ascend \
    -it mineru:npu-vllm-latest \
    /bin/bash

2. mineru启动

2.1 启动fastapi服务

使用fastapi服务时,可将容器完全作为后端服务器,其他主机不必安装环境和依赖

2.1.1 启动服务

由于310p加速卡不支持图模式与bf16精度,因此在使用该加速卡时,执行任意与vllm相关命令需追加--enforce-eager --dtype float16, 设置显存占用比例和预加热。

mineru-api --host 0.0.0.0 --port 8009 --enforce-eager --dtype float16 --gpu-memory-utilization 0.9 --enable-vlm-preload true

2.1.2 应用服务

使用curl可提交和查询任务

也可使用下面我的python脚本进行任务提交和自动下载解压:

import requests
import time
import sys
import zipfile
import os

def process_pdf(file_path, base_url="http://127.0.0.1:8009"):
    """
    提交 PDF 到 MinerU 服务,下载完整结果 ZIP 并自动解压
    """
    # 1. 提交任务
    print(f"正在上传文件: {file_path} ...")
    upload_url = f"{base_url}/tasks"
    
    try:
        with open(file_path, "rb") as f:
            files = {"files": (file_path.split("/")[-1], f, "application/pdf")}
            # 请求返回 Markdown、图片,并打包为 ZIP 格式
            data = {
                "return_md": "true",
                "return_images": "true",
                "response_format_zip": "true",
                "backend": "vlm-engine"
            }
            response = requests.post(upload_url, files=files, data=data)
            response.raise_for_status()
    except Exception as e:
        print(f"上传文件失败: {e}")
        sys.exit(1)

    task_info = response.json()
    task_id = task_info.get("task_id")
    status_url = task_info.get("status_url")
    result_url = task_info.get("result_url")

    print(f"任务提交成功!Task ID: {task_id}")

    # 2. 轮询任务状态
    print("正在等待任务处理完成...")
    while True:
        try:
            status_resp = requests.get(status_url)
            status_resp.raise_for_status()
            status_data = status_resp.json()
            current_status = status_data.get("status")
            
            if current_status == "completed":
                print("任务处理完成!")
                break
            elif current_status == "failed":
                print(f"任务处理失败!错误信息: {status_data.get('error')}")
                sys.exit(1)
            else:
                print(f"当前状态: {current_status},等待中...")
                time.sleep(2)
        except Exception as e:
            print(f"查询状态时发生错误: {e}")
            sys.exit(1)

    # 3. 下载 ZIP 压缩包并自动解压
    zip_filename = "output_full_results.zip"
    extract_dir = "output_full_results"

    try:
        # 3.1 下载 ZIP 文件
        print("正在下载完整结果压缩包...")
        result_resp = requests.get(result_url)
        result_resp.raise_for_status()
        
        with open(zip_filename, "wb") as f:
            f.write(result_resp.content)
            
        # 3.2 自动解压 ZIP 文件
        print(f"正在解压文件到 [{extract_dir}] 目录...")
        # 如果解压目录已存在,会自动覆盖或合并
        os.makedirs(extract_dir, exist_ok=True)
        
        with zipfile.ZipFile(zip_filename, 'r') as zip_ref:
            zip_ref.extractall(extract_dir)
            
        print(f"所有文件(Markdown、图片等)已解压至: {os.path.abspath(extract_dir)}")
        
        # 3.3 清理下载的临时 ZIP 文件(可选)
        os.remove(zip_filename)
        print("临时 ZIP 文件已清理。")
        
    except zipfile.BadZipFile:
        print("下载的文件不是有效的 ZIP 压缩包!")
        sys.exit(1)
    except Exception as e:
        print(f"下载或解压过程中发生错误: {e}")
        sys.exit(1)

if __name__ == "__main__":

    # 修改需要解析的文件路径,解析后的文件也会下载至该路径下
    PDF_PATH = "/root/下载/111.pdf"
    process_pdf(PDF_PATH)

2.2 启动mineru-openai-server

 mineru-openai-server作为视觉大模型服务,容器外调用的主机需要安装mineru库环境

2.2.1 容器内启动服务

mineru-openai-server --port 8009 --enforce-eager --dtype float16

2.2.2 容器外配置mineru环境

使用pip或者uv安装mineru,推荐使用conda进行环境隔离

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[all]" -i https://mirrors.aliyun.com/pypi/simple 

2.2.3 执行mineru解析

终端中激活配置好的mineru环境,执行下面命令即可:

mineru -p <input_path> -o <output_path> -b hybrid-http-client -u http://127.0.0.1:8009

2.3 结果展示

使用fastapi服务配合python代码,打压缩包进行下载,解压压缩包文件,内含图片与md文件。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐