test_models.sh 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #!/bin/bash
  2. # SGLang 多模型 curl 测试脚本
  3. # 移除 set -e,避免遇到错误就终止
  4. # 颜色定义
  5. GREEN='\033[0;32m'
  6. RED='\033[0;31m'
  7. YELLOW='\033[1;33m'
  8. NC='\033[0m'
  9. # 模型配置(按顺序定义)
  10. MODEL_NAMES=("qwen3-8b" "qwen3.5-35b" "qwen3.5-122b" "qwen3-embedding-8b" "qwen3-reranker-8b")
  11. declare -A MODEL_PORTS=(
  12. ["qwen3-8b"]="25424"
  13. ["qwen3.5-35b"]="25427"
  14. ["qwen3.5-122b"]="25423"
  15. ["qwen3-embedding-8b"]="25425"
  16. ["qwen3-reranker-8b"]="25426"
  17. )
  18. declare -A MODEL_PATHS=(
  19. ["qwen3-8b"]="/model/Qwen3-8B"
  20. ["qwen3.5-35b"]="/model/Qwen3.5-35B-A3B"
  21. ["qwen3.5-122b"]="/model/Qwen3.5-122B-A10B"
  22. ["qwen3-embedding-8b"]="/model/Qwen3-Embedding-8B"
  23. ["qwen3-reranker-8b"]="/model/Qwen3-Reranker-8B"
  24. )
  25. declare -A MODEL_TYPES=(
  26. ["qwen3-8b"]="chat"
  27. ["qwen3.5-35b"]="chat"
  28. ["qwen3.5-122b"]="chat"
  29. ["qwen3-embedding-8b"]="embedding"
  30. ["qwen3-reranker-8b"]="rerank"
  31. )
  32. API_KEY="lq123456"
  33. TIMEOUT=30
  34. echo "========================================"
  35. echo "SGLang 多模型健康检查 (curl)"
  36. echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
  37. echo "========================================"
  38. TOTAL=0
  39. SUCCESS=0
  40. # 测试对话模型
  41. test_chat_model() {
  42. local name=$1
  43. local port=$2
  44. local model_path=$3
  45. echo ""
  46. echo "----------------------------------------"
  47. echo "测试模型: $name (对话模型)"
  48. echo "端口: $port"
  49. echo "----------------------------------------"
  50. local response
  51. local body
  52. local code
  53. response=$(curl -s -w "\n%{http_code}" \
  54. --max-time $TIMEOUT \
  55. -H "Content-Type: application/json" \
  56. -H "Authorization: Bearer $API_KEY" \
  57. -d "{
  58. \"model\": \"$model_path\",
  59. \"messages\": [{\"role\": \"user\", \"content\": \"你好,请用一句话介绍自己\"}],
  60. \"temperature\": 0.7,
  61. \"max_tokens\": 50
  62. }" \
  63. "http://localhost:$port/v1/chat/completions" 2>/dev/null || echo -e "\n000")
  64. body=$(echo "$response" | head -n -1)
  65. code=$(echo "$response" | tail -n 1)
  66. if [ "$code" = "200" ]; then
  67. local content=$(echo "$body" | grep -o '"content":"[^"]*"' | head -1 | cut -d'"' -f4)
  68. echo -e "${GREEN}✅ 成功${NC} HTTP $code"
  69. echo "回复: ${content:0:100}..."
  70. ((SUCCESS++))
  71. else
  72. echo -e "${RED}❌ 失败${NC} HTTP $code"
  73. echo "响应: ${body:0:200}"
  74. fi
  75. ((TOTAL++))
  76. }
  77. # 测试嵌入模型
  78. test_embedding_model() {
  79. local name=$1
  80. local port=$2
  81. local model_path=$3
  82. echo ""
  83. echo "----------------------------------------"
  84. echo "测试模型: $name (嵌入模型)"
  85. echo "端口: $port"
  86. echo "----------------------------------------"
  87. local response
  88. local body
  89. local code
  90. response=$(curl -s -w "\n%{http_code}" \
  91. --max-time $TIMEOUT \
  92. -H "Content-Type: application/json" \
  93. -H "Authorization: Bearer $API_KEY" \
  94. -d "{
  95. \"model\": \"$model_path\",
  96. \"input\": [\"你好,这是一个测试句子\", \"Hello world\"]
  97. }" \
  98. "http://localhost:$port/v1/embeddings" 2>/dev/null || echo -e "\n000")
  99. body=$(echo "$response" | head -n -1)
  100. code=$(echo "$response" | tail -n 1)
  101. if [ "$code" = "200" ]; then
  102. local dims=$(echo "$body" | grep -o '"embedding":\[[^]]*\]' | head -1 | grep -o ',' | wc -l)
  103. dims=$((dims + 1))
  104. echo -e "${GREEN}✅ 成功${NC} HTTP $code"
  105. echo "向量维度: $dims"
  106. ((SUCCESS++))
  107. else
  108. echo -e "${YELLOW}⚠️ Embedding 接口失败,尝试 Rerank 接口...${NC}"
  109. response=$(curl -s -w "\n%{http_code}" \
  110. --max-time $TIMEOUT \
  111. -H "Content-Type: application/json" \
  112. -H "Authorization: Bearer $API_KEY" \
  113. -d "{
  114. \"model\": \"$model_path\",
  115. \"query\": \"测试查询\",
  116. \"documents\": [\"文档1\", \"文档2\"]
  117. }" \
  118. "http://localhost:$port/v1/rerank" 2>/dev/null || echo -e "\n000")
  119. code=$(echo "$response" | tail -n 1)
  120. if [ "$code" = "200" ]; then
  121. echo -e "${GREEN}✅ 成功${NC} (Rerank 接口可用)"
  122. ((SUCCESS++))
  123. else
  124. echo -e "${RED}❌ 失败${NC} HTTP $code"
  125. fi
  126. fi
  127. ((TOTAL++))
  128. }
  129. # 测试重排序模型
  130. test_rerank_model() {
  131. local name=$1
  132. local port=$2
  133. local model_path=$3
  134. echo ""
  135. echo "----------------------------------------"
  136. echo "测试模型: $name (重排序模型)"
  137. echo "端口: $port"
  138. echo "----------------------------------------"
  139. local response
  140. local body
  141. local code
  142. response=$(curl -s -w "\n%{http_code}" \
  143. --max-time $TIMEOUT \
  144. -H "Content-Type: application/json" \
  145. -H "Authorization: Bearer $API_KEY" \
  146. -d "{
  147. \"model\": \"$model_path\",
  148. \"query\": \"什么是机器学习\",
  149. \"documents\": [\"机器学习是AI的分支\", \"Python是编程语言\", \"深度学习使用神经网络\"],
  150. \"top_n\": 2
  151. }" \
  152. "http://localhost:$port/v1/rerank" 2>/dev/null || echo -e "\n000")
  153. body=$(echo "$response" | head -n -1)
  154. code=$(echo "$response" | tail -n 1)
  155. if [ "$code" = "200" ]; then
  156. local top_doc=$(echo "$body" | grep -o '"text":"[^"]*"' | head -1 | cut -d'"' -f4)
  157. local score=$(echo "$body" | grep -o '"relevance_score":[0-9.]*' | head -1 | cut -d':' -f2)
  158. echo -e "${GREEN}✅ 成功${NC} HTTP $code"
  159. echo "Top1: ${top_doc:0:50}... (得分: $score)"
  160. ((SUCCESS++))
  161. else
  162. echo -e "${YELLOW}⚠️ Rerank 接口失败,尝试 Chat 接口...${NC}"
  163. response=$(curl -s -w "\n%{http_code}" \
  164. --max-time $TIMEOUT \
  165. -H "Content-Type: application/json" \
  166. -H "Authorization: Bearer $API_KEY" \
  167. -d "{
  168. \"model\": \"$model_path\",
  169. \"messages\": [{\"role\": \"user\", \"content\": \"你好\"}],
  170. \"max_tokens\": 20
  171. }" \
  172. "http://localhost:$port/v1/chat/completions" 2>/dev/null || echo -e "\n000")
  173. code=$(echo "$response" | tail -n 1)
  174. if [ "$code" = "200" ]; then
  175. echo -e "${GREEN}✅ 成功${NC} (Chat 接口可用)"
  176. ((SUCCESS++))
  177. else
  178. echo -e "${RED}❌ 失败${NC} HTTP $code"
  179. fi
  180. fi
  181. ((TOTAL++))
  182. }
  183. # 快速检查
  184. quick_check() {
  185. echo ""
  186. echo "========================================"
  187. echo "快速检查模式"
  188. echo "========================================"
  189. for key in "${MODEL_NAMES[@]}"; do
  190. local port=${MODEL_PORTS[$key]}
  191. local code
  192. code=$(curl -s -o /dev/null -w "%{http_code}" \
  193. --max-time 5 \
  194. -H "Authorization: Bearer $API_KEY" \
  195. "http://localhost:$port/v1/models" 2>/dev/null || echo "000")
  196. if [ "$code" = "200" ]; then
  197. echo -e "${GREEN}✅${NC} $key (端口 $port)"
  198. ((SUCCESS++))
  199. else
  200. echo -e "${RED}❌${NC} $key (端口 $port) HTTP $code"
  201. fi
  202. ((TOTAL++))
  203. done
  204. }
  205. # 主函数
  206. main() {
  207. if [ "$1" = "--quick" ]; then
  208. quick_check
  209. elif [ "$1" = "--model" ] && [ -n "$2" ]; then
  210. local key=$2
  211. local port=${MODEL_PORTS[$key]}
  212. local path=${MODEL_PATHS[$key]}
  213. local mtype=${MODEL_TYPES[$key]}
  214. case $mtype in
  215. chat) test_chat_model "$key" "$port" "$path" ;;
  216. embedding) test_embedding_model "$key" "$port" "$path" ;;
  217. rerank) test_rerank_model "$key" "$port" "$path" ;;
  218. esac
  219. else
  220. # 按顺序测试所有模型
  221. for key in "${MODEL_NAMES[@]}"; do
  222. local port=${MODEL_PORTS[$key]}
  223. local path=${MODEL_PATHS[$key]}
  224. local mtype=${MODEL_TYPES[$key]}
  225. case $mtype in
  226. chat) test_chat_model "$key" "$port" "$path" ;;
  227. embedding) test_embedding_model "$key" "$port" "$path" ;;
  228. rerank) test_rerank_model "$key" "$port" "$path" ;;
  229. esac
  230. done
  231. fi
  232. echo ""
  233. echo "========================================"
  234. echo "测试结果摘要"
  235. echo "========================================"
  236. echo "总计: $SUCCESS / $TOTAL 个模型正常"
  237. if [ $SUCCESS -eq $TOTAL ]; then
  238. echo -e "${GREEN}所有模型运行正常!${NC}"
  239. exit 0
  240. else
  241. echo -e "${RED}部分模型异常,请检查日志${NC}"
  242. exit 1
  243. fi
  244. }
  245. main "$@"