使用Shell脚本实现多GPU上的Ollama模型自动部署
在大规模AI应用场景中,我们经常需要在多个GPU上同时部署不同的语言模型。本文将介绍一个自动化部署脚本,用于在多个GPU上高效部署和管理Ollama模型。
功能特点
- 自动停止已运行的Ollama服务
- 支持多GPU并行部署
- 自定义显存分配
- 独立端口配置
- 自动日志管理
- 模型预热机制
脚本实现
基础配置
首先,我们定义了基本的运行参数:
# 指定使用的最后三块显卡 (GPU 5,6,7)
GPUS=(5 6 7)
PORTS=(11435 11436 11437)
模型配置
脚本支持三个不同的模型,每个都有特定的用途:
declare -A MODELS=(["emotion"]="qwen:7b"["main"]="ALIENTELLIGENCE/psychologistv2:latest"["crisis"]="ALIENTELLIGENCE/mindpal:latest"
)declare -A GPU_MEM=(["emotion"]=10000["main"]=10000["crisis"]=9000
)
部署流程
-
环境准备
- 停止现有Ollama服务
- 创建日志目录
-
资源分配
- 为每个模型分配专用GPU
- 配置独立端口
- 设置显存限制
-
服务启动
- 设置环境变量
- 启动Ollama服务
- 模型预热
- 日志重定向
监控和测试
监控命令
watch -n 1 nvidia-smi
tail -f ~/ollama_logs/*.log
API测试
每个模型都可以通过其专用端口访问:
# 情感分析模型测试
curl http://localhost:11435/api/generate -d '{"model": "qwen:7b", "prompt":"Hello"}'# 主模型测试
curl http://localhost:11436/api/generate -d '{"model": "ALIENTELLIGENCE/psychologistv2:latest", "prompt":"Hello"}'# 危机处理模型测试
curl http://localhost:11437/api/generate -d '{"model": "ALIENTELLIGENCE/mindpal:latest", "prompt":"Hello"}'
shell
#!/bin/bash
# run_models_on_last_gpus.sh# 停止所有可能运行的 ollama 服务
pkill -f "ollama serve"# 创建日志目录
mkdir -p ~/ollama_logs# 指定使用的最后三块显卡 (GPU 5,6,7)
GPUS=(5 6 7)
PORTS=(11435 11436 11437)# 模型配置
declare -A MODELS=(["emotion"]="qwen:7b"["main"]="ALIENTELLIGENCE/psychologistv2:latest"["crisis"]="ALIENTELLIGENCE/mindpal:latest"
)# 显存分配 (单位MB)
declare -A GPU_MEM=(["emotion"]=10000["main"]=10000["crisis"]=9000
)# 启动计数器
COUNT=0# 循环启动模型
for MODEL_NAME in "${!MODELS[@]}"; doGPU_ID=${GPUS[$COUNT]}PORT=${PORTS[$COUNT]}MODEL=${MODELS[$MODEL_NAME]}MEM=${GPU_MEM[$MODEL_NAME]}echo "启动 $MODEL_NAME 模型 (GPU $GPU_ID, 端口 $PORT, 显存 ${MEM}MB)..."# 设置环境变量export CUDA_VISIBLE_DEVICES=$GPU_IDexport OLLAMA_HOST="0.0.0.0:$PORT"export OLLAMA_NUM_GPU=1# 启动服务nohup ollama serve > ~/ollama_logs/${MODEL_NAME}.log 2>&1 &# 等待服务初始化sleep 15# 运行模型并预热显存ollama run $MODEL >/dev/null 2>&1 &# 显示启动信息echo " -> $MODEL_NAME 模型已部署在 GPU $GPU_ID (端口 $PORT)"echo " -> 日志文件: ~/ollama_logs/${MODEL_NAME}.log"echo " -> 显存分配: ${MEM}MB"# 增加计数器((COUNT++))
doneecho -e "\n所有模型已启动!"
echo "使用的显卡: GPU ${GPUS[0]}, ${GPUS[1]}, ${GPUS[2]}"
echo "监控命令:"
echo " watch -n 1 nvidia-smi"
echo " tail -f ~/ollama_logs/*.log"
echo "测试命令:"
echo " curl http://localhost:11435/api/generate -d '{\"model\": \"qwen:7b\", \"prompt\":\"Hello\"}'"
echo " curl http://localhost:11436/api/generate -d '{\"model\": \"ALIENTELLIGENCE/psychologistv2:latest\", \"prompt\":\"Hello\"}'"
echo " curl http://localhost:11437/api/generate -d '{\"model\": \"ALIENTELLIGENCE/mindpal:latest\", \"prompt\":\"Hello\"}'"
最佳实践
-
显存管理
- 根据模型大小合理分配显存
- 预留足够系统资源
-
错误处理
- 使用日志文件追踪问题
- 定期检查服务状态
-
性能优化
- 模型预热减少首次请求延迟
- 独立端口避免资源竞争
性能对比
优化前
- 所有模型共用第一块GPU
- 三个模型的串行调用耗时4-5分钟
- GPU资源利用率不均衡
- 模型之间存在资源竞争
优化后
- 每个模型独占一块GPU
- 三个模型并行调用仅需10秒左右
- GPU资源利用率优化
- 消除了模型间的资源竞争
- 响应时间提升约30倍
总结
这个脚本提供了一个灵活且可扩展的解决方案,用于在多GPU环境中部署和管理Ollama模型。通过合理的资源分配和自动化配置,不仅大大简化了模型部署流程,提高了运维效率,更实现了显著的性能提升。多GPU并行部署策略将响应时间从原来的4-5分钟优化到了10秒左右,极大地提升了系统的实用性。