要让多块nvidia显卡均衡分担ai计算任务,需依次确认硬件驱动状态、设置cuda_visible_devices环境变量、启用ollama的ollama_sched_spread调度策略,并通过nvidia-smi验证gpu利用率与显存占用是否同步波动且差值≤15%。

你想让两块或更多NVIDIA显卡同时分担AI推理、图像生成或文档解析的计算压力,而不是只有一张卡满载、其他卡闲置?这需要精确控制CUDA可见设备、启用调度策略、匹配模型加载方式,漏掉任意一环都可能导致负载不均甚至报错。
确认多GPU硬件与驱动状态
打开终端,执行 nvidia-smi -L 查看系统识别到的GPU列表,确保每张卡型号一致且驱动版本 ≥535.104;若输出中只显示一张卡,先检查PCIe插槽是否插稳、BIOS中Above 4G Encoding是否启用。
运行 nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.used --format=csv,观察各卡初始温度与显存占用——若某张卡温度明显偏低、显存长期为0MiB,说明尚未被任何进程调用。
设置CUDA_VISIBLE_DEVICES环境变量
这是所有后续配置的前提。它决定Ollama、PyTorch等框架“看得到”哪些GPU。
方法一:临时生效(仅当前终端)
执行 export CUDA_VISIBLE_DEVICES=0,1(双卡)或 export CUDA_VISIBLE_DEVICES=0,1,2,3(四卡),【必须在启动服务前执行】,否则Ollama仍默认绑定GPU 0。
方法二:永久写入systemd服务文件
编辑 /etc/systemd/system/ollama.service,在 [Service] 段落下添加:Environment="CUDA_VISIBLE_DEVICES=0,1"
保存后执行 sudo systemctl daemon-reload && sudo systemctl restart ollama。
启用Ollama跨GPU负载均衡
Ollama从v0.3.0起支持原生多卡调度,但需手动激活。
第一步:修改systemd服务环境变量
在同个 ollama.service 文件中,追加:Environment="OLLAMA_SCHED_SPREAD=1"Environment="OLLAMA_KEEP_ALIVE=-1"
第二步:重启服务并验证sudo systemctl restart ollama
加载一个大模型如 ollama run qwen3.5-9b 后,立即开新终端运行 nvidia-smi ——若看到GPU 0和GPU 1的Memory-Usage同步上升、Utilization持续在40%~75%区间波动,说明负载已开始分摊。
注意:【OLLAMA_KEEP_ALIVE=-1会阻止模型自动卸载,显存将被长期锁定】,生产环境必须使用,开发调试时可改为 300(保持5分钟)避免显存卡死。
模型层级手动分配(适用于HuggingFace模型)
当自动调度无法满足精度要求(如Qwen3.5-9B需将Embedding和Head固定在首卡),必须显式指定device_map。
方法一:auto模式(推荐初试)
在Python加载代码中写:model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto", torch_dtype=torch.float16)
PyTorch会按层参数量自动切分,但可能把相邻层分到不同卡,增加PCIe通信开销。
方法二:精准映射(适合调试)
构造字典明确每层归属:device_map = { "model.embed_tokens": 0, "model.layers.0": 0, "model.layers.1": 0, "model.layers.2": 1, "model.layers.3": 1, "model.norm": 0, "lm_head": 0 }
这样能保证输入嵌入和输出头在同一卡,减少跨卡数据搬运。
验证负载是否真正均衡
不要只看nvidia-smi里两行数字差不多就认为成功——很多配置只是“同时跑”,而非“平均分担”。
执行连续10次相同请求(如用curl批量发送10条文本到Ollama API),然后运行:watch -n 0.5 'nvidia-smi --query-gpu=index,utilization.gpu,utilization.memory --format=csv'
观察两卡的GPU-Util数值差值是否始终 ≤15%,内存占用比例是否稳定在1:1附近。若GPU 0长期维持85%而GPU 1徘徊在20%,说明 OLLAMA_SCHED_SPREAD 未生效或CUDA_VISIBLE_DEVICES未正确继承。











