Ollama抢了你的全部GPU?教你用几行代码精准‘锁卡’,让其他AI模型和平共处

张开发
2026/4/17 15:29:12 15 分钟阅读

分享文章

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_DEVICES0,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 EnvironmentCUDA_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] DescriptionOllama Service Afternetwork.target [Service] ExecStart/usr/bin/ollama serve EnvironmentCUDA_VISIBLE_DEVICES0,1 Userollama Groupollama Restartalways [Install] WantedBymulti-user.target修改后需要重新加载服务配置sudo systemctl daemon-reload sudo systemctl restart ollama3. 进阶资源管理策略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 serve3.3 容器化部署方案使用Docker等容器技术可以更灵活地管理GPU资源# Dockerfile示例 FROM nvidia/cuda:12.2-base RUN apt-get update apt-get install -y ollama ENV CUDA_VISIBLE_DEVICES0,1 CMD [ollama, serve]运行容器时指定GPUdocker run --gpus device0,1 -p 11434:11434 ollama-image4. 多应用协同配置实例假设我们有一台配备4块GPU的服务器需要同时运行以下应用Ollama (GPU 0和1)Stable Diffusion (GPU 2)其他AI服务 (GPU 3)配置方案Ollama配置sudo ./ollama_gpu_config.sh 0,1Stable Diffusion启动命令CUDA_VISIBLE_DEVICES2 python stable-diffusion-webui/launch.py系统监控脚本#!/bin/bash # monitor_gpu.sh - 监控各应用GPU使用情况 watch -n 1 nvidia-smi --query-gpuindex,name,utilization.gpu,memory.used \ --formatcsv,noheader性能调优建议高频交互应用(如Ollama)分配更多显存批量处理任务(如Stable Diffusion)可适当限制计算资源定期检查nvidia-smi输出平衡各GPU负载

更多文章