能跑起来的核心是“认得全、分得清、不抢资源”:nvidia-smi需列出所有gpu,cuda_visible_devices要精准指定可见设备,xorg.conf须避免xorg占用计算卡,三者缺一不可。

多显卡并行计算环境能不能跑起来,核心不在“配”,而在“认得全、分得清、不抢资源”——nvidia-smi 能列出所有卡,CUDA_VISIBLE_DEVICES 能精准指定,xorg.conf 不抢计算卡,这三件事没做对,后面全是空谈。
确认系统真正识别全部 GPU
别信硬件插了就等于系统看见了。很多问题从第一步就错了:你以为插了两张 RTX 4090,nvidia-smi 却只显示一张,或者 nvidia-smi -L 输出的 UUID 少一个。
- 执行
nvidia-smi -L,每条输出对应一张物理卡;若数量不符,先查lspci | grep -i nvidia看 PCIe 设备是否全被枚举出来 - 常见漏卡原因:BIOS 中禁用了 “Above 4G Decoding” 或 “Resizable BAR”,或某张卡 PCIe 插槽供电不足(尤其 4090 这类卡需双 8pin)
- 如果某张卡在
nvidia-smi里温度/功耗/显存占用始终为 0,大概率是驱动未加载其内核模块,可查dmesg | grep -i nvidia是否有 probe failed 或 bus error
避免 Xorg 占用计算用 GPU
这是 Linux 多显卡环境下最隐蔽的性能杀手:X Window 默认可能把高性能独显当显示输出设备绑定,导致你的训练脚本调用 cudaSetDevice() 时直接失败,报错 CUDA_ERROR_INVALID_DEVICE 或 device is busy。
- 用
lspci -k | grep -A 3 -i vga查每张卡的 Kernel driver in use,确认哪张被nvidia驱动接管、哪张被i915或amdgpu管理 - 编辑
/etc/X11/xorg.conf,明确指定仅用集成显卡(如 Intel)或低功耗独显负责显示,关键段落加Option "AllowEmptyInitialConfiguration" "true"和Option "UseDisplayDevice" "none"给计算卡 - 更稳妥的做法:把计算卡从 Xorg 的 Device Section 中完全排除,只保留显示卡的配置;或改用
OutputClass规则放在/usr/share/X11/xorg.conf.d/下按 BusID 匹配
设置 CUDA_VISIBLE_DEVICES 控制可见性
这个环境变量不是“告诉 Ollama 或 PyTorch 用哪些卡”,而是“告诉 CUDA runtime 当前进程能看到哪些物理设备编号”。它直接影响 torch.cuda.device_count() 返回值和默认 device 选择。
- 假设
nvidia-smi -L输出顺序是:GPU 0: NVIDIA RTX 4090、GPU 1: NVIDIA RTX 4090、GPU 2: NVIDIA RTX 4090、GPU 3: NVIDIA RTX 4090,那么CUDA_VISIBLE_DEVICES=0,2后,进程内看到的设备编号会重映射为0→原0、1→原2 - 务必在启动命令前导出,例如:
CUDA_VISIBLE_DEVICES=0,1 python train.py;写进~/.bashrc会影响所有进程,不推荐 - 注意:该变量对
nvtop、nvidia-smi本身无效,它们永远显示物理视图;但对torch.cuda.is_available()和cudaGetDeviceCount()生效
驱动与 CUDA 版本必须严格匹配
驱动版本决定了你能用的最高 CUDA Toolkit 版本,而实际安装的 CUDA Toolkit 版本又决定 PyTorch / Ollama 等二进制包能否加载。三者错一个,import torch 就可能抛 libcudart.so not found 或 version mismatch。
- 查当前驱动支持的 CUDA 最高版本:运行
nvidia-smi,右上角显示的 “CUDA Version: 12.4” 是驱动能兼容的上限,不是已安装版本 - 查已安装 CUDA:看
/usr/local/cuda-xx目录是否存在,再运行/usr/local/cuda-12.1/bin/nvcc --version - PyTorch 官网下载链接里明确标着 “cu121” 或 “cu118”,必须和你
nvcc输出的版本一致;Ollama 的ollama run llama3若提示no CUDA-capable device,八成是 CUDA runtime 找不到对应驱动
真正麻烦的从来不是配置步骤,而是当你以为“已经配好”时,nvidia-smi 显示四张卡都在 idle,但 python -c "import torch; print(torch.cuda.device_count())" 却返回 0 —— 那说明 Xorg 还锁着其中一张,或者 CUDA_VISIBLE_DEVICES 被某个父 shell 意外覆盖了。











