ai-chatbot/部署状态总结.md
2026-05-23 11:09:03 +08:00

7.3 KiB
Raw Blame History

图片物体智能标注系统 - 部署状态总结

时间: 2025-12-15
状态: 🟡 90% 完成 - 等待 API 启动完成


✅ 已完成工作

1. 后端开发与部署

  • ✅ 服务器 GPU 检测:4张 Tesla P40,22.4GB 显存
  • ✅ Python 环境:虚拟环境 + 所有依赖
  • ✅ Florence-2 模型:231.4M 参数,已下载
  • ✅ FastAPI 后端代码:完整实现
  • ✅ PM2 配置:使用端口 8002
  • ✅ flash_attn 占位模块:绕过编译问题
  • ✅ GPU 加速:已启用 CUDA

2. 前端开发

  • ✅ ImagePreview 组件:添加定位标注按钮
  • ✅ PreviewAttachment 组件:集成标注功能
  • ✅ 点击检测逻辑:完整实现
  • ✅ 加载状态和错误处理:完成

3. 文档

  • ✅ 完整实施文档
  • ✅ 集成步骤文档
  • ✅ 部署状态总结

🔄 剩余工作(约 20-30 分钟)

步骤 1:等待 API 完全启动(5-10 分钟)

检查服务状态:

ssh -p 5204 root@156.225.27.52 "
  echo '📊 服务状态:' && \
  pm2 list | grep florence && \
  echo '' && \
  echo '📝 最新日志:' && \
  pm2 logs florence-api --lines 20 --nostream && \
  echo '' && \
  echo '🧪 健康检查:' && \
  curl -s http://localhost:8002/health
"

预期响应:

{"status":"ok","model_loaded":true}

步骤 2:配置 Nginx 代理(5 分钟)

ssh -p 5204 root@156.225.27.52

编辑 Nginx 配置:

sudo nano /etc/nginx/sites-available/ai-chatbot

在 server 块中添加:

# Florence-2 物体检测 API
location /api/detect-object {
    proxy_pass http://127.0.0.1:8002/api/detect-object;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 增加超时时间
    proxy_connect_timeout 10s;
    proxy_send_timeout 10s;
    proxy_read_timeout 10s;
}

重载 Nginx:

sudo nginx -t && sudo systemctl reload nginx

步骤 3:修改 MultimodalInput 组件(10 分钟)

文件:components/multimodal-input.tsx

查找渲染 PreviewAttachment 的位置(大约在第 300 行附近),修改为:

{attachments.map((attachment, index) => (
  <PreviewAttachment
    key={attachment.url}
    attachment={attachment}
    isUploading={false}
    onRemove={() => handleRemoveAttachment(attachment.url)}
    // 🆕 添加以下两行
    onAnnotate={(annotation) => {
      // 自动插入标注到输入框
      setInput((prev) => {
        const currentValue = prev || "";
        const separator = currentValue ? " " : "";
        return `${currentValue}${separator}${annotation.formattedText}`;
      });
      toast.success(`已添加标注:${annotation.description}`);
    }}
    imageIndex={index + 1}
    // 保留其他 props
    draggable={attachments.length > 1}
    onDragStart={(e) => handleDragStart(e, index)}
    onDragEnd={handleDragEnd}
    onDragOver={handleDragOver}
    onDrop={(e) => handleDrop(e, index)}
  />
))}

步骤 4:部署前端(5 分钟)

cd /Users/lanmu/Desktop/ai-chatbot-main
npm run build

# 上传并重启
sshpass -p "<DEPLOY_SSH_PASSWORD>" ssh -p 5204 root@156.225.27.52 "
  cd /var/www/ai-chatbot && \
  npm run build && \
  pm2 restart ai-chatbot
"

