上一篇我们使用 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-335M | 1-3GB | +0.5-1GB(批处理) |
| Reranker模型 | 110M-278M | 1-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"]
}'⚠️ 注意事项
显存竞争:虽然可以同时运行,但在高并发时可能会有显存竞争
性能隔离:一个模型的负载高峰可能影响另一个模型的响应时间
故障隔离:一个容器崩溃不会影响另一个容器
资源监控:建议设置监控告警,及时发现资源瓶颈
🚀 生产环境建议
对于生产环境,推荐:
使用Kubernetes进行资源管理和弹性伸缩
设置资源限制确保公平性
实现健康检查和自动恢复
使用负载均衡在多个实例间分发请求
总结:在L20 GPU上同时运行embedding和reranker模型是完全可行的,只需合理分配端口和调整资源参数即可,对于多个模型利用同一张GPU卡,生产环境还是慎用。
参考: