CLIP_REPLICAS_GUIDE.md 8.58 KB

CN-CLIP 服务副本数配置指南

📊 副本数(Replicas)详解

什么是副本?

副本(Replicas) 是指同时运行的模型实例数量。每个副本都是独立的进程,可以:

  • 并行处理多个请求
  • 提高服务吞吐量
  • 充分利用多核 CPU 或多 GPU

关键点

  • ✅ 每个副本加载一份完整的模型到内存/显存
  • ✅ 副本间共享网络端口(通过负载均衡)
  • ✅ 多副本不会自动分配到不同 GPU(需手动配置)

💾 显存占用分析

问题:2个副本会比1个副本多一倍显存吗?

答案:是的!基本成倍增加。

副本数 模型显存 峰值显存 总显存占用
1副本 ~2-3 GB ~4-5 GB ~4-5 GB
2副本 ~4-6 GB ~8-10 GB ~8-10 GB
3副本 ~6-9 GB ~12-15 GB ~12-15 GB
4副本 ~8-12 GB ~16-20 GB ~16-20 GB

说明

  • 模型显存:模型权重(固定部分)
  • 峰值显存:模型 + 激活值 + 中间结果(批处理时)
  • CN-CLIP/ViT-H-14:约 2-3 GB 模型权重

你的 GPU 情况

GPU: Tesla T4
总显存: 16384 MiB (16 GB)
当前空闲: ~2 GB

推荐配置

  • 1副本:最安全,适合当前场景
  • 2副本:需要先停止其他占用显存的程序
  • 3+副本:不建议(显存不足)

⚙️ 配置副本数

方法 1:修改配置文件(推荐)

编辑 third-party/clip-as-service/server/clip_server/torch-flow.yml

jtype: Flow
version: '1'
with:
  port: 51000
executors:
  - name: clip_t
    uses:
      jtype: CLIPEncoder
      with:
        name: 'CN-CLIP/ViT-H-14'
        device: 'cuda'              # 设备
        minibatch_size: 32          # 批处理大小
        num_worker_preprocess: 4    # 预处理线程
        dtype: 'float16'            # 数据类型
      metas:
        py_modules:
          - clip_server.executors.clip_torch
    timeout_ready: 3000000
    replicas: 2                    # ← 修改这里(1, 2, 3...)

方法 2:命令行参数

# 启动时指定副本数(需要修改启动脚本)
python -m clip_server \
    --name 'CN-CLIP/ViT-H-14' \
    --replicas 2 \
    --port 51000

方法 3:使用改进的启动脚本

我会在下面提供一个支持副本数的启动脚本。


📈 性能对比

吞吐量测试(理论值)

配置:CN-CLIP/ViT-H-14, Tesla T4, batch_size=32

副本数 QPS (请求/秒) 显存占用 推荐场景
1 ~80-100 ~4-5 GB 开发测试、低并发
2 ~150-180 ~8-10 GB 生产环境、中等并发
3 ~220-260 ~12-15 GB 高并发(需24GB+显存)
4 ~300-350 ~16-20 GB 极高并发(需A100等)

注意

  • 实际性能取决于批处理大小、请求类型(文本/图像)
  • 并发请求少时,多副本提升不明显
  • 并发请求多时,多副本显著提升吞吐量

延迟对比

副本数 单请求延迟 P99 延迟 说明
1 ~50ms ~200ms 无等待,直接处理
2 ~50ms ~150ms 有等待,但处理快
4 ~50ms ~100ms 等待少,处理很快

结论

  • ✅ 多副本不降低单请求延迟
  • ✅ 多副本显著降低 P99 延迟(高并发时)
  • ✅ 多副本显著提升吞吐量

🎯 配置建议

场景 1:开发/测试(推荐)

replicas: 1
minibatch_size: 32
device: cuda  # 或 cpu

特点

  • ✅ 显存占用低(~5GB)
  • ✅ 足够测试使用
  • ✅ 启动快

场景 2:生产环境(中等并发)

replicas: 2
minibatch_size: 32
device: cuda

前提条件

  • ✅ GPU 显存 ≥ 12GB
  • ✅ 没有其他显存占用程序
  • ✅ 需要 ~10GB 显存

特点

  • ✅ 吞吐量翻倍(~150-180 QPS)
  • ✅ 处理并发请求能力强
  • ⚠️ 需要确保显存充足

场景 3:生产环境(高并发)

replicas: 2
minibatch_size: 64
device: cuda

优化点

  • ✅ 增大批处理(利用多副本优势)
  • ✅ 吞吐量进一步提升
  • ⚠️ 需要更多显存(~12-15GB)

场景 4:多 GPU 服务器

如果你有多块 GPU:

executors:
  - name: clip_t_gpu0
    uses:
      jtype: CLIPEncoder
      with:
        device: 'cuda:0'
        replicas: 2
    uses:
      jtype: CLIPEncoder
      with:
        device: 'cuda:1'
        replicas: 2

