import torch import onnxruntime as ort import insightface import subprocess import sys import os def detailed_diagnosis(): """详细诊断脚本""" print("=" * 60) print("详细CUDA诊断") print("=" * 60) # 1. 系统信息 print("\n📋 1. 系统信息:") print(f"Python版本: {sys.version}") print(f"Python路径: {sys.executable}") print(f"Conda环境: {sys.prefix}") # 2. PyTorch详细信息 print("\n🔥 2. PyTorch详细信息:") print(f"PyTorch版本: {torch.__version__}") print(f"PyTorch路径: {torch.__file__}") print(f"CUDA可用: {torch.cuda.is_available()}") if torch.cuda.is_available(): 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)}") print(f" 内存: {torch.cuda.get_device_properties(i).total_memory / 1024 ** 3:.1f} GB") else: print("❌ PyTorch无法使用CUDA") # 检查可能的原因 print("\n🔍 PyTorch CUDA问题排查:") print(f" torch.cuda.is_available(): {torch.cuda.is_available()}") try: print(f" CUDA设备数量: {torch.cuda.device_count()}") except: print(" CUDA设备数量: 无法获取") # 3. ONNX Runtime详细信息 print("\n⚡ 3. ONNX Runtime详细信息:") print(f"ONNX Runtime版本: {ort.__version__}") print(f"ONNX Runtime路径: {ort.__file__}") available_providers = ort.get_available_providers() print(f"可用Providers: {available_providers}") if 'CUDAExecutionProvider' in available_providers: print("✅ CUDAExecutionProvider可用") # 测试CUDA provider try: options = ort.SessionOptions() session = ort.InferenceSession( os.path.join(os.path.dirname(insightface.__file__), 'models', 'buffalo_l', '1k3d68.onx'), providers=['CUDAExecutionProvider'], sess_options=options ) print("✅ CUDAExecutionProvider测试通过") except Exception as e: print(f"❌ CUDAExecutionProvider测试失败: {e}") else: print("❌ CUDAExecutionProvider不可用") # 4. InsightFace信息 print("\n👁️ 4. InsightFace信息:") print(f"InsightFace版本: {insightface.__version__}") print(f"InsightFace路径: {insightface.__file__}") # 5. 系统CUDA检查 print("\n🖥️ 5. 系统CUDA检查:") try: # 检查nvidia-smi result = subprocess.run(['nvidia-smi'], capture_output=True, text=True, timeout=10) if result.returncode == 0: print("✅ nvidia-smi可用") # 提取关键信息 lines = result.stdout.split('\n') for line in lines: if 'Driver Version' in line: print(f" 驱动版本: {line.strip()}") if 'CUDA Version' in line: print(f" CUDA版本: {line.strip()}") else: print("❌ nvidia-smi不可用") except (subprocess.TimeoutExpired, FileNotFoundError, Exception) as e: print(f"❌ nvidia-smi执行失败: {e}") try: # 检查nvcc result = subprocess.run(['nvcc', '--version'], capture_output=True, text=True, timeout=5) if result.returncode == 0: print("✅ nvcc可用") version_line = result.stdout.split('\n')[3] if len(result.stdout.split('\n')) > 3 else result.stdout print(f" {version_line.strip()}") else: print("❌ nvcc不可用") except (subprocess.TimeoutExpired, FileNotFoundError, Exception) as e: print(f"❌ nvcc执行失败: {e}") # 6. 环境变量检查 print("\n🌍 6. 环境变量检查:") cuda_paths = [] for key, value in os.environ.items(): if 'CUDA' in key.upper() or 'CUDNN' in key.upper(): print(f" {key}: {value}") if 'PATH' in key or 'HOME' in key: cuda_paths.append((key, value)) # 7. 包版本兼容性检查 print("\n📦 7. 包版本兼容性检查:") try: import pkg_resources packages = ['torch', 'torchvision', 'torchaudio', 'onnxruntime', 'insightface', 'opencv-python', 'numpy'] for pkg in packages: try: version = pkg_resources.get_distribution(pkg).version print(f" {pkg}: {version}") except: print(f" {pkg}: 未安装") except: print(" 无法检查包版本") # 8. 实际性能测试 print("\n🚀 8. 实际性能测试:") try: # 测试InsightFace实际使用 app_cpu = insightface.app.FaceAnalysis(name='buffalo_l') app_cpu.prepare(ctx_id=-1) # 强制CPU app_gpu = insightface.app.FaceAnalysis(name='buffalo_l') app_gpu.prepare(ctx_id=0) # 强制GPU # 创建测试图像 import numpy as np import cv2 test_img = np.random.randint(0, 255, (640, 640, 3), dtype=np.uint8) # CPU测试 import time print(" CPU测试...") start_time = time.time() for _ in range(5): faces_cpu = app_cpu.get(test_img) cpu_time = (time.time() - start_time) * 1000 / 5 # GPU测试 print(" GPU测试...") start_time = time.time() for _ in range(5): faces_gpu = app_gpu.get(test_img) gpu_time = (time.time() - start_time) * 1000 / 5 print(f" CPU平均时间: {cpu_time:.1f}ms") print(f" GPU平均时间: {gpu_time:.1f}ms") if gpu_time < cpu_time * 0.8: # GPU应该比CPU快 print(" ✅ GPU加速生效") else: print(" ⚠️ GPU加速未生效或效果不明显") except Exception as e: print(f" ❌ 性能测试失败: {e}") def check_package_installation(): """检查包安装情况""" print("\n" + "=" * 60) print("包安装检查") print("=" * 60) packages = { 'torch': 'PyTorch (深度学习框架)', 'torchvision': 'PyTorch视觉库', 'torchaudio': 'PyTorch音频库', 'onnxruntime': 'ONNX Runtime (推理引擎)', 'insightface': '人脸识别库', 'opencv-python': 'OpenCV (图像处理)', 'numpy': '数值计算库' } for pkg, desc in packages.items(): try: if pkg == 'torch': import torch version = torch.__version__ cuda_status = "✅ CUDA可用" if torch.cuda.is_available() else "❌ CUDA不可用" print(f"{pkg} ({desc}): {version} {cuda_status}") elif pkg == 'onnxruntime': import onnxruntime as ort version = ort.__version__ providers = ort.get_available_providers() cuda_status = "✅ 有GPU支持" if 'CUDAExecutionProvider' in providers else "❌ 无GPU支持" print(f"{pkg} ({desc}): {version} {cuda_status}") else: module = __import__(pkg) version = getattr(module, '__version__', '未知版本') print(f"{pkg} ({desc}): {version}") except ImportError: print(f"{pkg} ({desc}): ❌ 未安装") if __name__ == "__main__": detailed_diagnosis() check_package_installation() # 提供解决方案 print("\n" + "=" * 60) print("解决方案建议") print("=" * 60) # 基于诊断结果给出建议 if not torch.cuda.is_available(): print("\n❌ 主要问题: PyTorch没有CUDA支持") print("💡 解决方案:") print("1. 完全卸载当前PyTorch:") print(" pip uninstall torch torchvision torchaudio") print("2. 安装GPU版本的PyTorch:") print(" pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118") if 'CUDAExecutionProvider' not in ort.get_available_providers(): print("\n❌ 主要问题: ONNX Runtime没有GPU支持") print("💡 解决方案:") print("1. 卸载CPU版本:") print(" pip uninstall onnxruntime") print("2. 安装GPU版本:") print(" pip install onnxruntime-gpu") # 通用建议 print("\n🔄 通用建议:") print("1. 创建全新的conda环境:") print(" conda create -n face_gpu python=3.10") print(" conda activate face_gpu") print("2. 按顺序安装:") print(" pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118") print(" pip install onnxruntime-gpu") print(" pip install insightface opencv-python") print("3. 验证安装:") print( " python -c \"import torch; print(f'PyTorch CUDA: {torch.cuda.is_available()}'); import onnxruntime as ort; print(f'ONNX Providers: {ort.get_available_providers()}')\"")