x
This commit is contained in:
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)"
|
||||
fi
|
||||
|
||||
# 确保 vllm 源码目录在 PYTHONPATH 中
|
||||
# patch_vllm_platform.py 中的 os.environ 修改不持久化到父进程
|
||||
# 这里无条件导出,防止 editable install 被破坏后 vllm 无法导入
|
||||
export PYTHONPATH="/opt/vllm:${PYTHONPATH}"
|
||||
|
||||
echo "[entrypoint] starting: $*"
|
||||
exec "$@"
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import sysconfig
|
||||
import traceback
|
||||
|
||||
VLLM_DIR = '/opt/vllm/vllm'
|
||||
@@ -38,26 +40,88 @@ def patch6_init_platform_fallback():
|
||||
def patch7_rocm_break_import_cycle():
|
||||
"""补丁 7:platforms/rocm.py —— logger.warning_once → sys.stderr.write
|
||||
|
||||
这个补丁会直接改写 vLLM 源码中的函数调用。部分 vLLM 版本里
|
||||
logger.warning_once(...) 参数不一定兼容 sys.stderr.write(...),改写后可能
|
||||
导致 import vllm / import vllm.platforms.rocm 失败。MinerU 会把这种导入失败
|
||||
包装成 "Please install vllm",因此默认禁用,只在显式设置环境变量时启用。
|
||||
默认启用安全的“整段 except 块”替换,避免 logger.warning_once() 在平台检测
|
||||
期间触发循环导入,导致 current_platform 落到 UnspecifiedPlatform。
|
||||
如需禁用,设置 VLLM_PATCH_ROCM_WARNING_ONCE=0。
|
||||
"""
|
||||
if os.environ.get('VLLM_PATCH_ROCM_WARNING_ONCE') != '1':
|
||||
print('Patch 7: skipped (set VLLM_PATCH_ROCM_WARNING_ONCE=1 to enable).')
|
||||
if os.environ.get('VLLM_PATCH_ROCM_WARNING_ONCE') == '0':
|
||||
print('Patch 7: skipped (VLLM_PATCH_ROCM_WARNING_ONCE=0).')
|
||||
return
|
||||
f = os.path.join(VLLM_DIR, 'platforms', 'rocm.py')
|
||||
c = open(f).read()
|
||||
old = 'logger.warning_once('
|
||||
new = 'import sys as _sys\n _sys.stderr.write('
|
||||
c2 = c.replace(old, new)
|
||||
if 'amdsmi unavailable, using torch.cuda fallback' in c:
|
||||
print('Patch 7: already applied.')
|
||||
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:
|
||||
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:
|
||||
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():
|
||||
"""确保 vLLM Python 包在当前虚拟环境中可导入。
|
||||
|
||||
@@ -94,9 +158,16 @@ def main():
|
||||
patch7_rocm_break_import_cycle()
|
||||
try:
|
||||
ensure_vllm_installed()
|
||||
ensure_vllm_dist_info()
|
||||
import vllm
|
||||
from vllm.platforms import current_platform
|
||||
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:
|
||||
print('ERROR: vllm runtime import failed after platform patches:')
|
||||
traceback.print_exc()
|
||||
|
||||
Reference in New Issue
Block a user