如何检查 CUDA 是否可用?完整验证指南¶
问题背景¶
最近在配置深度学习环境时,遇到了一个常见问题:如何确认 CUDA 是否正确安装并可用?
这个问题看似简单,但实际上涉及到多个层面的检查: - CUDA 驱动是否安装? - CUDA Toolkit 是否正确配置? - GPU 是否被系统识别? - Python 环境能否调用 CUDA?
今天这篇文章,我会分享一套完整的 CUDA 可用性检查方法,帮你快速定位问题。
环境信息¶
- 操作系统:Linux / Windows / macOS
- CUDA 版本:11.8 / 12.0+
- Python 版本:3.8+
检查方法¶
方法 1:使用 nvidia-smi 命令(最基础)¶
这是最直接的方法,检查 NVIDIA 驱动是否安装。
Linux / Windows¶
nvidia-smi
预期输出:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.12 Driver Version: 525.85.12 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 On | N/A |
| 0% 45C P8 12W / 250W | 123MiB / 12288MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
判断标准: - ✅ 如果能看到 GPU 信息 → 驱动已安装 - ✅ 如果显示 "CUDA Version: 12.0" → CUDA 驱动可用 - ❌ 如果提示 "command not found" → 驱动未安装
macOS¶
macOS 不支持 NVIDIA GPU(M1/M2 芯片),所以无法使用 nvidia-smi。
方法 2:检查 CUDA Toolkit 版本¶
如果 nvidia-smi 显示驱动已安装,接下来检查 CUDA Toolkit。
Linux / Windows¶
nvcc --version
预期输出:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
判断标准: - ✅ 显示版本号 → CUDA Toolkit 已安装 - ❌ 提示 "command not found" → 需要安装 CUDA Toolkit
注意:nvcc 版本和 nvidia-smi 显示的 CUDA Version 可能不同:
- nvidia-smi 显示的是驱动支持的最高 CUDA 版本
- nvcc --version 显示的是实际安装的 CUDA Toolkit 版本
方法 3:使用 Python 检查(最实用)¶
对于深度学习开发者,这是最常用的方法。
安装 PyTorch 检查¶
import torch
# 检查 CUDA 是否可用
print(f"CUDA available: {torch.cuda.is_available()}")
# 检查 CUDA 版本
if torch.cuda.is_available():
print(f"CUDA version: {torch.version.cuda}")
print(f"cuDNN version: {torch.backends.cudnn.version()}")
print(f"GPU count: {torch.cuda.device_count()}")
print(f"GPU name: {torch.cuda.get_device_name(0)}")
预期输出:
CUDA available: True
CUDA version: 12.1
cuDNN version: 8902
GPU count: 1
GPU name: NVIDIA GeForce RTX 4090
判断标准:
- ✅ torch.cuda.is_available() 返回 True → CUDA 可用
- ❌ 返回 False → CUDA 不可用,需要检查环境
安装 TensorFlow 检查¶
import tensorflow as tf
# 检查 GPU 是否可用
print(f"GPU available: {tf.config.list_physical_devices('GPU')}")
# 检查 CUDA 版本
print(f"CUDA version: {tf.sysconfig.get_build_info()['cuda_version']}")
print(f"cuDNN version: {tf.sysconfig.get_build_info()['cudnn_version']}")
预期输出:
GPU available: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
CUDA version: 12.1
cuDNN version: 8.9
方法 4:运行简单 CUDA 程序验证¶
如果以上方法都显示 CUDA 可用,最后用实际程序验证。
使用 PyTorch 运行 GPU 计算¶
import torch
# 创建张量并移到 GPU
if torch.cuda.is_available():
x = torch.randn(1000, 1000).cuda()
y = torch.randn(1000, 1000).cuda()
# 执行矩阵乘法(GPU 计算)
z = torch.matmul(x, y)
print(f"计算完成,结果形状: {z.shape}")
print(f"结果在 GPU: {z.is_cuda}")
else:
print("CUDA 不可用,无法执行 GPU 计算")
判断标准: - ✅ 程序正常运行,无报错 → CUDA 完全可用 - ❌ 报错 "CUDA out of memory" → CUDA 可用但显存不足 - ❌ 报错 "CUDA error" → CUDA 配置有问题
常见问题排查¶
问题 1:nvidia-smi 可用,但 torch.cuda.is_available() 返回 False¶
可能原因: 1. PyTorch 版本与 CUDA 版本不匹配 2. PyTorch 安装时未选择 CUDA 版本
解决方法:
# 卸载当前 PyTorch
pip uninstall torch torchvision torchaudio
# 重新安装匹配的 PyTorch(以 CUDA 12.1 为例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
问题 2:CUDA 版本不匹配¶
检查方法:
# 检查驱动支持的 CUDA 版本
nvidia-smi | grep "CUDA Version"
# 检查安装的 CUDA Toolkit 版本
nvcc --version
# 检查 PyTorch 编译时的 CUDA 版本
python -c "import torch; print(torch.version.cuda)"
解决方法: - 确保三者版本兼容(驱动版本 ≥ Toolkit 版本 ≥ PyTorch 编译版本) - 推荐使用相同的主版本号(如都是 12.x)
问题 3:多 GPU 环境只识别到一个¶
检查方法:
import torch
print(f"GPU count: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
解决方法: - 检查 GPU 是否都在同一台机器上 - 检查 PCIe 连接 - 检查驱动是否正确识别所有 GPU
完整检查脚本¶
为了方便使用,这里提供一个完整的检查脚本:
#!/usr/bin/env python3
"""
CUDA 可用性完整检查脚本
"""
import sys
import subprocess
def check_nvidia_smi():
"""检查 nvidia-smi 命令"""
try:
result = subprocess.run(['nvidia-smi'],
capture_output=True,
text=True)
if result.returncode == 0:
print("✅ nvidia-smi: 可用")
print(result.stdout.split('\n')[0]) # 显示第一行(版本信息)
return True
else:
print("❌ nvidia-smi: 不可用")
return False
except FileNotFoundError:
print("❌ nvidia-smi: 未找到命令(驱动可能未安装)")
return False
def check_nvcc():
"""检查 nvcc 命令"""
try:
result = subprocess.run(['nvcc', '--version'],
capture_output=True,
text=True)
if result.returncode == 0:
print("✅ nvcc: 可用")
# 提取版本号
for line in result.stdout.split('\n'):
if 'release' in line:
print(f" {line.strip()}")
break
return True
else:
print("❌ nvcc: 不可用")
return False
except FileNotFoundError:
print("❌ nvcc: 未找到命令(CUDA Toolkit 可能未安装)")
return False
def check_pytorch():
"""检查 PyTorch CUDA 支持"""
try:
import torch
print(f"\n📦 PyTorch 版本: {torch.__version__}")
if torch.cuda.is_available():
print("✅ PyTorch CUDA: 可用")
print(f" CUDA 版本: {torch.version.cuda}")
print(f" GPU 数量: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f" GPU {i}: {torch.cuda.get_device_name(i)}")
# 测试 GPU 计算
try:
x = torch.randn(100, 100).cuda()
y = torch.randn(100, 100).cuda()
z = torch.matmul(x, y)
print("✅ GPU 计算测试: 通过")
except Exception as e:
print(f"❌ GPU 计算测试: 失败 - {e}")
return True
else:
print("❌ PyTorch CUDA: 不可用")
print(" 可能原因:")
print(" 1. PyTorch 版本与 CUDA 版本不匹配")
print(" 2. PyTorch 安装时未选择 CUDA 版本")
return False
except ImportError:
print("❌ PyTorch: 未安装")
return False
def main():
print("=" * 50)
print("CUDA 可用性检查")
print("=" * 50)
results = []
print("\n1️⃣ 检查 NVIDIA 驱动...")
results.append(("NVIDIA 驱动", check_nvidia_smi()))
print("\n2️⃣ 检查 CUDA Toolkit...")
results.append(("CUDA Toolkit", check_nvcc()))
print("\n3️⃣ 检查 PyTorch CUDA 支持...")
results.append(("PyTorch CUDA", check_pytorch()))
print("\n" + "=" * 50)
print("检查结果汇总")
print("=" * 50)
all_ok = True
for name, status in results:
status_icon = "✅" if status else "❌"
print(f"{status_icon} {name}: {'可用' if status else '不可用'}")
if not status:
all_ok = False
print("\n" + "=" * 50)
if all_ok:
print("🎉 所有检查通过!CUDA 环境配置正确。")
else:
print("⚠️ 部分检查未通过,请根据上述提示进行排查。")
print("=" * 50)
if __name__ == "__main__":
main()
使用方法:
# 保存为 check_cuda.py
python check_cuda.py
总结¶
检查 CUDA 是否可用,需要从多个层面验证:
- 驱动层面:
nvidia-smi命令 - 工具层面:
nvcc --version命令 - 应用层面:Python 库(PyTorch/TensorFlow)检查
- 实际验证:运行 GPU 计算测试
推荐流程:
- 快速检查:nvidia-smi + torch.cuda.is_available()
- 完整检查:运行上面的完整检查脚本
- 问题排查:根据错误信息对照常见问题
记住:只有所有层面都通过,CUDA 才算真正可用。
参考资料¶
最后更新:2025-12-03 测试环境:Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.1