-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplot_gpu.py
More file actions
136 lines (121 loc) · 4.29 KB
/
plot_gpu.py
File metadata and controls
136 lines (121 loc) · 4.29 KB
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
import re
import matplotlib.pyplot as plt
import sys
import numpy as np
import datetime
plt.rcParams['axes.unicode_minus'] = False # Show minus sign correctly
# 支持命令行参数 interval
interval = 5 # 默认5秒
if len(sys.argv) > 1:
try:
interval = int(sys.argv[1])
except Exception:
pass
# Log file path
log_file = "log"
gpu_utils = []
powers = []
timestamps = []
with open(log_file, "r") as f:
for line in f:
# Extract timestamp
time_match = re.match(r"(\d{2}-\d{2}-\d{4} \d{2}:\d{2}:\d{2})", line)
if not time_match:
continue
timestamps.append(time_match.group(1))
# Extract GPU utilization
gr3d_match = re.search(r"GR3D_FREQ (\d+)%", line)
if gr3d_match:
gpu_utils.append(int(gr3d_match.group(1)))
else:
gpu_utils.append(None)
# Extract GPU power (VDD_GPU_SOC)
power_match = re.search(r"VDD_GPU_SOC (\d+)mW", line)
if power_match:
powers.append(int(power_match.group(1)))
else:
powers.append(None)
# 横坐标为实际时间(秒,起点为0)
def parse_time(s):
return datetime.datetime.strptime(s, "%m-%d-%Y %H:%M:%S")
if timestamps:
t0 = parse_time(timestamps[0])
x = [(parse_time(ts) - t0).total_seconds() for ts in timestamps]
else:
x = list(range(1, len(gpu_utils) + 1))
# Plot
fig, ax1 = plt.subplots(figsize=(12, 6))
ax1.set_xlabel('Time (s)')
ax1.set_ylabel('GPU Utilization (%)', color='tab:blue')
ax1.plot(x, gpu_utils, color='tab:blue', label='GPU Utilization')
ax1.tick_params(axis='y', labelcolor='tab:blue')
ax2 = ax1.twinx()
ax2.set_ylabel('GPU Power (mW)', color='tab:red')
ax2.plot(x, powers, color='tab:red', label='GPU Power')
ax2.tick_params(axis='y', labelcolor='tab:red')
plt.title('GPU Utilization and Power Over Time (actual time)')
plt.tight_layout()
plt.savefig('gpu_util_power.png')
# 统计功耗信息并保存到图片
import numpy as np
valid_powers = [p for p in powers if p is not None]
# 开关:是否统计无波动区间(True=统计,False=不统计)
INCLUDE_STABLE = True # 你可以根据需要改为 False
# 跳过前面功率无波动的区间
def find_first_fluctuate_idx(power_list):
if not power_list:
return 0
base = power_list[0]
for i, p in enumerate(power_list):
if p != base:
return i
return len(power_list) # 全部无波动
start_idx = find_first_fluctuate_idx(valid_powers)
fluctuate_powers = valid_powers[start_idx:]
if fluctuate_powers:
avg_power = np.mean(fluctuate_powers)
min_power = np.min(fluctuate_powers)
max_power = np.max(fluctuate_powers)
# 计算真实采样间隔
if len(x) > start_idx + 1:
real_interval = (x[start_idx+1] - x[start_idx])
else:
real_interval = interval
total_energy_j = np.sum(fluctuate_powers) * real_interval / 1000 # mW*秒/1000 = J
stat_text = (
f"Power statistics (interval~{real_interval:.2f}s, skip {start_idx} stable points):\n"
f" Average Power: {avg_power:.2f} mW\n"
f" Min Power: {min_power} mW\n"
f" Max Power: {max_power} mW\n"
f" Total Energy: {total_energy_j:.2f} J\n"
f"Note: X axis is actual time (seconds)."
)
print(stat_text)
elif INCLUDE_STABLE and valid_powers:
# 全部无波动也统计
avg_power = np.mean(valid_powers)
min_power = np.min(valid_powers)
max_power = np.max(valid_powers)
if len(x) > 1:
real_interval = (x[1] - x[0])
else:
real_interval = interval
total_energy_j = np.sum(valid_powers) * real_interval / 1000
stat_text = (
f"Power statistics (interval~{real_interval:.2f}s, all points stable):\n"
f" Average Power: {avg_power:.2f} mW\n"
f" Min Power: {min_power} mW\n"
f" Max Power: {max_power} mW\n"
f" Total Energy: {total_energy_j:.2f} J\n"
f"Note: X axis is actual time (seconds)."
)
print(stat_text)
else:
stat_text = "No valid power data found after skipping stable period.\nNote: X axis is actual time (seconds)."
print(stat_text)
# 在图上添加统计信息文本
fig2, ax = plt.subplots(figsize=(7, 3))
ax.axis('off')
ax.text(0.01, 0.99, stat_text, fontsize=13, va='top', ha='left', family='monospace')
plt.tight_layout()
plt.savefig('gpu_power_stats.png')