File size: 9,934 Bytes
399f3c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#!/usr/bin/env python3
"""
Google Colab一键GPU测试脚本
复制此文件内容到Colab单元格中直接运行

使用方法:
1. 在Colab中创建新笔记本
2. 启用GPU (运行时 → 更改运行时类型 → GPU)
3. 复制并运行此脚本
"""

# ============================================================
# 🔧 自动安装依赖
# ============================================================
print("📦 检查并安装依赖...")
import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", package])

# 检查必要的包
required_packages = {
    'torch': 'torch',
    'sentence_transformers': 'sentence-transformers',
    'networkx': 'networkx',
    'numpy': 'numpy'
}

for import_name, package_name in required_packages.items():
    try:
        __import__(import_name)
        print(f"✅ {package_name} 已安装")
    except ImportError:
        print(f"📥 安装 {package_name}...")
        install(package_name)

print("\n" + "="*70)
print("🚀 Google Colab GPU性能测试 - GraphRAG加速验证")
print("="*70)

# ============================================================
# 1️⃣ GPU检测
# ============================================================
import torch
import time

print("\n" + "="*70)
print("🔍 步骤1: GPU环境检测")
print("="*70)

cuda_available = torch.cuda.is_available()
print(f"\n{'✅' if cuda_available else '❌'} CUDA可用: {cuda_available}")

if cuda_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}")
    print(f"   📈 PyTorch版本: {torch.__version__}")
else:
    print("\n⚠️  GPU未启用!")
    print("   请按照以下步骤启用GPU:")
    print("   1. 点击顶部菜单 '运行时'")
    print("   2. 选择 '更改运行时类型'")
    print("   3. 硬件加速器选择 'GPU'")
    print("   4. 点击 '保存'")
    print("   5. 重新运行此单元格")
    print("\n⚠️  测试将继续,但GPU相关测试会被跳过")

# ============================================================
# 2️⃣ 矩阵运算性能测试
# ============================================================
print("\n" + "="*70)
print("⚡ 步骤2: 矩阵运算性能测试")
print("="*70)

matrix_size = 5000
print(f"\n测试配置: {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:.3f}秒")

# GPU测试
if cuda_available:
    print("\n🟢 GPU性能测试...")
    a_gpu = torch.randn(matrix_size, matrix_size).cuda()
    b_gpu = torch.randn(matrix_size, matrix_size).cuda()
    
    # 预热
    _ = 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:.3f}秒")
    
    speedup = cpu_time / gpu_time
    print(f"\n   🚀 性能提升: {speedup:.1f}x")
    print(f"   💡 GPU比CPU快 {speedup:.1f} 倍!")
    
    matrix_speedup = speedup
else:
    print("\n⚠️  跳过GPU测试")
    matrix_speedup = 1.0

# ============================================================
# 3️⃣ 文本嵌入性能测试
# ============================================================
print("\n" + "="*70)
print("📝 步骤3: 文本嵌入性能测试 (GraphRAG核心组件)")
print("="*70)

