AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


大模型真实速度一览(附:测试脚本)
发布日期:2024-07-15 14:01:03 浏览次数: 2062


由于国产模型降价到不讲武德

我最近一直在做迁移测试

尝试换用国内大模型


从开发者角度,就关心仨事

好不好

贵不贵

快不快


前俩个话题

有太多讨论了

我就测试一下各家模型的速度

以 api 访问的方式进行测试

分小/中/大杯的模型

于是就有了这个图



测试方法

代码我放在了最后,可以自己跑

任务:让各个模型,将「出师表」翻译成现代汉语

#测试 prompt:将以下内容,翻译成现代汉语:先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。今当远离,临表涕零,不知所言。


目标:获取模型的文本生成速度


已知:

  • 生成速度 = 生成长度/生成时间

  • 生成长度 = 在 completions 接口中可取

  • 生成时间 = 总时间(接受请求的时间-发出的时间)- 网络延迟 - 理解上文的时间


故,我需要做的就是每家模型调用 2 次:

  • 调用两次,第一次:通过 streaming  的方式,获取各家接口首 token 的产生时间,这个时间近似为【网络延迟 + 理解上文的时间】

  • 第二次:使用非 streaming 的方式,获取总生成时间和下文长度

  • 通过计算,获取各家 token 的生成速度

 

具体的话,我使用 api + colab 的方式进行测试:极简 Python:10分钟会用 OpenAI / Kimi API。由于 colab 在海外,这也是为什么我需要把 【网络延迟 + 理解上文的时间】剪掉,不然影响有点大。

考虑到工作量,我暂时目前只对兼容 OpenAI SDK 的接口进行了测试(代码附在了最后),之后可能会迭代到全覆盖的测试,并开源出来(感觉自己像是戏台上的老将军,浑身插满了 flag)



以下是测试切片
按生成速度从高到底排序
测试于中国时间上午 11 点左右

小杯:一般聪明

OpenAI 还是你大爷,智谱紧随其后
其他慢了一截


来自「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



大杯:超级聪明

月之暗面 & OpenAI & 智谱:不分伯仲
阶跃星辰:稍逊一筹
其他家:慢了许多


来自「月之暗面」的 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


吐槽

有的朋友会说

为啥没有文心一言

对此,我放几个截图


先是找不到入口



接着是付款让我犹豫


打算付款了,但按钮点不动


来自朋友的监控

本着:「与其麻烦自己,不如霍霍朋友」的原则
让朋友帮我监控了几天
他没国外api,所以监控的模型有点不一样


如下



用 GPT 整理了下


高清大图纯享版:智谱的 AirX 模型很显眼

顺便分了个杯
(有些我分不出来,就不瞎分了)

小杯
低定价/十亿级别参数规模的模型
两极分化的好严重...

中杯
中等定价/百亿级别参数规模的模型
智谱的 AirX 很明显的强

大杯
高定价/千亿级别参数规模的模型
月之暗面和智谱比较快,千问比较慢,豆包不太稳定

代码

测试代码如下
记得先配置 api key
然后 pip install openai

# 配置信息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 threadingfrom concurrent.futures import ThreadPoolExecutor, as_completedfrom openai import OpenAIimport queueimport timeimport datetimeimport 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_timeresponse.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']] = resultreturnelse:result_message = response.choices[0].messagecontent = result_message.content or f"蚌埠住了:{model['model_version']} 啥也没说"completion_tokens = response.usage.completion_tokensprompt_tokens = response.usage.prompt_tokenstotal_tokens = response.usage.total_tokenstotal_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 0result['generation_speed'] = completion_tokens / result['generation_time'] if result['generation_time'] > 0 else 0result_dict[model['model_version']] = resultreturnexcept 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)

PS:上面的代码拿去随便用

以及...
这个版本的测试还有一些问题
比如分杯可能有误
比如监控可能不够频繁
也比如没有覆盖到全样本

过段时间
我尝试把这个测试工具正式开源出来
到时候一起来改改测测
应该会成为一个不错的 benchmark


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询