在 RTX 5090 雙卡環境下,NCCL 報錯(常見為 unhandled system error 或 invalid usage)通常源於消費級顯卡缺乏 NVLink 物理橋接,導致 NCCL 在嘗試透過 PCIe 進行 Peer-to-Peer (P2P) 通訊時,被主機板的 BIOS 設定或晶片組限制擋住。
請按照以下步驟由淺入深進行排查:
1. 快速診斷:檢查 P2P 支援狀態
首先確認系統是否真的能讓兩張卡「互相對話」。請在終端機執行:</>Bash
nvidia-smi topo -m
- 看圖表交點: 找 GPU0 與 GPU1 的交點。
- PIX: 經過單個 PCIe Switch(最理想,P2P 必過)。
- PHB / NODE: 經過 CPU 或主機板橋接(P2P 常在此失敗)。
- SYS: 跨路處理器(極慢,P2P 基本不支援)。
2. 核心修復方案
方案 A:強制降低 P2P 級別 (最有效)
如果報錯發生在初始化階段,通常是因為 NCCL 嘗試使用高性能 P2P 但主機板不穩。請修改您的 deepspeed_launcher.sh,嘗試加入以下環境變數:
</>Bash
# 嘗試方案 1:將 P2P 限制在 PCIe 橋接層級 (PHB)
export NCCL_P2P_LEVEL=3
# 嘗試方案 2:如果還是報錯,徹底禁用 GPU 直接通訊,改走系統記憶體 (Shared Memory)
export NCCL_P2P_DISABLE=1
export NCCL_SHM_DISABLE=0
方案 B:升級 NCCL 版本 (針對 RTX 50 系列)
RTX 5090 是較新的 Blackwell 架構,早期的 NCCL 版本(如 2.20 以前)可能無法正確識別其 P2P 特性。
- 建議: 確保您的 NCCL 版本在 2.26.5 以上。
- 如果您使用 Docker,請確認鏡像內的
nvidia-nccl-cu12版本。
3. BIOS 與硬體層級檢查
如果軟體設定無效,通常是主機板設定攔截了 PCIe 的數據交換:
- 禁用 ACS (Access Control Services): 這是最常見的兇手。ACS 會強制所有 PCIe 數據先回到 CPU 再下發,這會導致 NCCL 的 P2P 測試失敗。
- 排查命令: sudo lspci -vvv | grep ACSCtl
- 解決: 在 BIOS 中將 PCIe ACS 或 IOMMU 設置為 Disabled。
- 開啟 Above 4G Decoding 與 Resizable BAR: 預訓練大模型需要頻繁交換大塊顯存數據,務必在 BIOS 中將這兩項設為 Enabled。
- 確認 PCIe 插槽帶寬: 確保兩張 5090 都插在由 CPU 直連 的插槽(通常是主機板最上方兩個),而非經由南橋(PCH)轉接的插槽。
4. 終極測試工具
如果依然報錯,請下載 NVIDIA 官方工具來測試:
</>Bash
# 下載並編譯 nccl-tests
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests && make
# 執行測試
./build/all_reduce_perf -b 8 -e 256M -f 2 -g 2
若測試通過但訓練失敗,說明問題出在 PyTorch 或 DeepSpeed 的配置;若測試直接報錯,則是驅動或 BIOS 的硬體問題。
您可以先嘗試在啟動腳本加入 export NCCL_P2P_DISABLE=1 看看能否順利跑通? 雖然這會損失約 5-10% 的同步效能,但能繞過 99% 的硬體相容性報錯。


