Files
SkyLi fd1a5f4050 chore: initial commit for Infrared Equipment Detection System
- Add YOLO-based infrared thermal image detection system
- Add dataset configuration (dataset.yaml) with 12 equipment classes
- Add training, validation and detection scripts
- Add temperature feature extraction and fault diagnosis modules
- Update README and CLAUDE.md with correct dataset paths
- Optimize .gitignore to track dataset.yaml while ignoring large data files
2026-03-26 21:36:08 +08:00

231 lines
6.1 KiB
Python

#!/usr/bin/env python3
"""
CUDA和cuDNN环境测试脚本
验证PyTorch GPU支持是否正常
"""
import sys
import os
def test_cuda():
"""测试CUDA支持"""
print("=" * 50)
print("CUDA 环境测试")
print("=" * 50)
try:
import torch
print(f"PyTorch版本: {torch.__version__}")
print(f"CUDA可用: {torch.cuda.is_available()}")
if not torch.cuda.is_available():
print("错误: CUDA不可用")
return False
print(f"CUDA版本: {torch.version.cuda}")
# 检查cuDNN版本
try:
cudnn_ver = torch.backends.cudnn.version()
print(f"cuDNN版本: {cudnn_ver}")
except RuntimeError as e:
print(f"cuDNN版本检测失败: {e}")
print("警告: cuDNN可能无法正常使用,但GPU张量运算可能仍然正常")
return False
print(f"GPU数量: {torch.cuda.device_count()}")
for i in range(torch.cuda.device_count()):
print(f"\nGPU {i}:")
print(f" 名称: {torch.cuda.get_device_name(i)}")
props = torch.cuda.get_device_properties(i)
print(f" 计算能力: {props.major}.{props.minor}")
print(f" 总内存: {props.total_memory / 1024**3:.2f} GB")
return True
except ImportError:
print("错误: PyTorch未安装")
return False
def test_gpu_tensor_ops():
"""测试GPU张量运算"""
print("\n" + "=" * 50)
print("GPU 张量运算测试")
print("=" * 50)
try:
import torch
if not torch.cuda.is_available():
print("错误: CUDA不可用,跳过GPU测试")
return False
# 创建张量并进行运算
print("创建1000x1000随机张量...")
x = torch.randn(1000, 1000).cuda()
y = torch.randn(1000, 1000).cuda()
print("执行矩阵乘法...")
z = torch.matmul(x, y)
print("执行归约操作...")
result = z.sum().item()
print(f"结果: {result:.2f}")
print("GPU张量运算测试通过!")
return True
except Exception as e:
print(f"错误: {e}")
return False
def test_cudnn():
"""测试cuDNN加速"""
print("\n" + "=" * 50)
print("cuDNN 加速测试")
print("=" * 50)
try:
import torch
if not torch.cuda.is_available():
print("错误: CUDA不可用")
return False
# 检查cuDNN是否启用
print(f"cuDNN可用: {torch.backends.cudnn.is_available()}")
try:
cudnn_ver = torch.backends.cudnn.version()
print(f"cuDNN版本: {cudnn_ver}")
except RuntimeError as e:
print(f"cuDNN版本检测跳过: {e}")
print("注意: PyTorch绑定的cuDNN与系统版本可能不匹配,但不影响GPU使用")
print(f"cuDNN基准测试启用: {torch.backends.cudnn.benchmark}")
# cuDNN卷积测试
print("\n执行cuDNN卷积测试...")
x = torch.randn(1, 3, 224, 224).cuda()
conv = torch.nn.Conv2d(3, 64, kernel_size=3, padding=1).cuda()
# 预热
_ = conv(x)
# 计时测试
import time
start = time.time()
for _ in range(10):
_ = conv(x)
torch.cuda.synchronize()
elapsed = time.time() - start
print(f"10次卷积耗时: {elapsed*1000:.2f} ms")
print("cuDNN测试通过!")
return True
except Exception as e:
print(f"错误: {e}")
return False
def test_ultralytics_gpu():
"""测试ultralytics YOLO GPU支持"""
print("\n" + "=" * 50)
print("Ultralytics YOLO GPU 测试")
print("=" * 50)
try:
from ultralytics import YOLO
import torch
import os
# 确保使用GPU加载模型
if not torch.cuda.is_available():
print("错误: CUDA不可用")
return False
print("加载YOLOv8n模型到GPU...")
# 关键:加载模型时指定device=0,确保模型在GPU上
model = YOLO("yolov8n.pt", task="detect")
# 将模型移到GPU
model.to("cuda:0")
print(f"模型设备: {next(model.model.parameters()).device}")
# 使用本地测试图像进行推理
test_image = "bus.jpg"
if not os.path.exists(test_image):
print("下载测试图像...")
import urllib.request
urllib.request.urlretrieve(
"https://ultralytics.com/images/bus.jpg",
test_image
)
print("执行GPU推理测试...")
# 关键:device=0指定使用GPU
results = model(test_image, device=0, verbose=False)
# 验证结果
num_detections = len(results[0].boxes)
print(f"检测到 {num_detections} 个目标")
# 检查模型是否真的在GPU上运行
model_device = next(model.model.parameters()).device
print(f"模型实际设备: {model_device}")
assert model_device.type == "cuda", "模型未在GPU上运行!"
print("YOLO GPU测试通过!")
return True
except ImportError:
print("错误: ultralytics未安装")
return False
except Exception as e:
print(f"错误: {e}")
return False
def main():
"""主函数"""
print("\n" + "#" * 50)
print("# 红外故障检测 - CUDA/cuDNN 环境测试")
print("#" * 50 + "\n")
results = {
"CUDA": test_cuda(),
"GPU张量运算": test_gpu_tensor_ops(),
"cuDNN": test_cudnn(),
"YOLO GPU": test_ultralytics_gpu(),
}
print("\n" + "=" * 50)
print("测试结果汇总")
print("=" * 50)
all_passed = True
for name, passed in results.items():
status = "✅ 通过" if passed else "❌ 失败"
print(f"{name}: {status}")
if not passed:
all_passed = False
print("\n" + "=" * 50)
if all_passed:
print("所有测试通过! 环境配置正确。")
else:
print("部分测试失败,请检查环境配置。")
print("=" * 50)
return 0 if all_passed else 1
if __name__ == "__main__":
sys.exit(main())