diff --git a/docker/README.md b/docker/README.md index 761d2c6..2d253cb 100644 --- a/docker/README.md +++ b/docker/README.md @@ -191,39 +191,39 @@ docker compose build ## 4. 运行容器 -### 4.1 启动 WebUI / API 服务 +### 4.1 启动 WebUI 服务(默认推荐) -当前 `docker-compose.yml` 默认会启动: +当前 `docker-compose.yml` 默认只启动一个 GPU 直连的 `gradio` WebUI 服务,避免单卡机器因为 `worker1` 或可选 Router 退出导致整组服务不可用: | 服务 | 宿主机端口 | 容器内端口 | 用途 | |------|------------|------------|------| -| `gradio` | `10002` | `7860` | WebUI 前端 | -| `router` | `8000` | `8000` | API 路由 | -| `worker0` | 未暴露 | `8001` | GPU Worker | -| `worker1` | 未暴露 | `8002` | GPU Worker | +| `gradio` | `10002` | `7860` | WebUI 前端 + 本地推理 | ```bash docker compose up -d # 查看容器是否都已启动 -docker compose ps +docker compose ps -a # WebUI 健康检查:应返回 HTML 或 HTTP 状态,而不是 Connection refused curl -v http://localhost:10002/ - -# API router 端口 -curl -v http://localhost:8000/ ``` 浏览器打开:`http://<宿主机IP>:10002`。 +如果 `docker compose ps` 为空或显示 `Exited`,说明服务进程启动后退出,请先看日志: + +```bash +docker compose logs --tail=200 gradio +``` + > 注意:直接 `docker run mineru-rocm:7.2.1` 使用的是 Dockerfile 默认 `CMD ["bash"]`,只会进入/运行 shell,不会启动 WebUI/API,也就不会监听 `10002`。如需直接 `docker run` 暴露 WebUI,必须显式传入 `mineru-gradio` 命令并映射端口。 ### 4.2 交互模式(调试 / 手动处理) ```bash -# docker compose(复用 worker0 的 GPU/卷配置,覆盖 command 进入 bash) -docker compose run --rm worker0 bash +# docker compose(复用 gradio 的 GPU/卷配置,覆盖 command 进入 bash) +docker compose run --rm gradio bash # 或 docker run docker run -it --rm \ @@ -251,7 +251,7 @@ mineru -p /data/input/example.pdf -o /data/output -b hybrid-auto-engine ### 4.3 CLI 模式(一键处理) ```bash -docker compose run --rm worker0 \ +docker compose run --rm gradio \ mineru -p /data/input/example.pdf -o /data/output -b hybrid-auto-engine ``` @@ -260,16 +260,24 @@ docker compose run --rm worker0 \ command: mineru -p /data/input/example.pdf -o /data/output -b hybrid-auto-engine ``` -### 4.4 WebUI / API 模式 +### 4.4 可选:Router API 多 Worker 模式 -无需修改 Compose,直接启动即可: +如果确实需要独立 API Router,可启用 `router-api` profile。默认只启用 `worker0`,避免单卡机器启动 `worker1` 失败: ```bash -docker compose up -d +docker compose --profile router-api up -d +curl -v http://localhost:8000/ ``` -- WebUI:`http://<宿主机IP>:10002` -- API Router:`http://<宿主机IP>:8000` +双卡时再启用 `dual-gpu` profile,并在 `.env` 中设置: + +```env +ROUTER_API_URLS=http://mineru-worker0:8001,http://mineru-worker1:8002 +``` + +```bash +docker compose --profile router-api --profile dual-gpu up -d +``` API 用法参考 [MinerU 官方文档](https://github.com/opendatalab/MinerU)。 @@ -278,7 +286,7 @@ API 用法参考 [MinerU 官方文档](https://github.com/opendatalab/MinerU)。 设置环境变量即可切换下载源: ```bash -docker compose run --rm -e MINERU_MODEL_SOURCE=modelscope worker0 \ +docker compose run --rm -e MINERU_MODEL_SOURCE=modelscope gradio \ mineru -p /data/input/example.pdf -o /data/output -b hybrid-auto-engine ``` @@ -292,7 +300,7 @@ docker compose run --rm -e MINERU_MODEL_SOURCE=modelscope worker0 \ ```bash # 进入容器 -docker compose run --rm worker0 bash +docker compose run --rm gradio bash # 运行预热 python /opt/scripts/cache_warmer.py --device cuda --max_side 960 --step 32 @@ -310,7 +318,7 @@ python /opt/scripts/cache_warmer.py --device cuda --max_side 960 --step 32 ## 6. 验证 ```bash -docker compose run --rm worker0 python -c " +docker compose run --rm gradio python -c " import torch from vllm.platforms import current_platform @@ -438,7 +446,7 @@ RUN rm -rf /opt/vllm_build /opt/vllm/.git /opt/aiter/.git /opt/flash-attention/. ### 升级 MinerU ```bash -docker compose run --rm worker0 pip install --upgrade 'mineru[core]' +docker compose run --rm gradio pip install --upgrade 'mineru[core]' # 然后重新应用 RDNA 补丁(参考 Dockerfile 阶段 9) ``` diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index c5dfebb..206b2c4 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -6,35 +6,6 @@ services: # --- WebUI 前端 --- gradio: - image: mineru-rocm:7.2.1 - container_name: mineru-gradio - stdin_open: true - tty: true - ipc: host - ports: - - "10002:7860" - environment: - - GRADIO_SERVER_NAME=0.0.0.0 - - MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface} - - HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface} - - MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope} - volumes: - - ${INPUT_DIR:-./data/input}:/data/input:ro - - ${OUTPUT_DIR:-./data/output}:/data/output - - ${MODEL_DIR:-./data/models}:/opt/models - - ./scripts:/opt/scripts:ro - command: - [ - "mineru-gradio", - "--server-name", "0.0.0.0", - "--server-port", "7860", - "--api-url", "http://mineru-router:8000", - ] - depends_on: - - router - - # --- 双卡 Worker(GPU 算力,无 profile,始终可用)--- - worker0: image: mineru-rocm:7.2.1 build: context: . @@ -43,10 +14,11 @@ services: args: ARCH: ${ARCH:-gfx1201} GIT_PROXY: ${GIT_PROXY:-} - container_name: mineru-worker0 + container_name: mineru-gradio stdin_open: true tty: true ipc: host + restart: unless-stopped devices: - /dev/kfd - /dev/dri @@ -54,6 +26,53 @@ services: - seccomp=unconfined group_add: - video + - render + ports: + - "10002:7860" + environment: + - GRADIO_SERVER_NAME=0.0.0.0 + - HIP_VISIBLE_DEVICES=${HIP_VISIBLE_DEVICES:-0} + - MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface} + - HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface} + - MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope} + volumes: + - ${INPUT_DIR:-./data/input}:/data/input:ro + - ${OUTPUT_DIR:-./data/output}:/data/output + - ${MODEL_DIR:-./data/models}:/opt/models + - ${MIOPEN_CACHE:-./data/miopen}:/root/.cache/miopen + - ./scripts:/opt/scripts:ro + command: + [ + "mineru-gradio", + "--server-name", "0.0.0.0", + "--server-port", "7860", + ] + healthcheck: + test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:7860/ >/dev/null || exit 1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s + + # --- 可选:多 Worker API Router 模式(默认不启动)--- + # 启用方式:docker compose --profile router-api up -d + # 单卡默认请使用上面的 gradio 服务;双卡时可在 .env 中设置 ROUTER_API_URLS。 + worker0: + image: mineru-rocm:7.2.1 + profiles: ["router-api"] + container_name: mineru-worker0 + stdin_open: true + tty: true + ipc: host + restart: unless-stopped + devices: + - /dev/kfd + - /dev/dri + security_opt: + - seccomp=unconfined + group_add: + - video + - render environment: - HIP_VISIBLE_DEVICES=0 - MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface} @@ -69,10 +88,12 @@ services: worker1: image: mineru-rocm:7.2.1 + profiles: ["dual-gpu"] container_name: mineru-worker1 stdin_open: true tty: true ipc: host + restart: unless-stopped devices: - /dev/kfd - /dev/dri @@ -80,6 +101,7 @@ services: - seccomp=unconfined group_add: - video + - render environment: - HIP_VISIBLE_DEVICES=1 - MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface} @@ -95,10 +117,12 @@ services: router: image: mineru-rocm:7.2.1 + profiles: ["router-api"] container_name: mineru-router stdin_open: true tty: true ipc: host + restart: unless-stopped ports: - "8000:8000" environment: @@ -111,11 +135,10 @@ services: [ "mineru-router", "--api-urls", - "http://mineru-worker0:8001,http://mineru-worker1:8002", + "${ROUTER_API_URLS:-http://mineru-worker0:8001}", "--host", "0.0.0.0", "--port", "8000", "--allow-public-http-client", ] depends_on: - worker0 - - worker1 diff --git a/docker/env.example b/docker/env.example index ce87a45..a36a49f 100644 --- a/docker/env.example +++ b/docker/env.example @@ -15,6 +15,15 @@ OUTPUT_DIR=./data/output MODEL_DIR=./data/models MIOPEN_CACHE=./data/miopen +# ---- 默认 WebUI 使用的 GPU ---- +# 单卡保持 0;多卡时可指定 0/1/...,或留空让 ROCm 使用全部可见 GPU。 +HIP_VISIBLE_DEVICES=0 + +# ---- 可选:router-api profile 使用的 Worker 地址 ---- +# 单 worker: http://mineru-worker0:8001 +# 双 worker: http://mineru-worker0:8001,http://mineru-worker1:8002 +ROUTER_API_URLS=http://mineru-worker0:8001 + # ---- 模型下载源 ---- # huggingface(默认,需科学上网)或 modelscope(国内可用) MINERU_MODEL_SOURCE=huggingface