diff --git a/docker/Dockerfile b/docker/Dockerfile index 5b0d86e..3cd6553 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -304,6 +304,7 @@ RUN set -ex && \ RUN set -ex && \ export http_proxy=${GIT_PROXY} https_proxy=${GIT_PROXY} && \ ${VENV}/bin/pip install 'mineru[core]' click gradio && \ + cd /opt/vllm && ${VENV}/bin/pip install -e . --no-build-isolation --no-deps && \ ${VENV}/bin/python -c "import torch; import vllm; import mineru; import click; import gradio; import mineru.cli.gradio_app; print('MinerU + Gradio CLI imports OK')" && \ ${VENV}/bin/mineru-gradio --help >/dev/null diff --git a/docker/README.md b/docker/README.md index 66ce819..12a7972 100644 --- a/docker/README.md +++ b/docker/README.md @@ -428,6 +428,19 @@ PY' 当前入口脚本会在服务启动前执行同样的 vLLM 导入验证;如果验证失败,容器会直接退出并在 `docker compose logs gradio` 中显示真实 traceback,而不是等任务执行时才报泛化错误。 +如果日志明确显示 `ModuleNotFoundError: No module named 'vllm'`,说明 MinerU 依赖安装后 editable vLLM 没有注册到虚拟环境。当前 Dockerfile 已在安装 MinerU 后重新执行: + +```bash +cd /opt/vllm && /opt/mineru_venv/bin/pip install -e . --no-build-isolation --no-deps +``` + +入口脚本也会在启动时自动尝试这个修复。你也可以在旧容器里手动验证/修复一次: + +```bash +docker compose exec gradio bash -lc 'cd /opt/vllm && /opt/mineru_venv/bin/pip install -e . --no-build-isolation --no-deps && /opt/mineru_venv/bin/python -c "import vllm; print(vllm.__version__)"' +docker compose restart gradio +``` + **Q: 构建时 `ninja` 被 kill(exit 137)** 内存不足。将 Dockerfile 中 `ninja -j4` 改为 `ninja -j2` 或 `ninja -j1`,或给 Docker 分配更多内存。 diff --git a/docker/scripts/patch_vllm_platform.py b/docker/scripts/patch_vllm_platform.py index 96dbdc9..4f12472 100644 --- a/docker/scripts/patch_vllm_platform.py +++ b/docker/scripts/patch_vllm_platform.py @@ -6,9 +6,14 @@ """ import os +import subprocess +import sys import traceback VLLM_DIR = '/opt/vllm/vllm' +VLLM_SRC_DIR = '/opt/vllm' +VENV_PYTHON = '/opt/mineru_venv/bin/python' +VENV_PIP = '/opt/mineru_venv/bin/pip' def patch6_init_platform_fallback(): @@ -56,10 +61,42 @@ def patch7_rocm_break_import_cycle(): print('Patch 7: already applied or pattern not found.') +def ensure_vllm_installed(): + """确保 vLLM Python 包在当前虚拟环境中可导入。 + + 某些 MinerU 依赖安装流程可能会卸载/覆盖 editable vLLM,导致任务运行时报 + "Please install vllm"。如果 /opt/vllm 源码仍在,启动时用 --no-deps 重新注册, + 避免扰动已锁定的 ROCm PyTorch/Triton 依赖。 + """ + try: + import vllm # noqa: F401 + return + except ModuleNotFoundError as exc: + if exc.name != 'vllm': + raise + + if not os.path.isdir(VLLM_SRC_DIR): + raise ModuleNotFoundError( + 'vllm is not installed and /opt/vllm source directory is missing' + ) + + print('vllm package missing; reinstalling editable /opt/vllm with --no-deps...') + subprocess.check_call([ + VENV_PIP, + 'install', + '-e', VLLM_SRC_DIR, + '--no-build-isolation', + '--no-deps', + ]) + import vllm # noqa: F401 + print('vllm editable reinstall OK.') + + def main(): patch6_init_platform_fallback() patch7_rocm_break_import_cycle() try: + ensure_vllm_installed() import vllm from vllm.platforms import current_platform print(f'vllm runtime import OK: {vllm.__version__}, platform={type(current_platform).__name__}')