原帖在控制台查 CUDA 可用为 True,但训练初始化却失败;还把 nvcc 当作 Python 名字执行:
RuntimeError: No CUDA GPUs are available
同一台电脑上的两个入口也可能环境不同
原题控制台返回 True,训练却在 _cuda_init 失败。先把检查嵌入训练脚本,而不是继续在另一个控制台重复可用性查询。nvcc 是终端工具,Python 里出现 NameError 只说明把命令放错了地方,不能证明 GPU 驱动故障。
先确认“可用”的检查与“失败”的训练确实发生在同一个解释器、同一进程启动环境。不同 kernel 或环境变量会得到不同结果。
把检查放到原训练脚本开头:
import sys
import os
import torch
print("josh050608")
print("python:", sys.executable)
print("torch/CUDA:", torch.__version__, torch.version.cuda)
print("visible:", os.environ.get("CUDA_VISIBLE_DEVICES"))
print("available/count:", torch.cuda.is_available(), torch.cuda.device_count())
随后在相同进程实际分配 torch.ones(1,device='cuda:0')。如果这里就失败,先处理环境和 GPU 访问,再看 GPT-2 代码。
nvidia-smi 和 nvcc --version 是系统终端命令,不是 Python 语句;前者检查驱动和设备,后者只有安装 Toolkit 后才存在。预编译 torch 运行 CUDA 不一定需要本地 nvcc,缺少它不是这条运行错误的充分原因。
检查是否在 CUDA 初始化后修改 CUDA_VISIBLE_DEVICES,是否从没有 GPU 的容器/任务会话启动,以及训练与控制台是否用了不同环境。改变设备可见性应在启动 Python 前完成,之后重启进程。
如果 nvidia-smi 也无法访问设备,先修复驱动或会话权限;如果仅 torch 不行,再核对构建和驱动兼容性。验证路径是“同进程检查→小张量→小模型前向”,不能以另一个控制台的 True 作为训练环境正常的证据。
按“路径→可见性→分配→模型”验证
先比较训练与控制台的 sys.executable、torch.file、CUDA_VISIBLE_DEVICES 和设备数。若不同,选定同一个项目解释器并重启入口;若相同,再检查训练进程是否在初始化前后更改过可见性。
下面是需要真实 CUDA 的独立小计算,应由原训练解释器启动:
import torch
if not torch.cuda.is_available():
raise RuntimeError("当前训练进程没有可用 CUDA 设备")
if torch.cuda.device_count() < 1:
raise RuntimeError("本进程可见设备列表为空")
x = torch.arange(4, dtype=torch.float32, device="cuda:0")
y = x + 1
torch.cuda.synchronize()
assert y.cpu().tolist() == [1., 2., 3., 4.]
print("allocated/computed:", y.device, torch.cuda.get_device_name(0))
若 nvidia-smi 在系统终端也失败,先修宿主驱动或 GPU 会话权限;若系统正常而本进程失败,再核对构建和驱动兼容性。若只有容器/任务环境失败,检查设备是否确实分配给该进程。
不要为了得到 nvcc 命令就安装任意 Toolkit:运行预编译 torch 未必需要本地编译器。需要自定义 CUDA 扩展时,才另行检查工具链版本。
小分配和小计算通过后,再用极小 GPT-2 batch 验证模型前向。它可能暴露显存不足等新的问题,应按新的完整堆栈处理,不能把另一个控制台的 True 当作所有运行阶段已通过。
参考:原始求助帖;技术依据:PyTorch CUDA 语义(2.5)、PyTorch CUDA 环境变量(2.5)、PyTorch 官方安装指南。