Ollama抢了你的全部GPU?教你用几行代码精准‘锁卡’,让其他AI模型和平共处
多GPU环境下Ollama资源占用优化实战指南
当你在同一台服务器上同时运行Ollama和Stable Diffusion等AI应用时,是否遇到过这样的尴尬场景:刚打开Ollama准备测试一个语言模型,却发现Stable Diffusion突然无法生成图片了?这种资源冲突在多AI应用并行运行时尤为常见。本文将深入分析GPU资源争用问题,并提供多种实用解决方案,帮助你在有限硬件条件下实现AI应用的高效协同工作。
1. 理解GPU资源争用现象
现代AI应用对GPU计算资源的需求日益增长,而多应用并行运行时往往会出现资源分配不合理的情况。以Ollama和Stable Diffusion为例,两者都是基于CUDA加速的AI应用,默认情况下会尝试占用所有可用的GPU资源。
典型症状包括:
- 启动Ollama后,其他AI应用报错"CUDA out of memory"
- 系统日志显示GPU内存被单一应用独占
- 多任务并行时整体性能显著下降
这种现象的根源在于CUDA的默认行为——应用程序会尝试使用所有可见的GPU设备。对于拥有多块GPU的工作站或服务器,我们需要更精细的资源管理策略。
提示:使用
nvidia-smi命令可以实时监控各GPU的使用情况,这是诊断资源冲突的第一步
2. 核心解决方案:GPU设备隔离技术
2.1 环境变量控制法
最直接的GPU隔离方法是使用CUDA_VISIBLE_DEVICES环境变量。这个由NVIDIA提供的机制允许我们限制应用程序可见的GPU设备范围。
# 只让应用看到GPU 0和1
CUDA_VISIBLE_DEVICES=0,1 ollama serve
这种方法简单有效,但需要注意几个关键点:
- 索引从0开始:GPU编号通常从0开始递增
- 持久化配置:临时环境变量只对当前会话有效
- 服务级配置:对于系统服务,需要在服务定义中设置环境变量
2.2 自动化脚本实现
为了简化操作流程,我们可以创建一个自动化配置脚本:
#!/bin/bash
# ollama_gpu_config.sh - 自动配置Ollama使用的GPU设备
CONFIG_FILE="/etc/systemd/system/ollama.service"
# 验证输入参数
validate_input() {
if [[ ! $1 =~ ^[0-9]+(,[0-9]+)*$ ]]; then
echo "错误:无效的GPU编号 '$1',请输入逗号分隔的数字"
exit 1
fi
}
# 更新服务配置
update_service() {
local devices=$1
sudo sed -i '/^\[Service\]/a Environment="CUDA_VISIBLE_DEVICES='"$devices"'"' $CONFIG_FILE
sudo systemctl daemon-reload
sudo systemctl restart ollama
echo "Ollama服务已配置为使用GPU: $devices"
}
# 主逻辑
if [ $# -eq 0 ]; then
read -p "请输入Ollama使用的GPU编号(逗号分隔): " input
validate_input "$input"
update_service "$input"
else
validate_input "$1"
update_service "$1"
fi
使用步骤:
- 将脚本保存为
ollama_gpu_config.sh - 赋予执行权限:
chmod +x ollama_gpu_config.sh - 执行脚本:
sudo ./ollama_gpu_config.sh 0,1(示例中使用GPU 0和1)
2.3 系统服务配置
对于通过systemd管理的Ollama服务,可以直接修改服务定义文件:
[Unit]
Description=Ollama Service
After=network.target
[Service]
ExecStart=/usr/bin/ollama serve
Environment="CUDA_VISIBLE_DEVICES=0,1"
User=ollama
Group=ollama
Restart=always
[Install]
WantedBy=multi-user.target
修改后需要重新加载服务配置:
sudo systemctl daemon-reload
sudo systemctl restart ollama
3. 进阶资源管理策略
3.1 GPU计算模式设置
NVIDIA提供了多种GPU计算模式,通过nvidia-smi工具可以进行调整:
# 设置GPU 0为独占进程模式
sudo nvidia-smi -i 0 -c EXCLUSIVE_PROCESS
# 恢复默认模式
sudo nvidia-smi -i 0 -c DEFAULT
不同计算模式的特点:
| 模式 | 描述 | 适用场景 |
|---|---|---|
| DEFAULT | 多个应用共享GPU | 一般用途 |
| EXCLUSIVE_PROCESS | 单进程独占整个GPU | 高性能需求 |
| PROHIBITED | 禁止CUDA计算 | 特殊需求 |
3.2 基于cgroups的隔离
对于更复杂的资源管理需求,可以使用Linux的cgroups机制:
# 创建cgroup
sudo cgcreate -g memory,cpuset:ollama_group
# 分配GPU 0和CPU核心0-3
echo 0 > /sys/fs/cgroup/cpuset/ollama_group/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/ollama_group/cpuset.mems
# 限制内存使用
echo 8G > /sys/fs/cgroup/memory/ollama_group/memory.limit_in_bytes
# 启动应用
cgexec -g memory,cpuset:ollama_group ollama serve
3.3 容器化部署方案
使用Docker等容器技术可以更灵活地管理GPU资源:
# Dockerfile示例
FROM nvidia/cuda:12.2-base
RUN apt-get update && apt-get install -y ollama
ENV CUDA_VISIBLE_DEVICES=0,1
CMD ["ollama", "serve"]
运行容器时指定GPU:
docker run --gpus '"device=0,1"' -p 11434:11434 ollama-image
4. 多应用协同配置实例
假设我们有一台配备4块GPU的服务器,需要同时运行以下应用:
- Ollama (GPU 0和1)
- Stable Diffusion (GPU 2)
- 其他AI服务 (GPU 3)
配置方案:
- Ollama配置:
sudo ./ollama_gpu_config.sh 0,1
- Stable Diffusion启动命令:
CUDA_VISIBLE_DEVICES=2 python stable-diffusion-webui/launch.py
- 系统监控脚本:
#!/bin/bash
# monitor_gpu.sh - 监控各应用GPU使用情况
watch -n 1 'nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used \
--format=csv,noheader'
性能调优建议:
- 高频交互应用(如Ollama)分配更多显存
- 批量处理任务(如Stable Diffusion)可适当限制计算资源
- 定期检查
nvidia-smi输出,平衡各GPU负载
更多推荐



所有评论(0)