start_inference.sh 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #!/bin/bash
  2. # MinerU 推理服务启动脚本 (vLLM)
  3. # 1. 环境配置
  4. export MINERU_LMDEPLOY_DEVICE=ascend
  5. export MINERU_MODEL_SOURCE=modelscope
  6. export VLLM_WORKER_MULTIPROC_METHOD=spawn
  7. export MINERU_OPENAI_PORT=30000
  8. # 日志配置
  9. LOG_DIR="/var/log/minerU"
  10. LOG_FILE="${LOG_DIR}/mineru-openai.log"
  11. echo "=========================================="
  12. echo "🚀 正在启动 MinerU 推理服务 (vLLM)..."
  13. echo "📍 端口: ${MINERU_OPENAI_PORT}"
  14. echo "📂 日志: ${LOG_FILE}"
  15. echo "=========================================="
  16. # 确保日志目录存在
  17. mkdir -p "${LOG_DIR}"
  18. # 2. 检查并清理端口占用
  19. python3 -c "
  20. import os, glob
  21. def cleanup(port):
  22. port_hex = f'{port:04X}'
  23. inodes = set()
  24. for net_file in ['/proc/net/tcp', '/proc/net/tcp6']:
  25. if os.path.exists(net_file):
  26. with open(net_file, 'r') as f:
  27. for line in f:
  28. parts = line.split()
  29. if len(parts) > 1 and parts[1].endswith(':' + port_hex): inodes.add(parts[9])
  30. if not inodes: return
  31. for fd_dir in glob.glob('/proc/[0-9]*/fd'):
  32. try:
  33. for fd in os.listdir(fd_dir):
  34. try:
  35. link = os.readlink(os.path.join(fd_dir, fd))
  36. for inode in inodes:
  37. if f'socket:[{inode}]' in link:
  38. pid = fd_dir.split('/')[2]
  39. if int(pid) != os.getpid():
  40. print(f' ⚠️ 清理占用端口 {port} 的进程 {pid}...')
  41. os.kill(int(pid), 9)
  42. except: continue
  43. except: continue
  44. cleanup(${MINERU_OPENAI_PORT})
  45. "
  46. # 3. 启动服务 (使用 nohup 确保后台运行)
  47. echo "--- 启动于 $(date) ---" > "${LOG_FILE}"
  48. nohup mineru-openai-server >> "${LOG_FILE}" 2>&1 &
  49. # 分离进程,防止终端退出影响服务
  50. disown
  51. echo "=========================================="
  52. echo "✅ 推理服务已在后台启动!"
  53. echo "📄 查看日志: tail -f ${LOG_FILE}"
  54. echo "=========================================="