try:
    from sentence_transformers import SentenceTransformer
    
    # 准备测试数据
    test_texts = [
        "GraphRAG combines knowledge graphs with retrieval augmented generation",
        "GPU acceleration significantly improves machine learning performance",
        "Large language models benefit from efficient embedding computation",
        "Knowledge graph construction requires entity and relation extraction",
    ] * 250  # 1000条文本
    
    print(f"\n测试配置: {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_emb_time = time.time() - start
    
    print(f"   ⏱️  CPU耗时: {cpu_emb_time:.2f}秒")
    print(f"   📊 处理速度: {len(test_texts)/cpu_emb_time:.1f} 文本/秒")
    
    # GPU嵌入
    if cuda_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_emb_time = time.time() - start
        
        print(f"   ⏱️  GPU耗时: {gpu_emb_time:.2f}秒")
        print(f"   📊 处理速度: {len(test_texts)/gpu_emb_time:.1f} 文本/秒")
        
        emb_speedup = cpu_emb_time / gpu_emb_time
        print(f"\n   🚀 性能提升: {emb_speedup:.1f}x")
        print(f"   ⏱️  节省时间: {cpu_emb_time - gpu_emb_time:.2f}秒")
    else:
        print("\n⚠️  跳过GPU测试")
        emb_speedup = 1.0
        
except ImportError:
    print("\n⚠️  sentence-transformers未安装,跳过此测试")
    emb_speedup = None

# ============================================================
# 4️⃣ GraphRAG场景模拟
# ============================================================
print("\n" + "="*70)
print("🔍 步骤4: GraphRAG实际场景模拟")
print("="*70)

if cuda_available and emb_speedup:
    print("\n模拟GraphRAG索引构建过程...\n")
    
    # 假设100个文档块的索引构建
    documents_count = 100
    
    # 实体提取时间 (每个文档约1秒)
    entity_extraction_time = documents_count * 1.0
    
    # 文本嵌入时间 (基于实际测试)
    # 假设每个文档平均产生10个实体,共1000个实体需要嵌入
    entities_count = documents_count * 10
    
    cpu_total_time = entity_extraction_time + (entities_count / (len(test_texts)/cpu_emb_time))
    gpu_total_time = entity_extraction_time + (entities_count / (len(test_texts)/gpu_emb_time))
    
    print(f"📊 场景: {documents_count}个文档的GraphRAG索引构建\n")
    print(f"🔵 CPU预计时间:")
    print(f"   - 实体提取: {entity_extraction_time/60:.1f}分钟")
    print(f"   - 向量嵌入: {(entities_count / (len(test_texts)/cpu_emb_time))/60:.1f}分钟")
    print(f"   - 总计: {cpu_total_time/60:.1f}分钟")
    
    print(f"\n🟢 GPU预计时间:")
    print(f"   - 实体提取: {entity_extraction_time/60:.1f}分钟 (相同)")
    print(f"   - 向量嵌入: {(entities_count / (len(test_texts)/gpu_emb_time))/60:.1f}分钟")
    print(f"   - 总计: {gpu_total_time/60:.1f}分钟")
    
    total_speedup = cpu_total_time / gpu_total_time
    time_saved = (cpu_total_time - gpu_total_time) / 60
    
    print(f"\n🚀 整体加速: {total_speedup:.1f}x")
    print(f"⏱️  节省时间: {time_saved:.1f}分钟")

# ============================================================
# 5️⃣ GPU显存监控
# ============================================================
if cuda_available:
    print("\n" + "="*70)
    print("💾 步骤5: GPU显存使用监控")
    print("="*70)
    
    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"\n   已分配: {allocated:.2f} GB")
    print(f"   已保留: {reserved:.2f} GB")
    print(f"   总显存: {total:.2f} GB")
    print(f"   使用率: {(allocated/total)*100:.1f}%")

# ============================================================
# 6️⃣ 性能总结
# ============================================================
print("\n" + "="*70)
print("📈 最终性能报告")
print("="*70)

print("\n🖥️  硬件配置:")
if cuda_available:
    print(f"   GPU: {torch.cuda.get_device_name(0)}")
    print(f"   显存: {torch.cuda.get_device_properties(0).total_memory / (1024**3):.1f} GB")
    print(f"   CUDA: {torch.version.cuda}")
else:
    print("   ⚠️  GPU未启用")

print(f"\n⚡ 性能测试结果:")
print(f"   矩阵运算加速: {matrix_speedup:.1f}x")
if emb_speedup:
    print(f"   文本嵌入加速: {emb_speedup:.1f}x")
    if cuda_available:
        print(f"   GraphRAG整体加速: {total_speedup:.1f}x")

print("\n💡 结论和建议:")
if cuda_available:
    print("   ✅ GPU性能测试成功!")
    print("   ✅ 强烈建议在Colab GPU环境运行GraphRAG")
    print(f"   ✅ 预计可节省 {time_saved:.0f}+ 分钟的索引构建时间")
    print("\n📚 下一步:")
    print("   1. 上传adaptive_RAG项目文件到Colab")
    print("   2. 运行 main_graphrag.py 构建完整知识图谱")
    print("   3. 下载结果到本地使用")
else:
    print("   ⚠️  请启用GPU以获得最佳性能")
    print("   ⚠️  路径: 运行时 → 更改运行时类型 → GPU")

print("\n" + "="*70)
print("✅ 测试完成! 感谢使用GraphRAG GPU测试工具")
print("="*70)

# ============================================================
# 7️⃣ 可选: 显示nvidia-smi
# ============================================================
if cuda_available:
    print("\n📊 nvidia-smi 详细信息:")
    print("="*70)
    import subprocess
    try:
        result = subprocess.run(['nvidia-smi'], capture_output=True, text=True)
        print(result.stdout)
    except:
        print("⚠️  无法执行nvidia-smi命令")