ppstructure_v3_daemon.sh 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #!/bin/bash
  2. # filepath: ocr_platform/ocr_tools/daemons/ppstructure_v3_daemon.sh
  3. # 对应客户端工具: ocr_tools/ppstructure_tool/api_client.py
  4. # PaddleX PP-StructureV3 服务守护进程脚本
  5. LOGDIR="/home/ubuntu/zhch/logs"
  6. mkdir -p $LOGDIR
  7. PIDFILE="$LOGDIR/ppstructurev3.pid"
  8. LOGFILE="$LOGDIR/ppstructurev3.log"
  9. # 配置参数
  10. CONDA_ENV="paddle" # 根据您的study-notes.md中的环境名
  11. PORT="8111"
  12. CUDA_VISIBLE_DEVICES=7
  13. # 脚本和配置路径
  14. # 方式1:使用迁移后的路径(推荐)
  15. PADDLE_COMMON_DIR="/path/to/ocr_platform/ocr_tools/paddle_common"
  16. # 方式2:使用原始路径(如果尚未迁移)
  17. # PADDLE_COMMON_DIR="/home/ubuntu/zhch/PaddleX/zhch"
  18. # Pipeline 配置文件路径
  19. # 可以使用 ocr_tools/paddle_common/config/ 中的配置文件(推荐)
  20. PIPELINE_CONFIG="$PADDLE_COMMON_DIR/config/PP-StructureV3.yaml"
  21. # 或者使用原始配置路径(如果尚未迁移):
  22. # PIPELINE_CONFIG="/home/ubuntu/zhch/PaddleX/zhch/my_config/PP-StructureV3.yaml"
  23. # PIPELINE_CONFIG="$PADDLE_COMMON_DIR/config/PP-StructureV3-RT-DETR-H_layout_17cls.yaml"
  24. # start_paddlex_with_adapter.py 脚本路径
  25. START_SCRIPT="$PADDLE_COMMON_DIR/start_paddlex_with_adapter.py"
  26. # 正确初始化和激活conda环境
  27. # 方法1:使用conda.sh脚本初始化
  28. if [ -f "/home/ubuntu/anaconda3/etc/profile.d/conda.sh" ]; then
  29. source /home/ubuntu/anaconda3/etc/profile.d/conda.sh
  30. conda activate $CONDA_ENV
  31. elif [ -f "/opt/conda/etc/profile.d/conda.sh" ]; then
  32. source /opt/conda/etc/profile.d/conda.sh
  33. conda activate $CONDA_ENV
  34. else
  35. # 方法2:直接使用conda可执行文件路径
  36. echo "Warning: Using direct conda path activation"
  37. export PATH="/home/ubuntu/anaconda3/envs/$CONDA_ENV/bin:$PATH"
  38. fi
  39. # 设置模型下载源(可选)
  40. export PADDLE_PDX_MODEL_SOURCE="bos"
  41. export PADDLEX_ENABLE_ADAPTER="true"
  42. export PYTHONWARNINGS="ignore::UserWarning"
  43. start() {
  44. if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then
  45. echo "PaddleX PP-StructureV3 is already running"
  46. return 1
  47. fi
  48. echo "Starting PaddleX PP-StructureV3 daemon..."
  49. echo "Port: $PORT"
  50. echo "CUDA Devices: $CUDA_VISIBLE_DEVICES"
  51. echo "Pipeline config: $PIPELINE_CONFIG"
  52. # 检查配置文件是否存在
  53. if [ ! -f "$PIPELINE_CONFIG" ]; then
  54. echo "❌ Pipeline config file not found: $PIPELINE_CONFIG"
  55. return 1
  56. fi
  57. # 检查conda环境
  58. if ! command -v python >/dev/null 2>&1; then
  59. echo "❌ Python not found. Check conda environment activation."
  60. return 1
  61. fi
  62. # 检查paddlex命令
  63. if ! command -v paddlex >/dev/null 2>&1; then
  64. echo "❌ PaddleX not found. Check installation and environment."
  65. return 1
  66. fi
  67. echo "🔧 Using Python: $(which python)"
  68. echo "🔧 Using PaddleX: $(which paddlex)"
  69. echo " CUDA Devices: $CUDA_VISIBLE_DEVICES"
  70. # 检查 start_paddlex_with_adapter.py 是否存在
  71. if [ ! -f "$START_SCRIPT" ]; then
  72. echo "❌ start_paddlex_with_adapter.py not found: $START_SCRIPT"
  73. echo "Please update PADDLE_COMMON_DIR in the script to point to the correct location"
  74. return 1
  75. fi
  76. # 启动PaddleX服务
  77. # 切换到脚本所在目录,确保相对路径正确
  78. cd "$(dirname "$START_SCRIPT")" || exit 1
  79. CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES nohup python3 "$START_SCRIPT" --serve \
  80. --port $PORT \
  81. --device "gpu" \
  82. --pipeline "$PIPELINE_CONFIG" \
  83. > $LOGFILE 2>&1 &
  84. echo $! > $PIDFILE
  85. echo "✅ PaddleX PP-StructureV3 started with PID: $(cat $PIDFILE)"
  86. echo "📋 Log file: $LOGFILE"
  87. echo "🌐 Service URL: http://localhost:$PORT"
  88. echo "🌐 API Endpoint: http://localhost:$PORT/layout-parsing"
  89. echo "📖 API Documentation: http://localhost:$PORT/docs"
  90. }
  91. stop() {
  92. if [ ! -f $PIDFILE ]; then
  93. echo "PaddleX PP-StructureV3 is not running"
  94. return 1
  95. fi
  96. PID=$(cat $PIDFILE)
  97. echo "Stopping PaddleX PP-StructureV3 (PID: $PID)..."
  98. # 优雅停止
  99. kill $PID
  100. # 等待进程结束
  101. for i in {1..10}; do
  102. if ! kill -0 $PID 2>/dev/null; then
  103. break
  104. fi
  105. echo "Waiting for process to stop... ($i/10)"
  106. sleep 1
  107. done
  108. # 如果进程仍在运行,强制结束
  109. if kill -0 $PID 2>/dev/null; then
  110. echo "Force killing process..."
  111. kill -9 $PID
  112. fi
  113. rm -f $PIDFILE
  114. echo "✅ PaddleX PP-StructureV3 stopped"
  115. }
  116. status() {
  117. if [ -f $PIDFILE ] && kill -0 $(cat $PIDFILE) 2>/dev/null; then
  118. PID=$(cat $PIDFILE)
  119. echo "✅ PaddleX PP-StructureV3 is running (PID: $PID)"
  120. echo "🌐 Service URL: http://localhost:$PORT"
  121. echo "🌐 API Endpoint: http://localhost:$PORT/layout-parsing"
  122. echo "📋 Log file: $LOGFILE"
  123. # 检查端口是否被监听
  124. if command -v ss >/dev/null 2>&1; then
  125. if ss -tuln | grep -q ":$PORT "; then
  126. echo "🔗 Port $PORT is being listened"
  127. else
  128. echo "⚠️ Port $PORT is not being listened (service may be starting up)"
  129. fi
  130. elif command -v netstat >/dev/null 2>&1; then
  131. if netstat -tuln | grep -q ":$PORT "; then
  132. echo "🔗 Port $PORT is being listened"
  133. else
  134. echo "⚠️ Port $PORT is not being listened (service may be starting up)"
  135. fi
  136. fi
  137. # 检查API响应
  138. if command -v curl >/dev/null 2>&1; then
  139. if curl -s --connect-timeout 2 http://127.0.0.1:$PORT/layout-parsing > /dev/null 2>&1; then
  140. echo "🎯 API 响应正常"
  141. else
  142. echo "⚠️ API 无响应 (service may be starting up)"
  143. fi
  144. fi
  145. # 显示最新日志
  146. if [ -f $LOGFILE ]; then
  147. echo "📄 Latest logs (last 5 lines):"
  148. tail -5 $LOGFILE | sed 's/^/ /'
  149. fi
  150. else
  151. echo "❌ PaddleX PP-StructureV3 is not running"
  152. if [ -f $PIDFILE ]; then
  153. echo "Removing stale PID file..."
  154. rm -f $PIDFILE
  155. fi
  156. fi
  157. }
  158. logs() {
  159. if [ -f $LOGFILE ]; then
  160. echo "📄 PaddleX PP-StructureV3 logs:"
  161. echo "=================="
  162. tail -f $LOGFILE
  163. else
  164. echo "❌ Log file not found: $LOGFILE"
  165. fi
  166. }
  167. config() {
  168. echo "📋 Current configuration:"
  169. echo " Conda Environment: $CONDA_ENV"
  170. echo " Port: $PORT"
  171. echo " CUDA Visible Devices: $CUDA_VISIBLE_DEVICES"
  172. echo " Pipeline Config: $PIPELINE_CONFIG"
  173. echo " Paddle Common Directory: $PADDLE_COMMON_DIR"
  174. echo " Start Script: $START_SCRIPT"
  175. echo " Model Source: ${PADDLE_PDX_MODEL_SOURCE:-default}"
  176. echo " PID File: $PIDFILE"
  177. echo " Log File: $LOGFILE"
  178. if [ -f "$PIPELINE_CONFIG" ]; then
  179. echo "✅ Pipeline config file exists"
  180. else
  181. echo "❌ Pipeline config file not found: $PIPELINE_CONFIG"
  182. fi
  183. # 检查 start_paddlex_with_adapter.py 是否存在
  184. if [ -f "$START_SCRIPT" ]; then
  185. echo "✅ start_paddlex_with_adapter.py exists"
  186. else
  187. echo "❌ start_paddlex_with_adapter.py not found: $START_SCRIPT"
  188. echo " Please update PADDLE_COMMON_DIR in the script"
  189. fi
  190. # 显示环境信息
  191. echo ""
  192. echo "🔧 Environment:"
  193. echo " Python: $(which python 2>/dev/null || echo 'Not found')"
  194. echo " PaddleX: $(which paddlex 2>/dev/null || echo 'Not found')"
  195. echo " Conda: $(which conda 2>/dev/null || echo 'Not found')"
  196. }
  197. # 显示使用帮助
  198. usage() {
  199. echo "PaddleX PP-StructureV3 Service Daemon"
  200. echo "======================================"
  201. echo "Usage: $0 {start|stop|restart|status|logs|config}"
  202. echo ""
  203. echo "Commands:"
  204. echo " start - Start the PaddleX PP-StructureV3 service"
  205. echo " stop - Stop the PaddleX PP-StructureV3 service"
  206. echo " restart - Restart the PaddleX PP-StructureV3 service"
  207. echo " status - Show service status"
  208. echo " logs - Show service logs (follow mode)"
  209. echo " config - Show current configuration"
  210. echo ""
  211. echo "Configuration (edit script to modify):"
  212. echo " Port: $PORT"
  213. echo " CUDA Devices: $CUDA_VISIBLE_DEVICES"
  214. echo " Pipeline: $PIPELINE_CONFIG"
  215. echo ""
  216. echo "Examples:"
  217. echo " ./ppstructure_v3_daemon.sh start"
  218. echo " ./ppstructure_v3_daemon.sh status"
  219. echo " ./ppstructure_v3_daemon.sh logs"
  220. }
  221. case "$1" in
  222. start)
  223. start
  224. ;;
  225. stop)
  226. stop
  227. ;;
  228. restart)
  229. stop
  230. sleep 3
  231. start
  232. ;;
  233. status)
  234. status
  235. ;;
  236. logs)
  237. logs
  238. ;;
  239. config)
  240. config
  241. ;;
  242. *)
  243. usage
  244. exit 1
  245. ;;
  246. esac