x
This commit is contained in:
Generated
+6
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="com.codeverse.userSettings.MarscodeWorkspaceAppSettingsState">
|
||||||
|
<option name="progress" value="1.0" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
+8
-21
@@ -11,8 +11,8 @@ ARG PYTHON_VER=3.12
|
|||||||
ARG VENV=/opt/mineru_venv
|
ARG VENV=/opt/mineru_venv
|
||||||
ARG TORCH_INDEX=https://download.pytorch.org/whl/rocm7.2
|
ARG TORCH_INDEX=https://download.pytorch.org/whl/rocm7.2
|
||||||
|
|
||||||
# -- GitHub 访问(国内无镜像,需代理;默认不走代理)-----------------------------
|
# -- GitHub 访问(国内无镜像,需代理)----------------------------------------
|
||||||
ARG GIT_PROXY=
|
ARG GIT_PROXY=http://127.0.0.1:8118
|
||||||
|
|
||||||
# -- 国内镜像 ----------------------------------------------------------------
|
# -- 国内镜像 ----------------------------------------------------------------
|
||||||
ARG PIP_INDEX=https://mirrors.aliyun.com/pypi/simple
|
ARG PIP_INDEX=https://mirrors.aliyun.com/pypi/simple
|
||||||
@@ -20,7 +20,6 @@ ARG PIP_INDEX=https://mirrors.aliyun.com/pypi/simple
|
|||||||
# -- 环境变量 ---------------------------------------------------------------
|
# -- 环境变量 ---------------------------------------------------------------
|
||||||
ENV DEBIAN_FRONTEND=noninteractive \
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
PATH=/opt/rocm/bin:/opt/rocm/llvm/bin:${VENV}/bin:${PATH} \
|
PATH=/opt/rocm/bin:/opt/rocm/llvm/bin:${VENV}/bin:${PATH} \
|
||||||
PYTHONPATH=/opt/vllm:${PYTHONPATH} \
|
|
||||||
PYTORCH_ROCM_ARCH=${ARCH} \
|
PYTORCH_ROCM_ARCH=${ARCH} \
|
||||||
FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE \
|
FLASH_ATTENTION_TRITON_AMD_ENABLE=TRUE \
|
||||||
MINERU_MODEL_SOURCE=huggingface \
|
MINERU_MODEL_SOURCE=huggingface \
|
||||||
@@ -82,25 +81,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
# 阶段 4:CMake 4.0(通过代理下载加速)
|
# 阶段 4:CMake 4.0(通过代理下载加速)
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
RUN set -ex && \
|
RUN export http_proxy=${GIT_PROXY} https_proxy=${GIT_PROXY} && \
|
||||||
CMAKE_TGZ=cmake-4.0.0-linux-x86_64.tar.gz && \
|
|
||||||
CMAKE_DIR=cmake-4.0.0-linux-x86_64 && \
|
|
||||||
CMAKE_URLS="https://github.com/Kitware/CMake/releases/download/v4.0.0/${CMAKE_TGZ} https://ghproxy.com/https://github.com/Kitware/CMake/releases/download/v4.0.0/${CMAKE_TGZ}" && \
|
|
||||||
if [ -n "${GIT_PROXY}" ]; then export http_proxy=${GIT_PROXY} https_proxy=${GIT_PROXY}; fi && \
|
|
||||||
cd /tmp && \
|
cd /tmp && \
|
||||||
ok=0; \
|
wget -q https://github.com/Kitware/CMake/releases/download/v4.0.0/cmake-4.0.0-linux-x86_64.tar.gz && \
|
||||||
for url in ${CMAKE_URLS}; do \
|
tar -xzf cmake-4.0.0-linux-x86_64.tar.gz && \
|
||||||
echo "Downloading CMake from: ${url}"; \
|
cp -r cmake-4.0.0-linux-x86_64/bin/* /usr/local/bin/ && \
|
||||||
if curl -fL --retry 5 --retry-delay 3 --connect-timeout 20 -o ${CMAKE_TGZ} "${url}"; then \
|
cp -r cmake-4.0.0-linux-x86_64/share/* /usr/local/share/ && \
|
||||||
ok=1; \
|
rm -rf cmake-4.0.0-linux-x86_64* && \
|
||||||
break; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
[ "${ok}" = "1" ] || (echo "Failed to download ${CMAKE_TGZ} from all mirrors" && exit 4) && \
|
|
||||||
tar -xzf ${CMAKE_TGZ} && \
|
|
||||||
cp -r ${CMAKE_DIR}/bin/* /usr/local/bin/ && \
|
|
||||||
cp -r ${CMAKE_DIR}/share/* /usr/local/share/ && \
|
|
||||||
rm -rf ${CMAKE_TGZ} ${CMAKE_DIR} && \
|
|
||||||
cmake --version
|
cmake --version
|
||||||
|
|
||||||
# ===========================================================================
|
# ===========================================================================
|
||||||
|
|||||||
@@ -163,7 +163,6 @@ cp env.example .env
|
|||||||
# 方式一:docker build(直接指定 ARCH)
|
# 方式一:docker build(直接指定 ARCH)
|
||||||
docker build \
|
docker build \
|
||||||
--build-arg ARCH=gfx1201 \
|
--build-arg ARCH=gfx1201 \
|
||||||
--build-arg GIT_PROXY= \
|
|
||||||
-t mineru-rocm:7.2.1 \
|
-t mineru-rocm:7.2.1 \
|
||||||
-f Dockerfile .
|
-f Dockerfile .
|
||||||
|
|
||||||
@@ -187,7 +186,6 @@ docker compose build
|
|||||||
| `PYTHON_VER` | `3.12` | Python 版本 |
|
| `PYTHON_VER` | `3.12` | Python 版本 |
|
||||||
| `VENV` | `/opt/mineru_venv` | 虚拟环境路径 |
|
| `VENV` | `/opt/mineru_venv` | 虚拟环境路径 |
|
||||||
| `TORCH_INDEX` | `https://download.pytorch.org/whl/rocm7.2` | PyTorch wheel 源 |
|
| `TORCH_INDEX` | `https://download.pytorch.org/whl/rocm7.2` | PyTorch wheel 源 |
|
||||||
| `GIT_PROXY` | 空 | 仅构建时访问 GitHub 用;例如 `http://host.docker.internal:8118` |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -408,61 +406,10 @@ docker compose build --no-cache gradio
|
|||||||
docker compose up -d --force-recreate
|
docker compose up -d --force-recreate
|
||||||
```
|
```
|
||||||
|
|
||||||
**Q: 任务失败并提示 `Please install vllm to use the vllm-async-engine backend`**
|
|
||||||
|
|
||||||
这通常不是简单的“没安装 vllm”,而是任务进程里 `import vllm` 或 `from vllm.platforms import current_platform` 失败,MinerU 将真实异常包装成了这句提示。先在容器内直接诊断:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose exec gradio bash -lc '/opt/mineru_venv/bin/python - <<"PY"
|
|
||||||
import traceback
|
|
||||||
try:
|
|
||||||
import torch
|
|
||||||
import vllm
|
|
||||||
from vllm.platforms import current_platform
|
|
||||||
print("torch:", torch.__version__, "hip:", torch.version.hip)
|
|
||||||
print("vllm:", vllm.__version__)
|
|
||||||
print("platform:", type(current_platform).__name__, "is_rocm:", current_platform.is_rocm())
|
|
||||||
except Exception:
|
|
||||||
traceback.print_exc()
|
|
||||||
raise
|
|
||||||
PY'
|
|
||||||
```
|
|
||||||
|
|
||||||
当前入口脚本会在服务启动前执行同样的 vLLM 导入验证;如果验证失败,容器会直接退出并在 `docker compose logs gradio` 中显示真实 traceback,而不是等任务执行时才报泛化错误。
|
|
||||||
|
|
||||||
如果日志明确显示 `ModuleNotFoundError: No module named 'vllm'`,常见原因是 vLLM 分发元数据不可见,但 `/opt/vllm` 源码仍在。当前镜像已通过 `PYTHONPATH=/opt/vllm` 和入口脚本兜底保证可导入,避免 editable 安装触发 `pyproject.toml` 元数据校验失败。
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export PYTHONPATH=/opt/vllm:${PYTHONPATH}
|
|
||||||
/opt/mineru_venv/bin/python -c "import vllm; print(vllm.__version__)"
|
|
||||||
```
|
|
||||||
|
|
||||||
入口脚本也会在启动时自动尝试这个修复。你也可以在旧容器里手动验证/修复一次:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose exec gradio bash -lc 'export PYTHONPATH=/opt/vllm:${PYTHONPATH}; /opt/mineru_venv/bin/python -c "import vllm; print(vllm.__version__)"'
|
|
||||||
docker compose restart gradio
|
|
||||||
```
|
|
||||||
|
|
||||||
**Q: 构建时 `ninja` 被 kill(exit 137)**
|
**Q: 构建时 `ninja` 被 kill(exit 137)**
|
||||||
|
|
||||||
内存不足。将 Dockerfile 中 `ninja -j4` 改为 `ninja -j2` 或 `ninja -j1`,或给 Docker 分配更多内存。
|
内存不足。将 Dockerfile 中 `ninja -j4` 改为 `ninja -j2` 或 `ninja -j1`,或给 Docker 分配更多内存。
|
||||||
|
|
||||||
**Q: 构建在 CMake 下载阶段失败(`wget/curl exit code 4`)**
|
|
||||||
|
|
||||||
这通常是构建容器无法访问 GitHub,或把 `GIT_PROXY` 设成了容器内不可达地址(例如 `127.0.0.1:8118` 在多数 Docker 场景下指向容器自己,不是宿主机代理)。建议:
|
|
||||||
|
|
||||||
1. 不需要代理时,显式传空:`--build-arg GIT_PROXY=`
|
|
||||||
2. 需要宿主机代理时,优先用:`http://host.docker.internal:8118`
|
|
||||||
3. 先单独测试下载连通性,再完整构建
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker build --build-arg GIT_PROXY= -t mineru-rocm:7.2.1 -f Dockerfile .
|
|
||||||
|
|
||||||
# 或(宿主机代理)
|
|
||||||
docker build --build-arg GIT_PROXY=http://host.docker.internal:8118 -t mineru-rocm:7.2.1 -f Dockerfile .
|
|
||||||
```
|
|
||||||
|
|
||||||
**Q: 构建时 cmake 报 `Failed to find ROCm root directory`**
|
**Q: 构建时 cmake 报 `Failed to find ROCm root directory`**
|
||||||
|
|
||||||
`/opt/rocm/bin` 不在 PATH 中。检查 Dockerfile 中 `ENV PATH` 是否正确设置。
|
`/opt/rocm/bin` 不在 PATH 中。检查 Dockerfile 中 `ENV PATH` 是否正确设置。
|
||||||
|
|||||||
+16
-33
@@ -7,30 +7,15 @@ services:
|
|||||||
# --- WebUI 前端 ---
|
# --- WebUI 前端 ---
|
||||||
gradio:
|
gradio:
|
||||||
image: mineru-rocm:7.2.1
|
image: mineru-rocm:7.2.1
|
||||||
build:
|
profiles: ["gradio"]
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
network: host
|
|
||||||
args:
|
|
||||||
ARCH: ${ARCH:-gfx1201}
|
|
||||||
GIT_PROXY: ${GIT_PROXY:-}
|
|
||||||
container_name: mineru-gradio
|
container_name: mineru-gradio
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
tty: true
|
tty: true
|
||||||
ipc: host
|
ipc: host
|
||||||
restart: on-failure:3
|
|
||||||
devices:
|
|
||||||
- /dev/kfd
|
|
||||||
- /dev/dri
|
|
||||||
security_opt:
|
|
||||||
- seccomp=unconfined
|
|
||||||
group_add:
|
|
||||||
- video
|
|
||||||
ports:
|
ports:
|
||||||
- "10002:7860"
|
- "10002:7860"
|
||||||
environment:
|
environment:
|
||||||
- GRADIO_SERVER_NAME=0.0.0.0
|
- GRADIO_SERVER_NAME=0.0.0.0
|
||||||
- HIP_VISIBLE_DEVICES=${HIP_VISIBLE_DEVICES:-0}
|
|
||||||
- MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface}
|
- MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface}
|
||||||
- HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface}
|
- HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface}
|
||||||
- MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope}
|
- MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope}
|
||||||
@@ -38,32 +23,31 @@ services:
|
|||||||
- ${INPUT_DIR:-./data/input}:/data/input:ro
|
- ${INPUT_DIR:-./data/input}:/data/input:ro
|
||||||
- ${OUTPUT_DIR:-./data/output}:/data/output
|
- ${OUTPUT_DIR:-./data/output}:/data/output
|
||||||
- ${MODEL_DIR:-./data/models}:/opt/models
|
- ${MODEL_DIR:-./data/models}:/opt/models
|
||||||
- ${MIOPEN_CACHE:-./data/miopen}:/root/.cache/miopen
|
|
||||||
- ./scripts:/opt/scripts:ro
|
- ./scripts:/opt/scripts:ro
|
||||||
command:
|
command:
|
||||||
[
|
[
|
||||||
"mineru-gradio",
|
"mineru-gradio",
|
||||||
"--server-name", "0.0.0.0",
|
"--server-name", "0.0.0.0",
|
||||||
"--server-port", "7860",
|
"--server-port", "7860",
|
||||||
|
"--api-url", "http://mineru-router:8000",
|
||||||
]
|
]
|
||||||
healthcheck:
|
depends_on:
|
||||||
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:7860/ >/dev/null || exit 1"]
|
- router
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 5
|
|
||||||
start_period: 60s
|
|
||||||
|
|
||||||
# --- 可选:多 Worker API Router 模式(默认不启动)---
|
# --- 双卡 Worker(GPU 算力,无 profile,始终可用)---
|
||||||
# 启用方式:docker compose --profile router-api up -d
|
|
||||||
# 单卡默认请使用上面的 gradio 服务;双卡时可在 .env 中设置 ROUTER_API_URLS。
|
|
||||||
worker0:
|
worker0:
|
||||||
image: mineru-rocm:7.2.1
|
image: mineru-rocm:7.2.1
|
||||||
profiles: ["router-api"]
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
network: host
|
||||||
|
args:
|
||||||
|
ARCH: ${ARCH:-gfx1201}
|
||||||
|
GIT_PROXY: ${GIT_PROXY:-}
|
||||||
container_name: mineru-worker0
|
container_name: mineru-worker0
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
tty: true
|
tty: true
|
||||||
ipc: host
|
ipc: host
|
||||||
restart: on-failure:3
|
|
||||||
devices:
|
devices:
|
||||||
- /dev/kfd
|
- /dev/kfd
|
||||||
- /dev/dri
|
- /dev/dri
|
||||||
@@ -73,6 +57,7 @@ services:
|
|||||||
- video
|
- video
|
||||||
environment:
|
environment:
|
||||||
- HIP_VISIBLE_DEVICES=0
|
- HIP_VISIBLE_DEVICES=0
|
||||||
|
- PYTHONPATH=/opt/vllm:${PYTHONPATH:-}
|
||||||
- MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface}
|
- MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface}
|
||||||
- HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface}
|
- HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface}
|
||||||
- MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope}
|
- MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope}
|
||||||
@@ -86,12 +71,10 @@ services:
|
|||||||
|
|
||||||
worker1:
|
worker1:
|
||||||
image: mineru-rocm:7.2.1
|
image: mineru-rocm:7.2.1
|
||||||
profiles: ["dual-gpu"]
|
|
||||||
container_name: mineru-worker1
|
container_name: mineru-worker1
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
tty: true
|
tty: true
|
||||||
ipc: host
|
ipc: host
|
||||||
restart: on-failure:3
|
|
||||||
devices:
|
devices:
|
||||||
- /dev/kfd
|
- /dev/kfd
|
||||||
- /dev/dri
|
- /dev/dri
|
||||||
@@ -101,6 +84,7 @@ services:
|
|||||||
- video
|
- video
|
||||||
environment:
|
environment:
|
||||||
- HIP_VISIBLE_DEVICES=1
|
- HIP_VISIBLE_DEVICES=1
|
||||||
|
- PYTHONPATH=/opt/vllm:${PYTHONPATH:-}
|
||||||
- MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface}
|
- MINERU_MODEL_SOURCE=${MINERU_MODEL_SOURCE:-huggingface}
|
||||||
- HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface}
|
- HF_HUB_CACHE=${HF_HUB_CACHE:-/opt/models/huggingface}
|
||||||
- MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope}
|
- MODELSCOPE_CACHE=${MODELSCOPE_CACHE:-/opt/models/modelscope}
|
||||||
@@ -114,12 +98,10 @@ services:
|
|||||||
|
|
||||||
router:
|
router:
|
||||||
image: mineru-rocm:7.2.1
|
image: mineru-rocm:7.2.1
|
||||||
profiles: ["router-api"]
|
|
||||||
container_name: mineru-router
|
container_name: mineru-router
|
||||||
stdin_open: true
|
stdin_open: true
|
||||||
tty: true
|
tty: true
|
||||||
ipc: host
|
ipc: host
|
||||||
restart: on-failure:3
|
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
environment:
|
environment:
|
||||||
@@ -132,10 +114,11 @@ services:
|
|||||||
[
|
[
|
||||||
"mineru-router",
|
"mineru-router",
|
||||||
"--api-urls",
|
"--api-urls",
|
||||||
"${ROUTER_API_URLS:-http://mineru-worker0:8001}",
|
"http://mineru-worker0:8001,http://mineru-worker1:8002",
|
||||||
"--host", "0.0.0.0",
|
"--host", "0.0.0.0",
|
||||||
"--port", "8000",
|
"--port", "8000",
|
||||||
"--allow-public-http-client",
|
"--allow-public-http-client",
|
||||||
]
|
]
|
||||||
depends_on:
|
depends_on:
|
||||||
- worker0
|
- worker0
|
||||||
|
- worker1
|
||||||
|
|||||||
Binary file not shown.
@@ -19,5 +19,10 @@ if [ -f ${SCRIPTS_DIR}/apply_mineru_patches.py ]; then
|
|||||||
${VENV}/bin/python ${SCRIPTS_DIR}/apply_mineru_patches.py || echo "[entrypoint] apply_mineru_patches.py failed (non-fatal)"
|
${VENV}/bin/python ${SCRIPTS_DIR}/apply_mineru_patches.py || echo "[entrypoint] apply_mineru_patches.py failed (non-fatal)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# 确保 vllm 源码目录在 PYTHONPATH 中
|
||||||
|
# patch_vllm_platform.py 中的 os.environ 修改不持久化到父进程
|
||||||
|
# 这里无条件导出,防止 editable install 被破坏后 vllm 无法导入
|
||||||
|
export PYTHONPATH="/opt/vllm:${PYTHONPATH}"
|
||||||
|
|
||||||
echo "[entrypoint] starting: $*"
|
echo "[entrypoint] starting: $*"
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
@@ -6,7 +6,9 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import sysconfig
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
VLLM_DIR = '/opt/vllm/vllm'
|
VLLM_DIR = '/opt/vllm/vllm'
|
||||||
@@ -38,26 +40,88 @@ def patch6_init_platform_fallback():
|
|||||||
def patch7_rocm_break_import_cycle():
|
def patch7_rocm_break_import_cycle():
|
||||||
"""补丁 7:platforms/rocm.py —— logger.warning_once → sys.stderr.write
|
"""补丁 7:platforms/rocm.py —— logger.warning_once → sys.stderr.write
|
||||||
|
|
||||||
这个补丁会直接改写 vLLM 源码中的函数调用。部分 vLLM 版本里
|
默认启用安全的“整段 except 块”替换,避免 logger.warning_once() 在平台检测
|
||||||
logger.warning_once(...) 参数不一定兼容 sys.stderr.write(...),改写后可能
|
期间触发循环导入,导致 current_platform 落到 UnspecifiedPlatform。
|
||||||
导致 import vllm / import vllm.platforms.rocm 失败。MinerU 会把这种导入失败
|
如需禁用,设置 VLLM_PATCH_ROCM_WARNING_ONCE=0。
|
||||||
包装成 "Please install vllm",因此默认禁用,只在显式设置环境变量时启用。
|
|
||||||
"""
|
"""
|
||||||
if os.environ.get('VLLM_PATCH_ROCM_WARNING_ONCE') != '1':
|
if os.environ.get('VLLM_PATCH_ROCM_WARNING_ONCE') == '0':
|
||||||
print('Patch 7: skipped (set VLLM_PATCH_ROCM_WARNING_ONCE=1 to enable).')
|
print('Patch 7: skipped (VLLM_PATCH_ROCM_WARNING_ONCE=0).')
|
||||||
return
|
return
|
||||||
f = os.path.join(VLLM_DIR, 'platforms', 'rocm.py')
|
f = os.path.join(VLLM_DIR, 'platforms', 'rocm.py')
|
||||||
c = open(f).read()
|
c = open(f).read()
|
||||||
old = 'logger.warning_once('
|
if 'amdsmi unavailable, using torch.cuda fallback' in c:
|
||||||
new = 'import sys as _sys\n _sys.stderr.write('
|
print('Patch 7: already applied.')
|
||||||
c2 = c.replace(old, new)
|
return
|
||||||
|
pattern = re.compile(
|
||||||
|
r'(\n\s*except Exception as e:\n'
|
||||||
|
r'\s*logger\.debug\("Failed to get GCN arch via amdsmi: %s", e\)\n'
|
||||||
|
r'\s*logger\.warning_once\(\n'
|
||||||
|
r'(?:\s*"[^"]*"\n)+'
|
||||||
|
r'\s*\)\n)',
|
||||||
|
re.MULTILINE,
|
||||||
|
)
|
||||||
|
|
||||||
|
def repl(match):
|
||||||
|
indent = re.search(r'\n(\s*)except Exception as e:', match.group(1)).group(1)
|
||||||
|
body_indent = indent + ' '
|
||||||
|
return (
|
||||||
|
f'\n{indent}except Exception as e:\n'
|
||||||
|
f'{body_indent}import sys as _sys\n'
|
||||||
|
f'{body_indent}_sys.stderr.write('
|
||||||
|
'"vLLM ROCm: amdsmi unavailable, using torch.cuda fallback for GPU detection\\n")\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
c2, n = pattern.subn(repl, c, count=1)
|
||||||
if c2 != c:
|
if c2 != c:
|
||||||
open(f, 'w').write(c2)
|
open(f, 'w').write(c2)
|
||||||
print('Patch 7: rocm.py circular import broken.')
|
print('Patch 7: rocm.py logger.warning_once circular import patch applied.')
|
||||||
else:
|
else:
|
||||||
print('Patch 7: already applied or pattern not found.')
|
print('Patch 7: already applied or pattern not found.')
|
||||||
|
|
||||||
|
|
||||||
|
def ensure_vllm_dist_info():
|
||||||
|
"""为 /opt/vllm 源码导入创建最小 dist-info。
|
||||||
|
|
||||||
|
vLLM 平台检测会通过 importlib.metadata 查询 vllm 分发元数据/entry points。
|
||||||
|
如果只靠 PYTHONPATH 导入源码,没有 dist-info,就会出现:
|
||||||
|
"The vLLM package was not found...",并可能得到 UnspecifiedPlatform。
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
import vllm
|
||||||
|
except Exception:
|
||||||
|
return
|
||||||
|
|
||||||
|
version = getattr(vllm, '__version__', '0.1.dev1') or '0.1.dev1'
|
||||||
|
site_packages = sysconfig.get_paths().get('purelib')
|
||||||
|
if not site_packages:
|
||||||
|
return
|
||||||
|
dist_info = os.path.join(site_packages, f'vllm-{version}.dist-info')
|
||||||
|
os.makedirs(dist_info, exist_ok=True)
|
||||||
|
|
||||||
|
metadata = os.path.join(dist_info, 'METADATA')
|
||||||
|
if not os.path.exists(metadata):
|
||||||
|
with open(metadata, 'w') as fp:
|
||||||
|
fp.write(
|
||||||
|
'Metadata-Version: 2.1\n'
|
||||||
|
'Name: vllm\n'
|
||||||
|
f'Version: {version}\n'
|
||||||
|
'Summary: vLLM source tree mounted at /opt/vllm\n'
|
||||||
|
)
|
||||||
|
|
||||||
|
with open(os.path.join(dist_info, 'top_level.txt'), 'w') as fp:
|
||||||
|
fp.write('vllm\n')
|
||||||
|
with open(os.path.join(dist_info, 'INSTALLER'), 'w') as fp:
|
||||||
|
fp.write('mineru-rocm-runtime\n')
|
||||||
|
with open(os.path.join(dist_info, 'entry_points.txt'), 'w') as fp:
|
||||||
|
fp.write(
|
||||||
|
'[vllm.platform_plugins]\n'
|
||||||
|
'rocm = vllm.platforms.rocm:rocm_platform_plugin\n'
|
||||||
|
)
|
||||||
|
with open(os.path.join(dist_info, 'RECORD'), 'w') as fp:
|
||||||
|
fp.write('')
|
||||||
|
print(f'vllm dist-info ensured: {dist_info}')
|
||||||
|
|
||||||
|
|
||||||
def ensure_vllm_installed():
|
def ensure_vllm_installed():
|
||||||
"""确保 vLLM Python 包在当前虚拟环境中可导入。
|
"""确保 vLLM Python 包在当前虚拟环境中可导入。
|
||||||
|
|
||||||
@@ -94,9 +158,16 @@ def main():
|
|||||||
patch7_rocm_break_import_cycle()
|
patch7_rocm_break_import_cycle()
|
||||||
try:
|
try:
|
||||||
ensure_vllm_installed()
|
ensure_vllm_installed()
|
||||||
|
ensure_vllm_dist_info()
|
||||||
import vllm
|
import vllm
|
||||||
from vllm.platforms import current_platform
|
from vllm.platforms import current_platform
|
||||||
print(f'vllm runtime import OK: {vllm.__version__}, platform={type(current_platform).__name__}')
|
print(f'vllm runtime import OK: {vllm.__version__}, platform={type(current_platform).__name__}')
|
||||||
|
if type(current_platform).__name__ == 'UnspecifiedPlatform':
|
||||||
|
raise RuntimeError(
|
||||||
|
'vLLM platform detection returned UnspecifiedPlatform; '
|
||||||
|
'ROCm backend is not usable. Check amdsmi, /dev/kfd, /dev/dri, '
|
||||||
|
'and vllm.platform_plugins metadata.'
|
||||||
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
print('ERROR: vllm runtime import failed after platform patches:')
|
print('ERROR: vllm runtime import failed after platform patches:')
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|||||||
Reference in New Issue
Block a user