多个模型复用同一张GPU卡方案

上一篇我们使用 Docker部署bge-m3/bge-reranker模型,由于测试环境GPU卡资源紧张,基于成本考虑,需要在同一张卡上运行多个模型。现在以 bge-m3/bge-reranker 模型为例,将两个模型部署在同一张英伟达 L20 GPU卡上。

🎯 同时运行的方案

方案1:使用不同端口分别部署(推荐)

这是最直接和稳定的方式:

# 启动 embedding 模型(使用端口 8080)
docker run -d --name bge-embedding --runtime nvidia --gpus '"device=0"' \
  -v /path/to/embedding-model:/mnt/models \
  -p 8080:8080 --ipc=host \
  --entrypoint=text-embeddings-router \
  ghcr.io/huggingface/text-embeddings-inference:1.6 \
  --model-id /mnt/models --port 8080 \
  --max-batch-tokens 16384 --max-concurrent-requests 256 \
  --max-client-batch-size 16

# 启动 rerank 模型(使用端口 8081)
docker run -d --name bge-reranker --runtime nvidia --gpus '"device=0"' \
  -v /path/to/reranker-model:/mnt/models \
  -p 8081:8080 --ipc=host \
  --entrypoint=text-embeddings-router \
  ghcr.io/huggingface/text-embeddings-inference:1.6 \
  --model-id /mnt/models --port 8080 \
  --max-batch-tokens 8192 --max-concurrent-requests 128 \
  --max-client-batch-size 8

方案2:使用不同GPU内存限制

如果担心资源竞争,可以为每个容器设置GPU内存限制:

# 为embedding模型分配较多显存
docker run -d --name bge-embedding --runtime nvidia --gpus '"device=0"' \
  -e NVIDIA_VISIBLE_DEVICES=1 \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
  --memory=8g --memory-swap=10g \
  -p 8080:8080 \
  # ... 其他参数

# 为reranker模型分配较少显存
docker run -d --name bge-reranker --runtime nvidia --gpus '"device=0"' \
  -e NVIDIA_VISIBLE_DEVICES=1 \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
  --memory=4g --memory-swap=6g \
  -p 8081:8080 \
  # ... 其他参数

📊 资源规划建议

GPU显存需求估算

模型类型基础模型大小显存需求(近似)批处理大小影响
Embedding模型110M-335M1-3GB+0.5-1GB(批处理)
Reranker模型110M-278M1-2.5GB+0.3-0.8GB(批处理)

NVIDIA L20有48GB显存,同时运行两个模型绰绰有余。

性能优化配置

# Embedding模型(通常需要更高吞吐量)
--max-concurrent-requests 256
--max-client-batch-size 16
--max-batch-tokens 16384

# Reranker模型(通常延迟更敏感)
--max-concurrent-requests 128  
--max-client-batch-size 8
--max-batch-tokens 8192

🔧 验证同时运行状态

1. 检查容器状态

docker ps | grep -E "(bge-embedding|bge-reranker)"

2. 监控GPU使用情况

# 实时监控GPU使用
watch -n 1 nvidia-smi

# 或使用更详细的监控
nvidia-smi --query-gpu=index,name,utilization.gpu,utilization.memory,memory.used,memory.total --format=csv -l 2

3. 分别测试两个服务

# 测试embedding服务
curl -X POST http://localhost:8080/embed \
  -H "Content-Type: application/json" \
  -d '{"inputs": "测试文本"}'

# 测试rerank服务  
curl -X POST http://localhost:8081/rerank \
  -H "Content-Type: application/json" \
  -d '{
    "query": "测试查询",
    "texts": ["文档1", "文档2"]
  }'

⚠️ 注意事项

  1. 显存竞争:虽然可以同时运行,但在高并发时可能会有显存竞争

  2. 性能隔离:一个模型的负载高峰可能影响另一个模型的响应时间

  3. 故障隔离:一个容器崩溃不会影响另一个容器

  4. 资源监控:建议设置监控告警,及时发现资源瓶颈

🚀 生产环境建议

对于生产环境,推荐:

  1. 使用Kubernetes进行资源管理和弹性伸缩

  2. 设置资源限制确保公平性

  3. 实现健康检查和自动恢复

  4. 使用负载均衡在多个实例间分发请求

总结:在L20 GPU上同时运行embedding和reranker模型是完全可行的,只需合理分配端口和调整资源参数即可,对于多个模型利用同一张GPU卡,生产环境还是慎用。


参考:

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6573.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注