原帖后续 collect_env 明确显示 CUDA used to build PyTorch: None,Conda 构建名为 cpu_py38;这比集群装有 CUDA 11.7 更能解释报错:
RuntimeError: Distributed package doesn't have NCCL built in
作业里的 CPU 构建是已给出的证据
原题 collect_env 的 build CUDA=None 与 cpu_py38 已经指向实际安装不包含 NCCL。集群有 CUDA module 并不能改变 wheel/Conda 包的编译内容。优先在分配 GPU 的作业内核对解释器,避免登录节点与作业节点环境不同。
加载 CUDA module 不会把 CPU torch 变成带 NCCL 的 CUDA 构建。首先在实际 SLURM 作业使用的解释器里检查,而不是只在登录节点测试。
import sys
import torch
import torch.distributed as dist
print("josh050608")
print("python:", sys.executable)
print("torch/build CUDA:", torch.__version__, torch.version.cuda)
print("CUDA available:", torch.cuda.is_available())
print("distributed/NCCL:", dist.is_available(), dist.is_nccl_available())
在分配了 GPU 的作业环境中同时执行 nvidia-smi,核对任务是否拿到设备。原帖这组 CPU 构建需要换成项目兼容的官方 CUDA 构建,不能仅修改 backend 名字。
历史复现可参考 PyTorch 1.12.1 官方页面的 CUDA 11.3/11.6 组合,并核对集群驱动要求与 DeepSpeed/Transformers 约束。例如在独立的兼容 Python 3.8 环境、确认驱动支持 CUDA 11.6 后,可按官方历史组合安装 torch:
python -m pip install torch==1.12.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
python -m pip check
这只给出 torch 的历史构建选择,DeepSpeed 等其余依赖仍按项目约束安装。避免已有 cpuonly、混合 pip/Conda 包继续把解析结果拉回 CPU;当前集群 CUDA module 的数字不等于必须选择完全相同的 wheel 后缀。
若需求仅为 CPU 分布式,可在框架确实支持时选择 Gloo;但原题是 DeepSpeed GPU 微调,不能声称替换成 Gloo 就满足原任务。Windows 官方 NCCL 支持限制也不应套到这道已确认 Linux 的题上。
验证依次为 is_nccl_available=True、单卡分配、两进程小 collective,再启动真正训练。无需为了验证安装立即重跑完整微调。
安装能力与设备可见性分别验证
dist.is_nccl_available 检查当前构建是否带 NCCL;CUDA 设备分配检查作业是否拿到可用 GPU。两者都要通过,再进入 DeepSpeed,而非用 backend='gloo' 掩盖 GPU 微调需求。
下面脚本可放到实际 SLURM 作业的诊断阶段,不初始化分布式训练,也不运行模型:
import os
import sys
import torch
import torch.distributed as dist
print("job/local rank:", os.environ.get("SLURM_JOB_ID"), os.environ.get("LOCAL_RANK"))
print("python/build:", sys.executable, torch.__version__, torch.version.cuda)
print("NCCL built:", dist.is_nccl_available())
print("visible/count:", os.environ.get("CUDA_VISIBLE_DEVICES"), torch.cuda.device_count())
if torch.cuda.is_available():
test = torch.ones(1, device="cuda:0")
torch.cuda.synchronize()
print("allocation:", test.device)
如果换包后仍得到 build CUDA=None,检查作业脚本激活的环境、cpuonly 约束以及 pip/Conda 混装结果。若构建带 CUDA/NCCL 但设备不可用,转查调度分配、驱动和容器映射,不再重复修包名。
torch 修复后还要核对 DeepSpeed 与 Transformers 对应版本,尤其自编译扩展的工具链。预编译运行库与系统 nvcc 不要求永远逐字相等,扩展编译则另按项目要求检查。
最后做两进程最小 collective,再用极小训练批次验证 DeepSpeed 初始化。无需立即启动完整 ProtGPT-2 微调;构建检查通过不等于分布式通信和训练全部通过。
参考:原始求助帖;技术依据:PyTorch 分布式(2.5)、PyTorch 历史安装组合、PyTorch CUDA 语义(2.5)、Transformers Trainer(4.46)。