adaptive_rag / colab_gpu_test.py
lanny xu
Initial commit
399f3c6
raw
history blame
8.9 kB
#!/usr/bin/env python3
"""
Google Colab GPU检测和GraphRAG性能测试脚本
可以直接在Colab中运行:python colab_gpu_test.py
"""
import sys
import time
import torch
import numpy as np
from typing import List, Dict
def print_section(title: str):
"""打印分节标题"""
print("\n" + "="*60)
print(f"{title}")
print("="*60 + "\n")
def test_gpu_availability():
"""测试GPU可用性"""
print_section("🔍 GPU环境检测")
cuda_available = torch.cuda.is_available()
print(f"✅ CUDA可用: {cuda_available}")
if cuda_available:
print(f" GPU数量: {torch.cuda.device_count()}")
print(f" 当前GPU: {torch.cuda.current_device()}")
print(f" GPU名称: {torch.cuda.get_device_name(0)}")
print(f" CUDA版本: {torch.version.cuda}")
total_memory = torch.cuda.get_device_properties(0).total_memory / (1024**3)
print(f" 总显存: {total_memory:.2f} GB")
return True
else:
print("\n⚠️ 警告: 未检测到GPU")
print(" 在Colab中启用GPU: 运行时 → 更改运行时类型 → GPU")
return False
def benchmark_matrix_multiplication(matrix_size=5000):
"""GPU vs CPU 矩阵运算性能测试"""
print_section("⚡ GPU vs CPU 矩阵运算性能测试")
print(f"矩阵大小: {matrix_size}x{matrix_size}\n")
# CPU测试
print("🔵 CPU测试...")
a_cpu = torch.randn(matrix_size, matrix_size)
b_cpu = torch.randn(matrix_size, matrix_size)
start = time.time()
c_cpu = torch.mm(a_cpu, b_cpu)
cpu_time = time.time() - start
print(f" CPU时间: {cpu_time:.2f} 秒")
# GPU测试
if torch.cuda.is_available():
print("\n🟢 GPU测试...")
a_gpu = torch.randn(matrix_size, matrix_size).cuda()
b_gpu = torch.randn(matrix_size, matrix_size).cuda()
# 预热GPU
_ = torch.mm(a_gpu, b_gpu)
torch.cuda.synchronize()
start = time.time()
c_gpu = torch.mm(a_gpu, b_gpu)
torch.cuda.synchronize()
gpu_time = time.time() - start
print(f" GPU时间: {gpu_time:.2f} 秒")
speedup = cpu_time / gpu_time
print(f"\n🚀 加速比: {speedup:.2f}x")
print(f" GPU比CPU快 {speedup:.1f} 倍!")
return speedup
else:
print("\n⚠️ 跳过GPU测试(GPU不可用)")
return 1.0
def test_text_embedding_performance():
"""测试文本嵌入性能(需要sentence-transformers)"""
print_section("📝 文本嵌入性能测试")
try:
from sentence_transformers import SentenceTransformer
# 准备测试数据
test_texts = [
"Large Language Models are transforming AI",
"GraphRAG combines knowledge graphs with retrieval",
"GPU acceleration significantly improves performance",
"Natural language processing is advancing rapidly",
] * 250 # 1000个文本
print(f"测试数据: {len(test_texts)} 个文本\n")
# CPU测试
print("🔵 CPU嵌入测试...")
model_cpu = SentenceTransformer(
'sentence-transformers/all-MiniLM-L6-v2',
device='cpu'
)
start = time.time()
embeddings_cpu = model_cpu.encode(test_texts, show_progress_bar=False, batch_size=32)
cpu_time = time.time() - start
print(f" CPU时间: {cpu_time:.2f}秒")
print(f" 速度: {len(test_texts)/cpu_time:.1f} 文本/秒")
# GPU测试
if torch.cuda.is_available():
print("\n🟢 GPU嵌入测试...")
model_gpu = SentenceTransformer(
'sentence-transformers/all-MiniLM-L6-v2',
device='cuda'
)
start = time.time()
embeddings_gpu = model_gpu.encode(test_texts, show_progress_bar=False, batch_size=32)
gpu_time = time.time() - start
print(f" GPU时间: {gpu_time:.2f}秒")
print(f" 速度: {len(test_texts)/gpu_time:.1f} 文本/秒")
speedup = cpu_time / gpu_time
print(f"\n🚀 加速比: {speedup:.2f}x")
print(f" 节省时间: {cpu_time - gpu_time:.2f}秒")
return speedup
else:
print("\n⚠️ 跳过GPU测试")
return 1.0
except ImportError:
print("⚠️ sentence-transformers未安装")
print(" 安装: pip install sentence-transformers")
return None
def monitor_gpu_memory():
"""监控GPU显存使用"""
if not torch.cuda.is_available():
return
print_section("💾 GPU显存使用情况")
allocated = torch.cuda.memory_allocated(0) / (1024**3)
reserved = torch.cuda.memory_reserved(0) / (1024**3)
total = torch.cuda.get_device_properties(0).total_memory / (1024**3)
print(f"已分配: {allocated:.2f} GB")
print(f"已保留: {reserved:.2f} GB")
print(f"总显存: {total:.2f} GB")
print(f"使用率: {(allocated/total)*100:.1f}%")
def generate_performance_report(matrix_speedup, embedding_speedup):
"""生成性能报告"""
print_section("📈 性能测试总结报告")
print("🖥️ 硬件信息:")
if torch.cuda.is_available():
print(f" GPU型号: {torch.cuda.get_device_name(0)}")
print(f" 显存: {torch.cuda.get_device_properties(0).total_memory / (1024**3):.2f} GB")
print(f" CUDA版本: {torch.version.cuda}")
else:
print(" ⚠️ GPU不可用")
print(f"\n PyTorch版本: {torch.__version__}")
print(f" Python版本: {sys.version.split()[0]}")
print("\n⚡ 性能测试结果:")
print(f" 矩阵运算加速: {matrix_speedup:.2f}x")
if embedding_speedup:
print(f" 文本嵌入加速: {embedding_speedup:.2f}x")
print("\n💡 建议:")
if torch.cuda.is_available():
print(" ✅ GPU运行良好!")
print(" ✅ 建议在Colab上运行完整的GraphRAG索引构建")
print(" ✅ 预计索引构建时间将缩短 3-5 倍")
# 估算时间节省
if embedding_speedup and embedding_speedup > 1:
print(f"\n⏱️ 时间节省估算:")
print(f" 100文档CPU耗时: ~15分钟")
print(f" 100文档GPU耗时: ~{15/embedding_speedup:.1f}分钟")
print(f" 节省: ~{15 - 15/embedding_speedup:.1f}分钟")
else:
print(" ⚠️ 建议启用GPU以获得最佳性能")
print(" ⚠️ Colab启用GPU: 运行时 → 更改运行时类型 → GPU")
def install_dependencies():
"""安装必要的依赖(仅在Colab中)"""
try:
import google.colab
is_colab = True
except:
is_colab = False
if is_colab:
print_section("📦 安装依赖")
print("检测到Colab环境,安装必要的包...\n")
import subprocess
packages = [
'sentence-transformers',
'networkx',
'python-louvain',
]
for package in packages:
try:
__import__(package.replace('-', '_'))
print(f"✅ {package} 已安装")
except ImportError:
print(f"📥 安装 {package}...")
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '-q', package])
print(f"✅ {package} 安装完成")
def main():
"""主函数"""
print("\n" + "="*60)
print("🚀 Google Colab GPU检测和GraphRAG性能测试")
print("="*60)
# 检查是否在Colab中运行
try:
import google.colab
print("\n✅ 运行环境: Google Colab")
except:
print("\n⚠️ 警告: 未检测到Colab环境")
print(" 本脚本专为Google Colab设计")
# 安装依赖
install_dependencies()
# 1. GPU检测
gpu_available = test_gpu_availability()
# 2. 矩阵运算性能测试
matrix_speedup = benchmark_matrix_multiplication(matrix_size=5000)
# 3. 文本嵌入性能测试
embedding_speedup = test_text_embedding_performance()
# 4. 显存监控
if gpu_available:
monitor_gpu_memory()
# 5. 生成报告
generate_performance_report(matrix_speedup, embedding_speedup)
print("\n" + "="*60)
print("✅ 测试完成!")
print("="*60)
print("\n📚 下一步:")
print(" 1. 如果GPU测试成功,可以上传完整的adaptive_RAG项目")
print(" 2. 运行 main_graphrag.py 进行完整的知识图谱构建")
print(" 3. 享受GPU带来的3-5倍速度提升!")
if __name__ == "__main__":
main()