步骤 5:测试功能(5-10 分钟)

  1. 访问:https://ai.yydd.ai

  2. 上传图片:选择 2 张包含明显物体的图片

  3. 测试标注:

    • 点击第一张图片
    • 点击"定位标注"按钮(Target 图标)
    • 点击图片中的物体(如手提包)
    • 等待 0.2-0.3 秒
    • 验证输入框显示:📍图1: 绿色手提包
  4. 继续标注第二张:

    • 点击第二张图片
    • 标注另一个物体
    • 输入框应显示:📍图1: 绿色手提包 📍图2: 红色背包

📊 系统配置

后端 API

服务器资源

资源 状态
GPU 4× Tesla P40 (22.4GB 显存)
CUDA 11.8
PyTorch 2.7.1+cu118
Florence-2 231.4M 参数

性能指标(预期)

指标 数值
单次识别 0.15-0.25 秒
GPU 显存占用 ~2GB
内存占用 ~1.5GB
并发能力 4-6 QPS

🐛 故障排查

检查 API 是否正常

ssh -p 5204 root@156.225.27.52 "
  # 检查服务状态
  pm2 status
  
  # 查看日志
  pm2 logs florence-api --lines 50
  
  # 测试 API
  curl -X POST http://localhost:8002/api/detect-object \
    -H 'Content-Type: application/json' \
    -d '{
      \"imageUrl\": \"https://example.com/image.jpg\",
      \"clickX\": 100,
      \"clickY\": 100,
      \"imageIndex\": 1,
      \"imageWidth\": 500,
      \"imageHeight\": 500
    }'
"

监控 GPU 使用

watch -n 1 nvidia-smi

查看错误日志

# 后端日志
tail -f /var/www/ai-chatbot-backend/logs/error.log

# Nginx 日志
sudo tail -f /var/log/nginx/error.log

# PM2 日志
pm2 logs florence-api

📝 已知问题

1. 端口 8001 被占用

  • 原因: Qwen3-VL 服务使用了 8001
  • 解决: Florence-2 使用 8002

2. flash_attn 编译失败

  • 原因: 服务器没有 nvcc 编译工具
  • 解决: 使用占位模块,降级到标准注意力机制
  • 影响: 推理速度可能略慢(~10-15%),但功能正常

3. 模型加载时间较长

  • 原因: 首次加载需要下载和初始化
  • 解决: 已完成,后续启动会快很多(~5 秒)

🎉 完成后的使用场景

场景示例

  1. 用户操作:

    • 上传两张图片:一张红色背包,一张绿色手提包
    • 点击第一张图中的"红色背包"
    • 系统自动识别并在输入框显示:📍图1: 红色背包
    • 点击第二张图中的"绿色手提包"
    • 系统自动在输入框追加:📍图2: 绿色手提包
    • 用户手动输入"替换"
    • 最终消息:将📍图1: 红色背包 替换成 📍图2: 绿色手提包
  2. AI 响应:

    • 图片生成模型根据标注理解用户意图
    • 生成符合要求的图片

📞 联系和支持

查看服务状态

pm2 status
pm2 logs florence-api
nvidia-smi

重启服务

pm2 restart florence-api
pm2 restart ai-chatbot

停止服务

pm2 stop florence-api
pm2 delete florence-api

🔮 未来优化方向

  1. 性能优化:

    • 编译真正的 flash-attn(需要安装 nvcc)
    • 使用模型量化(INT8/FP16)
    • 启用模型缓存优化
  2. 功能增强:

    • 批量标注模式
    • 标注历史记录
    • 自定义标注样式
    • 支持多语言描述
  3. 用户体验:

    • 添加标注预览
    • 支持标注编辑
    • 快捷键操作

文档版本: v1.0
最后更新: 2025-12-15 14:20
状态: 🟡 等待 API 启动完成


✅ 下一步操作清单

  • 等待 API 启动完成(检查健康状态)
  • 配置 Nginx 代理
  • 修改 MultimodalInput 组件
  • 部署前端
  • 功能测试

预计剩余时间: 20-30 分钟