微信扫码
与创始人交个朋友
我要投稿
由于国产模型降价到不讲武德
我最近一直在做迁移测试
尝试换用国内大模型
从开发者角度,就关心仨事
好不好
贵不贵
快不快
前俩个话题
有太多讨论了
我就测试一下各家模型的速度
以 api 访问的方式进行测试
分小/中/大杯的模型
于是就有了这个图
任务:让各个模型,将「出师表」翻译成现代汉语
#测试 prompt:将以下内容,翻译成现代汉语:先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。今当远离,临表涕零,不知所言。
目标:获取模型的文本生成速度
已知:
生成速度 = 生成长度/生成时间
生成长度 = 在 completions 接口中可取
生成时间 = 总时间(接受请求的时间-发出的时间)- 网络延迟 - 理解上文的时间
故,我需要做的就是每家模型调用 2 次:
调用两次,第一次:通过 streaming 的方式,获取各家接口首 token 的产生时间,这个时间近似为【网络延迟 + 理解上文的时间】
第二次:使用非 streaming 的方式,获取总生成时间和下文长度
通过计算,获取各家 token 的生成速度
具体的话,我使用 api + colab 的方式进行测试:极简 Python:10分钟会用 OpenAI / Kimi API。由于 colab 在海外,这也是为什么我需要把 【网络延迟 + 理解上文的时间】剪掉,不然影响有点大。
考虑到工作量,我暂时目前只对兼容 OpenAI SDK 的接口进行了测试(代码附在了最后),之后可能会迭代到全覆盖的测试,并开源出来(感觉自己像是戏台上的老将军,浑身插满了 flag)
来自「OpenAI」的 gpt-3.5-turbo:
上下文总长度:2250,用时:14.62 秒
内容:先帝创业未半,就中途意外去世,如今天下局...
输入 token:1070,输入解析(含网络延迟):0.47 秒
输出 token:1180,生成用时:14.15 秒,生成速度:83.42 token/s
来自「智谱」的 glm-4-flash:
上下文总长度:1409,用时:11.35 秒
内容:先帝开创的事业还没有完成一半,却突然驾崩...
输入 token:689,输入解析(含网络延迟):1.37 秒
输出 token:720,生成用时:9.98 秒,生成速度:72.14 token/s
来自「通义千问」的 qwen-turbo:
上下文总长度:1440,用时:18.17 秒
内容:先帝开创大业未竟一半,却中途去世,现在天...
输入 token:690,输入解析(含网络延迟):1.12 秒
输出 token:750,生成用时:17.05 秒,生成速度:43.99 token/s
来自「百川」的 Baichuan3-Turbo:
上下文总长度:1485,用时:22.00 秒
内容:先帝开创大业还没完成一半却中途去世了,现...
输入 token:752,输入解析(含网络延迟):1.84 秒
输出 token:733,生成用时:20.16 秒,生成速度:36.36 token/s
来自「智谱」的 glm-4-airx:
上下文总长度:1415,用时:9.67 秒
内容:先帝开创的事业还未完成一半就不幸去世,现...
输入 token:689,输入解析(含网络延迟):1.86 秒
输出 token:726,生成用时:7.81 秒,生成速度:92.95 token/s
来自「OpenAI」的 gpt-4o(我觉得没有4聪明):
上下文总长度:1690,用时:12.68 秒
内容:先帝创业还未完成,中途就去世了。现在天下...
输入 token:776,输入解析(含网络延迟):0.51 秒
输出 token:914,生成用时:12.16 秒,生成速度:75.14 token/s
来自「通义千问」的 qwen-plus:
上下文总长度:1500,用时:48.10 秒
内容:先帝创立帝业还未完成一半,却中途去世,现...
输入 token:690,输入解析(含网络延迟):1.05 秒
输出 token:810,生成用时:47.05 秒,生成速度:17.22 token/s
来自「月之暗面」的 moonshot-v1-32k:
上下文总长度:1445,用时:27.03 秒
内容:这段文字出自《出师表》,是三国时期蜀汉丞...
输入 token数:729,解析用时(含网络延迟):3.37 秒
输出 token数:716,生成用时:23.66 秒,生成速度:30.26 token/s
来自「OpenAI」的 gpt-4:
上下文总长度:2409,用时:45.64 秒
内容:前朝皇帝开创事业还没完成,就在半路中逝世...
输入 token数:1070,解析用时(含网络延迟):1.21 秒
输出 token数:1339,生成用时:44.43 秒,生成速度:30.14 token/s
来自「智谱」的 glm-4:
上下文总长度:1415,用时:25.98 秒
内容:以下是该段古文的现代汉语翻译:先帝开...
输入 token:689,输入解析(含网络延迟):1.89 秒
输出 token:726,生成用时:24.09 秒,生成速度:30.13 token/s
来自「阶跃星辰」的 step-1-8k:
上下文总长度1590,用时:33.38 秒
内容:先帝开创的大业未完成一半却中途去世了。现...
输入 token数:694,解析用时(含网络延迟):2.03 秒
输出 token数:896,生成用时:31.35 秒,生成速度:28.58 token/s
来自「百川」的 Baichuan4:
上下文总长度1413,用时:40.05 秒
内容:先帝创立的基业还没有完成一半就去世了,现...
输入 token数:690,解析用时(含网络延迟):2.42 秒
输出 token数:723,生成用时:37.63 秒,生成速度:19.21 token/s
来自「深度求索」的 deepseek-chat:
上下文总长度:1691,用时:52.08 秒
内容:先帝开创大业未完成一半,却中途去世。如今...
输入 token数:739,解析用时(含网络延迟):1.43 秒
输出 token数:952,生成用时:50.65 秒,生成速度:18.80 token/s
来自「通义千问」的 qwen-max:
上下文总长度:1538,用时:57.39 秒
内容:先帝开创大业未完成一半,却中途去世了,现...
输入 token数:690 ,解析用时(含网络延迟):1.10 秒
输出 token数:848 ,生成用时:56.28 秒,生成速度:15.07 token/s
有的朋友会说
为啥没有文心一言
对此,我放几个截图
先是找不到入口
接着是付款让我犹豫
打算付款了,但按钮点不动
如下
用 GPT 整理了下
from google.colab import userdata
models_venti ={
'GPT':{
'brand':'OpenAI',
'model_version':'gpt-4',
'api_key' : userdata.get("Key_OpenAI"),
'base_url' : "https://api.openai.com/v1",
},
'Moonshot':{
'brand':'月之暗面',
'model_version':'moonshot-v1-32k',
'api_key' : userdata.get("Key_Moonshot"),
'base_url' : "https://api.moonshot.cn/v1",
},
'Zhipu':{
'brand':'智谱',
'model_version':'glm-4',
'api_key' : userdata.get("Key_Zhipu"),
'base_url' : "https://open.bigmodel.cn/api/paas/v4/",
},
'Qwen':{
'brand':'通义千问',
'model_version':'qwen-max',
'api_key' : userdata.get("Key_Qwen"),
'base_url' : "https://dashscope.aliyuncs.com/compatible-mode/v1",
},
'DeepSeek':{
'brand':'深度求索',
'model_version':"deepseek-chat",
'api_key' : userdata.get("Key_DeepSeek"),
'base_url' : "https://api.deepseek.com",
},
'Stepfun':{
'brand':'阶跃星辰',
'model_version':'step-1-8k',
'api_key' : userdata.get("Key_Stepfun"),
'base_url' : "https://api.stepfun.com/v1",
},
'Baichuan':{
'brand':'百川',
'model_version':'Baichuan4',
'api_key' : userdata.get("Key_Baichuan"),
'base_url' : "https://api.baichuan-ai.com/v1",
},
}
models_grande ={
'GPT':{
'brand':'OpenAI',
'model_version':'gpt-4o',
'api_key' : userdata.get("Key_OpenAI"),
'base_url' : "https://api.openai.com/v1",
},
'Zhipu':{
'brand':'智谱',
'model_version':'glm-4-airx',
'api_key' : userdata.get("Key_Zhipu"),
'base_url' : "https://open.bigmodel.cn/api/paas/v4/",
},
'Qwen':{
'brand':'通义千问',
'model_version':'qwen-plus',
'api_key' : userdata.get("Key_Qwen"),
'base_url' : "https://dashscope.aliyuncs.com/compatible-mode/v1",
},
}
models_tall ={
'GPT':{
'brand':'OpenAI',
'model_version':'gpt-3.5-turbo',
'api_key' : userdata.get("Key_OpenAI"),
'base_url' : "https://api.openai.com/v1",
},
'Zhipu':{
'brand':'智谱',
'model_version':'glm-4-flash',
'api_key' : userdata.get("Key_Zhipu"),
'base_url' : "https://open.bigmodel.cn/api/paas/v4/",
},
'Qwen':{
'brand':'通义千问',
'model_version':'qwen-turbo',
'api_key' : userdata.get("Key_Qwen"),
'base_url' : "https://dashscope.aliyuncs.com/compatible-mode/v1",
},
'Baichuan':{
'brand':'百川',
'model_version':'Baichuan3-Turbo',
'api_key' : userdata.get("Key_Baichuan"),
'base_url' : "https://api.baichuan-ai.com/v1",
},
}
# 逻辑部分
import threading
from concurrent.futures import ThreadPoolExecutor, as_completed
from openai import OpenAI
import queue
import time
import datetime
import pytz
def LLM(messages, model, result_dict, use_streaming=False):
client = OpenAI(
api_key=model['api_key'],
base_url=model['base_url'],
)
api_params = {
"model": model['model_version'],
"messages": messages,
"stream": use_streaming,
}
start_time = time.time()
try:
response = client.chat.completions.create(**api_params)
if use_streaming:
for chunk in response:
infer_time = time.time() - start_time
response.close()
result = result_dict.get(model['model_version'], {'model': model})
result.update({
'content': None,
'duration': infer_time,
'use_streaming': use_streaming,
'infer_time': infer_time,
})
result_dict[model['model_version']] = result
return
else:
result_message = response.choices[0].message
content = result_message.content or f"蚌埠住了:{model['model_version']} 啥也没说"
completion_tokens = response.usage.completion_tokens
prompt_tokens = response.usage.prompt_tokens
total_tokens = response.usage.total_tokens
total_time = time.time() - start_time
result = result_dict.get(model['model_version'], {'model': model})
result.update({
'content': content[:20]+'...',
'duration': total_time,
'prompt_tokens': prompt_tokens,
'completion_tokens': completion_tokens,
'total_tokens': total_tokens,
'use_streaming': use_streaming,
'generation_time': total_time - result.get('infer_time', 0),
})
if 'infer_time' in result:
result['infer_speed'] = prompt_tokens / result['infer_time'] if result['infer_time'] > 0 else 0
result['generation_speed'] = completion_tokens / result['generation_time'] if result['generation_time'] > 0 else 0
result_dict[model['model_version']] = result
return
except Exception as e:
result_dict[model['model_version']] = {
'model': model,
'content': f"Error: {e}",
'use_streaming': use_streaming,
}
def testALL(messages=[], prompts=[], models={}):
tz = pytz.timezone('Asia/Shanghai')
now = datetime.datetime.now(tz)
print(f"\n测试开始时间:{now.strftime('%Y-%m-%d %H:%M:%S')}\n")
result_dict = {}
def process_messages(messages, use_streaming):
futures = [executor.submit(LLM, messages, models[key], result_dict, use_streaming) for key in models]
for future in as_completed(futures):
future.result()# Ensure future completes
with ThreadPoolExecutor() as executor:
for use_streaming in [True, False]:
if prompts:
for prompt in prompts:
messages = [{"role": "user", "content": prompt}]
process_messages(messages, use_streaming)
else:
process_messages(messages, use_streaming)
# 对结果按生成速度从高到低排序并输出
sorted_results = sorted(result_dict.values(), key=lambda x: x.get('generation_speed', 0), reverse=True)
for result in sorted_results:
print(f"来自「{result['model']['brand']}」的 {result['model']['model_version']}:")
print(f"上下文总长度:{result['total_tokens']},用时:{result.get('duration', 0):.2f} 秒")
print(f"内容:{result.get('content', '无输出')}")
print(f"输入 token:{result['prompt_tokens']}")
print(f"输入解析(含网络延迟):{result.get('infer_time', 0):.2f} 秒")
print(f"输出 token:{result['completion_tokens']}")
print(f"生成用时:{result.get('generation_time', 0):.2f} 秒,生成速度:{result.get('generation_speed', 0):.2f} token/s")
print("\n")
# 执行部分
prompts =
"""将以下内容,翻译成现代汉语:先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
今当远离,临表涕零,不知所言。"""
]
print("我来测试大杯了~")
testALL(prompts = prompts, models = models_venti)
print("="*30)
print("我来测试中杯了~")
testALL(prompts = prompts, models = models_grande)
print("="*30)
print("我来测试小杯了~")
testALL(prompts = prompts, models = models_tall)
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-21
2024-04-11
2024-08-13
2024-07-09
2024-07-18
2024-10-25
2024-07-01
2024-06-17