|
|
@@ -0,0 +1,284 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+# SGLang 多模型 curl 测试脚本
|
|
|
+# 移除 set -e,避免遇到错误就终止
|
|
|
+
|
|
|
+# 颜色定义
|
|
|
+GREEN='\033[0;32m'
|
|
|
+RED='\033[0;31m'
|
|
|
+YELLOW='\033[1;33m'
|
|
|
+NC='\033[0m'
|
|
|
+
|
|
|
+# 模型配置(按顺序定义)
|
|
|
+MODEL_NAMES=("qwen3-8b" "qwen3.5-35b" "qwen3.5-122b" "qwen3-embedding-8b" "qwen3-reranker-8b")
|
|
|
+
|
|
|
+declare -A MODEL_PORTS=(
|
|
|
+ ["qwen3-8b"]="25424"
|
|
|
+ ["qwen3.5-35b"]="25427"
|
|
|
+ ["qwen3.5-122b"]="25423"
|
|
|
+ ["qwen3-embedding-8b"]="25425"
|
|
|
+ ["qwen3-reranker-8b"]="25426"
|
|
|
+)
|
|
|
+
|
|
|
+declare -A MODEL_PATHS=(
|
|
|
+ ["qwen3-8b"]="/model/Qwen3-8B"
|
|
|
+ ["qwen3.5-35b"]="/model/Qwen3.5-35B-A3B"
|
|
|
+ ["qwen3.5-122b"]="/model/Qwen3.5-122B-A10B"
|
|
|
+ ["qwen3-embedding-8b"]="/model/Qwen3-Embedding-8B"
|
|
|
+ ["qwen3-reranker-8b"]="/model/Qwen3-Reranker-8B"
|
|
|
+)
|
|
|
+
|
|
|
+declare -A MODEL_TYPES=(
|
|
|
+ ["qwen3-8b"]="chat"
|
|
|
+ ["qwen3.5-35b"]="chat"
|
|
|
+ ["qwen3.5-122b"]="chat"
|
|
|
+ ["qwen3-embedding-8b"]="embedding"
|
|
|
+ ["qwen3-reranker-8b"]="rerank"
|
|
|
+)
|
|
|
+
|
|
|
+API_KEY="lq123456"
|
|
|
+TIMEOUT=30
|
|
|
+
|
|
|
+echo "========================================"
|
|
|
+echo "SGLang 多模型健康检查 (curl)"
|
|
|
+echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
|
+echo "========================================"
|
|
|
+
|
|
|
+TOTAL=0
|
|
|
+SUCCESS=0
|
|
|
+
|
|
|
+# 测试对话模型
|
|
|
+test_chat_model() {
|
|
|
+ local name=$1
|
|
|
+ local port=$2
|
|
|
+ local model_path=$3
|
|
|
+
|
|
|
+ echo ""
|
|
|
+ echo "----------------------------------------"
|
|
|
+ echo "测试模型: $name (对话模型)"
|
|
|
+ echo "端口: $port"
|
|
|
+ echo "----------------------------------------"
|
|
|
+
|
|
|
+ local response
|
|
|
+ local body
|
|
|
+ local code
|
|
|
+
|
|
|
+ response=$(curl -s -w "\n%{http_code}" \
|
|
|
+ --max-time $TIMEOUT \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -H "Authorization: Bearer $API_KEY" \
|
|
|
+ -d "{
|
|
|
+ \"model\": \"$model_path\",
|
|
|
+ \"messages\": [{\"role\": \"user\", \"content\": \"你好,请用一句话介绍自己\"}],
|
|
|
+ \"temperature\": 0.7,
|
|
|
+ \"max_tokens\": 50
|
|
|
+ }" \
|
|
|
+ "http://localhost:$port/v1/chat/completions" 2>/dev/null || echo -e "\n000")
|
|
|
+
|
|
|
+ body=$(echo "$response" | head -n -1)
|
|
|
+ code=$(echo "$response" | tail -n 1)
|
|
|
+
|
|
|
+ if [ "$code" = "200" ]; then
|
|
|
+ local content=$(echo "$body" | grep -o '"content":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
|
+ echo -e "${GREEN}✅ 成功${NC} HTTP $code"
|
|
|
+ echo "回复: ${content:0:100}..."
|
|
|
+ ((SUCCESS++))
|
|
|
+ else
|
|
|
+ echo -e "${RED}❌ 失败${NC} HTTP $code"
|
|
|
+ echo "响应: ${body:0:200}"
|
|
|
+ fi
|
|
|
+ ((TOTAL++))
|
|
|
+}
|
|
|
+
|
|
|
+# 测试嵌入模型
|
|
|
+test_embedding_model() {
|
|
|
+ local name=$1
|
|
|
+ local port=$2
|
|
|
+ local model_path=$3
|
|
|
+
|
|
|
+ echo ""
|
|
|
+ echo "----------------------------------------"
|
|
|
+ echo "测试模型: $name (嵌入模型)"
|
|
|
+ echo "端口: $port"
|
|
|
+ echo "----------------------------------------"
|
|
|
+
|
|
|
+ local response
|
|
|
+ local body
|
|
|
+ local code
|
|
|
+
|
|
|
+ response=$(curl -s -w "\n%{http_code}" \
|
|
|
+ --max-time $TIMEOUT \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -H "Authorization: Bearer $API_KEY" \
|
|
|
+ -d "{
|
|
|
+ \"model\": \"$model_path\",
|
|
|
+ \"input\": [\"你好,这是一个测试句子\", \"Hello world\"]
|
|
|
+ }" \
|
|
|
+ "http://localhost:$port/v1/embeddings" 2>/dev/null || echo -e "\n000")
|
|
|
+
|
|
|
+ body=$(echo "$response" | head -n -1)
|
|
|
+ code=$(echo "$response" | tail -n 1)
|
|
|
+
|
|
|
+ if [ "$code" = "200" ]; then
|
|
|
+ local dims=$(echo "$body" | grep -o '"embedding":\[[^]]*\]' | head -1 | grep -o ',' | wc -l)
|
|
|
+ dims=$((dims + 1))
|
|
|
+ echo -e "${GREEN}✅ 成功${NC} HTTP $code"
|
|
|
+ echo "向量维度: $dims"
|
|
|
+ ((SUCCESS++))
|
|
|
+ else
|
|
|
+ echo -e "${YELLOW}⚠️ Embedding 接口失败,尝试 Rerank 接口...${NC}"
|
|
|
+ response=$(curl -s -w "\n%{http_code}" \
|
|
|
+ --max-time $TIMEOUT \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -H "Authorization: Bearer $API_KEY" \
|
|
|
+ -d "{
|
|
|
+ \"model\": \"$model_path\",
|
|
|
+ \"query\": \"测试查询\",
|
|
|
+ \"documents\": [\"文档1\", \"文档2\"]
|
|
|
+ }" \
|
|
|
+ "http://localhost:$port/v1/rerank" 2>/dev/null || echo -e "\n000")
|
|
|
+
|
|
|
+ code=$(echo "$response" | tail -n 1)
|
|
|
+ if [ "$code" = "200" ]; then
|
|
|
+ echo -e "${GREEN}✅ 成功${NC} (Rerank 接口可用)"
|
|
|
+ ((SUCCESS++))
|
|
|
+ else
|
|
|
+ echo -e "${RED}❌ 失败${NC} HTTP $code"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ ((TOTAL++))
|
|
|
+}
|
|
|
+
|
|
|
+# 测试重排序模型
|
|
|
+test_rerank_model() {
|
|
|
+ local name=$1
|
|
|
+ local port=$2
|
|
|
+ local model_path=$3
|
|
|
+
|
|
|
+ echo ""
|
|
|
+ echo "----------------------------------------"
|
|
|
+ echo "测试模型: $name (重排序模型)"
|
|
|
+ echo "端口: $port"
|
|
|
+ echo "----------------------------------------"
|
|
|
+
|
|
|
+ local response
|
|
|
+ local body
|
|
|
+ local code
|
|
|
+
|
|
|
+ response=$(curl -s -w "\n%{http_code}" \
|
|
|
+ --max-time $TIMEOUT \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -H "Authorization: Bearer $API_KEY" \
|
|
|
+ -d "{
|
|
|
+ \"model\": \"$model_path\",
|
|
|
+ \"query\": \"什么是机器学习\",
|
|
|
+ \"documents\": [\"机器学习是AI的分支\", \"Python是编程语言\", \"深度学习使用神经网络\"],
|
|
|
+ \"top_n\": 2
|
|
|
+ }" \
|
|
|
+ "http://localhost:$port/v1/rerank" 2>/dev/null || echo -e "\n000")
|
|
|
+
|
|
|
+ body=$(echo "$response" | head -n -1)
|
|
|
+ code=$(echo "$response" | tail -n 1)
|
|
|
+
|
|
|
+ if [ "$code" = "200" ]; then
|
|
|
+ local top_doc=$(echo "$body" | grep -o '"text":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
|
+ local score=$(echo "$body" | grep -o '"relevance_score":[0-9.]*' | head -1 | cut -d':' -f2)
|
|
|
+ echo -e "${GREEN}✅ 成功${NC} HTTP $code"
|
|
|
+ echo "Top1: ${top_doc:0:50}... (得分: $score)"
|
|
|
+ ((SUCCESS++))
|
|
|
+ else
|
|
|
+ echo -e "${YELLOW}⚠️ Rerank 接口失败,尝试 Chat 接口...${NC}"
|
|
|
+ response=$(curl -s -w "\n%{http_code}" \
|
|
|
+ --max-time $TIMEOUT \
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
+ -H "Authorization: Bearer $API_KEY" \
|
|
|
+ -d "{
|
|
|
+ \"model\": \"$model_path\",
|
|
|
+ \"messages\": [{\"role\": \"user\", \"content\": \"你好\"}],
|
|
|
+ \"max_tokens\": 20
|
|
|
+ }" \
|
|
|
+ "http://localhost:$port/v1/chat/completions" 2>/dev/null || echo -e "\n000")
|
|
|
+
|
|
|
+ code=$(echo "$response" | tail -n 1)
|
|
|
+ if [ "$code" = "200" ]; then
|
|
|
+ echo -e "${GREEN}✅ 成功${NC} (Chat 接口可用)"
|
|
|
+ ((SUCCESS++))
|
|
|
+ else
|
|
|
+ echo -e "${RED}❌ 失败${NC} HTTP $code"
|
|
|
+ fi
|
|
|
+ fi
|
|
|
+ ((TOTAL++))
|
|
|
+}
|
|
|
+
|
|
|
+# 快速检查
|
|
|
+quick_check() {
|
|
|
+ echo ""
|
|
|
+ echo "========================================"
|
|
|
+ echo "快速检查模式"
|
|
|
+ echo "========================================"
|
|
|
+
|
|
|
+ for key in "${MODEL_NAMES[@]}"; do
|
|
|
+ local port=${MODEL_PORTS[$key]}
|
|
|
+
|
|
|
+ local code
|
|
|
+ code=$(curl -s -o /dev/null -w "%{http_code}" \
|
|
|
+ --max-time 5 \
|
|
|
+ -H "Authorization: Bearer $API_KEY" \
|
|
|
+ "http://localhost:$port/v1/models" 2>/dev/null || echo "000")
|
|
|
+
|
|
|
+ if [ "$code" = "200" ]; then
|
|
|
+ echo -e "${GREEN}✅${NC} $key (端口 $port)"
|
|
|
+ ((SUCCESS++))
|
|
|
+ else
|
|
|
+ echo -e "${RED}❌${NC} $key (端口 $port) HTTP $code"
|
|
|
+ fi
|
|
|
+ ((TOTAL++))
|
|
|
+ done
|
|
|
+}
|
|
|
+
|
|
|
+# 主函数
|
|
|
+main() {
|
|
|
+ if [ "$1" = "--quick" ]; then
|
|
|
+ quick_check
|
|
|
+ elif [ "$1" = "--model" ] && [ -n "$2" ]; then
|
|
|
+ local key=$2
|
|
|
+ local port=${MODEL_PORTS[$key]}
|
|
|
+ local path=${MODEL_PATHS[$key]}
|
|
|
+ local mtype=${MODEL_TYPES[$key]}
|
|
|
+
|
|
|
+ case $mtype in
|
|
|
+ chat) test_chat_model "$key" "$port" "$path" ;;
|
|
|
+ embedding) test_embedding_model "$key" "$port" "$path" ;;
|
|
|
+ rerank) test_rerank_model "$key" "$port" "$path" ;;
|
|
|
+ esac
|
|
|
+ else
|
|
|
+ # 按顺序测试所有模型
|
|
|
+ for key in "${MODEL_NAMES[@]}"; do
|
|
|
+ local port=${MODEL_PORTS[$key]}
|
|
|
+ local path=${MODEL_PATHS[$key]}
|
|
|
+ local mtype=${MODEL_TYPES[$key]}
|
|
|
+
|
|
|
+ case $mtype in
|
|
|
+ chat) test_chat_model "$key" "$port" "$path" ;;
|
|
|
+ embedding) test_embedding_model "$key" "$port" "$path" ;;
|
|
|
+ rerank) test_rerank_model "$key" "$port" "$path" ;;
|
|
|
+ esac
|
|
|
+ done
|
|
|
+ fi
|
|
|
+
|
|
|
+ echo ""
|
|
|
+ echo "========================================"
|
|
|
+ echo "测试结果摘要"
|
|
|
+ echo "========================================"
|
|
|
+ echo "总计: $SUCCESS / $TOTAL 个模型正常"
|
|
|
+
|
|
|
+ if [ $SUCCESS -eq $TOTAL ]; then
|
|
|
+ echo -e "${GREEN}所有模型运行正常!${NC}"
|
|
|
+ exit 0
|
|
|
+ else
|
|
|
+ echo -e "${RED}部分模型异常,请检查日志${NC}"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+main "$@"
|