说明

  • 2块GPU,每块2个副本 = 共4个副本
  • 总吞吐量 ~300+ QPS
  • 每块GPU占用 ~8-10GB

🔍 监控和调试

查看显存占用

# 实时监控
watch -n 1 nvidia-smi

# 查看详细信息
nvidia-smi --query-gpu=timestamp,name,memory.used,memory.free,utilization.gpu --format=csv

# 持续监控(每秒刷新,共100次)
nvidia-smi dmon -s u -c 100

查看副本进程

# 查看所有 clip_server 进程
ps aux | grep clip_server

# 应该看到:
# root  12345  clip_server (main)
# root  12346  clip_server (replica 1)
# root  12347  clip_server (replica 2)
# ...

# 查看进程数
ps aux | grep clip_server | wc -l

# 应该 = replicas + 1

测试吞吐量

# 使用测试脚本
python scripts/test_cnclip_service.py --batch-size 100

# 观察日志
tail -f logs/cnclip_service.log | grep "encoded"

⚠️ 常见问题

Q1: 设置2副本后显存不足 (OOM)

错误信息

RuntimeError: CUDA out of memory. Tried to allocate XXX MiB

解决方案

方案 A:减小批处理大小

replicas: 2
minibatch_size: 16  # 从32减到16

方案 B:使用更小的模型

name: 'CN-CLIP/ViT-L-14'  # 从 H-14 改为 L-14
replicas: 2

方案 C:减少副本数

replicas: 1  # 回退到单副本

Q2: 多副本反而性能下降

原因

  • GPU 资源竞争(显存带宽、计算单元)
  • 批处理太小(未充分利用并行)
  • CPU 预处理成为瓶颈

解决方案

# 增大批处理
minibatch_size: 64

# 增加预处理线程
num_worker_preprocess: 8

# 或减少副本
replicas: 1

Q3: 如何知道最佳副本数?

实验方法

# 测试脚本
for replicas in 1 2 3; do
  echo "Testing $replicas replicas..."

  # 修改配置
  sed -i "s/replicas: .*/replicas: $replicas/" torch-flow.yml

  # 重启服务
  ./scripts/stop_cnclip_service.sh
  ./scripts/start_cnclip_service.sh

  # 等待启动
  sleep 30

  # 运行测试
  python scripts/test_cnclip_service.py --batch-size 100
done

# 对比结果,选择最优配置

推荐配置

  • Tesla T4 (16GB): 1-2 副本
  • RTX 3090 (24GB): 2-3 副本
  • A100 (40GB): 3-4 副本

📝 快速配置参考

修改启动脚本支持副本数

编辑 scripts/start_cnclip_service.sh,添加参数:

# 在参数解析部分添加
--replicas)
    REPLICAS="$2"
    shift 2
    ;;

# 在启动命令中使用
nohup python -m clip_server \
    --name "${MODEL_NAME}" \
    --replicas ${REPLICAS:-1} \    # ← 添加这一行
    --port ${PORT} \
    ...

当前最佳实践(Tesla T4)

保守配置(推荐):

replicas: 1
minibatch_size: 32
dtype: float16
  • 显存:~5GB
  • QPS:~80-100
  • 适合:开发、测试、小规模应用

激进配置(需测试):

replicas: 2
minibatch_size: 32
dtype: float16
  • 显存:~10GB
  • QPS:~150-180
  • 适合:生产环境、中等并发
  • 前提:清理其他显存占用

🎉 总结

关键要点

  1. 显存占用:副本数 × 单副本显存(基本线性增长)
  2. 性能提升:吞吐量接近线性增长,但不完美
  3. 推荐配置
    • Tesla T4 (16GB): 1-2 副本
    • 确保显存充足 + 预留 20% 余量
  4. 优化建议
    • 从小副本开始测试
    • 根据实际负载调整
    • 监控显存和性能指标

你的情况

当前配置

replicas: 1  # 当前配置

建议

  • ✅ 先保持 replicas: 1,测试性能
  • ✅ 如果吞吐量不够,再尝试 replicas: 2
  • ⚠️ 确保显存充足(当前空闲2GB可能不够2副本)
  • 💡 考虑先清理其他显存占用

快速测试

# 1. 查看当前显存占用
nvidia-smi

# 2. 启动1副本,观察显存
./scripts/start_cnclip_service.sh
nvidia-smi  # 应该增加 ~5GB

# 3. 如果还有空间,尝试2副本
./scripts/stop_cnclip_service.sh
# 修改 torch-flow.yml 中的 replicas: 2
./scripts/start_cnclip_service.sh
nvidia-smi  # 应该再增加 ~5GB

需要我帮你修改启动脚本以支持副本数参数吗?