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
- 适合:生产环境、中等并发
- 前提:清理其他显存占用
🎉 总结
关键要点
- 显存占用:副本数 × 单副本显存(基本线性增长)
- 性能提升:吞吐量接近线性增长,但不完美
- 推荐配置:
- Tesla T4 (16GB): 1-2 副本
- 确保显存充足 + 预留 20% 余量
- 优化建议:
- 从小副本开始测试
- 根据实际负载调整
- 监控显存和性能指标
你的情况
当前配置:
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
需要我帮你修改启动脚本以支持副本数参数吗?