File size: 3,766 Bytes
3ec7a0b eb02b52 3ec7a0b dac9c70 3ec7a0b eb02b52 3ec7a0b eb02b52 |
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 |
import json
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
from collections import defaultdict
import numpy as np
import matplotlib.font_manager as fm
font_path = '/System/Library/Fonts/PingFang.ttc'
prop = fm.FontProperties(fname=font_path)
plt.rcParams['font.family'] = prop.get_name()
with open('./test/states.json') as f:
data = json.load(f)
request_arrivals = data["request_arrivals"]
def create_pic(request_arrivals, key):
request_arrivals = request_arrivals[key]
# 将字符串转换为datetime对象
datetimes = [datetime.fromisoformat(t) for t in request_arrivals]
# 获取最新的时间
latest_time = max(datetimes)
# 创建24小时的时间范围
time_range = [latest_time - timedelta(hours=i) for i in range(32, 0, -1)]
# 统计每小时的请求数
hourly_counts = defaultdict(int)
for dt in datetimes:
for t in time_range[::-1]:
if dt >= t:
hourly_counts[t] += 1
break
# 准备绘图数据
hours = [t.strftime('%Y-%m-%d %H:00') for t in time_range]
counts = [hourly_counts[t] for t in time_range]
# 创建柱状图
plt.figure(figsize=(15, 6))
plt.bar(hours, counts)
plt.title(f'{key} 端点请求量 (过去24小时)')
plt.xlabel('时间')
plt.ylabel('请求数')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
# 保存图片
plt.savefig(f'{key.replace("/", "")}.png')
def create_pie_chart(model_counts):
models = list(model_counts.keys())
counts = list(model_counts.values())
# 设置颜色和排列顺序
colors = plt.cm.Set3(np.linspace(0, 1, len(models)))
sorted_data = sorted(zip(counts, models, colors), reverse=True)
counts, models, colors = zip(*sorted_data)
# 创建饼图
fig, ax = plt.subplots(figsize=(16, 10))
wedges, _ = ax.pie(counts, colors=colors, startangle=90, wedgeprops=dict(width=0.5))
# 添加圆环效果
centre_circle = plt.Circle((0, 0), 0.35, fc='white')
fig.gca().add_artist(centre_circle)
# 计算总数
total = sum(counts)
# 准备标注
bbox_props = dict(boxstyle="round,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(xycoords='data', textcoords='data', arrowprops=dict(arrowstyle="-"), bbox=bbox_props, zorder=0)
left_labels = []
right_labels = []
for i, p in enumerate(wedges):
ang = (p.theta2 - p.theta1) / 2. + p.theta1
y = np.sin(np.deg2rad(ang))
x = np.cos(np.deg2rad(ang))
percentage = counts[i] / total * 100
label = f"{models[i]}: {percentage:.1f}%"
if x > 0:
right_labels.append((x, y, label))
else:
left_labels.append((x, y, label))
# 绘制左侧标注
for i, (x, y, label) in enumerate(left_labels):
ax.annotate(label, xy=(x, y), xytext=(-1.2, 0.9 - i * 0.15), **kw)
# 绘制右侧标注
for i, (x, y, label) in enumerate(right_labels):
ax.annotate(label, xy=(x, y), xytext=(1.2, 0.9 - i * 0.15), **kw)
plt.title("各模型使用次数对比", size=16)
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.2, 1.2)
ax.axis('off')
plt.tight_layout()
plt.savefig('model_usage_pie_chart.png', bbox_inches='tight', pad_inches=0.5)
if __name__ == '__main__':
model_counts = {
"model_counts": {
"claude-3-5-sonnet": 94,
"o1-preview": 71,
"gpt-4o": 512,
"gpt-4o-mini": 5,
"gemini-1.5-pro": 5,
"deepseek-chat": 7,
"grok-2-mini": 1,
"grok-2": 9,
"o1-mini": 8
}
}
# create_pic(request_arrivals, 'POST /v1/chat/completions')
create_pie_chart(model_counts["model_counts"])
|