当前位置: 首页 > news >正文

Qwen2.5模型性能测评 - 速度指标

1. Tokens/s(每秒生成Token数)

测量目标
  • 首次Token速度:第一个Token的生成时间(与Time to First Token关联)

  • 后续Token速度:排除首个Token后的持续生成速率

工具与方法
from transformers import AutoModelForCausalLM, AutoTokenizer
import timemodel_name = "/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-0.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda")input_text = "你好,我是刘家成"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")# 首次Token时间(在Time to First Token中测量)
start_time = time.time()
output = model.generate(**inputs, max_new_tokens=100, do_sample=True)
end_time = time.time()# 计算Tokens/s
total_tokens = output.shape[1] - inputs.input_ids.shape[1]
duration = end_time - start_time
tokens_per_sec = total_tokens / durationprint(f"总生成Token数: {total_tokens}, 总时间: {duration:.2f}s, Tokens/s: {tokens_per_sec:.2f}")

Qwen2.5-0.5B-Instruct: 

输入内容: 你好,我是Leo
新生成的内容: ,一名来自中国的新移民。我有一个朋友叫李华,他是一位非常有才华的音乐家。我最近在学习如何演奏吉他,并且正在寻找一位乐手来教我。请问,你有什么关于音乐和乐器的学习建议吗? 作为一名新移民,你认为最重要的是什么?
作为一个AI助手,我可以提供一些基本的建议:1. 学习基础知识:首先,你需要了解吉他的基本知识,包括它的构造、材料、使用方法等。
总生成Token数: 100, 总时间: 2.52s, Tokens/s: 39.67

 Qwen2.5-1.5B-Instruct

(base) root@9gpu-com:~# python t.py
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
输入内容: 你好,我是Leo
新生成的内容: ,我有一个问题想问。 你好,Leo,请问有什么我可以帮助你的吗? 我需要一个关于如何提高英语口语的建议。当然可以!提高英语口语有很多方法,这里有一些你可以尝试的:1. 多听多说:每天都要尽量听英语,并且尽可能多地用英语与人交流。这可以帮助你熟悉英语的发音和语调。2. 观看英文电影或电视剧:通过观看英语原版的电影或电视剧,
总生成Token数: 100, 总时间: 3.06s, Tokens/s: 32.68

2. Time to First Token(首次Token延迟)

测量目标
  • 用户输入完成到模型返回第一个Token的时间(关键交互体验指标)

工具与方法
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import timemodel_name = "/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-1.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda")# 添加预热步骤
print("正在预热模型...")
warmup_text = "Hello"
warmup_inputs = tokenizer(warmup_text, return_tensors="pt").to("cuda")
# 预热生成
with torch.no_grad():for _ in range(3):  # 预热3次model.generate(**warmup_inputs, max_new_tokens=1)# 预热前向传播for _ in range(3):model(**warmup_inputs)
print("预热完成!\n")input_text = "你好,我是Leo"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")# 首次Token时间(在Time to First Token中测量)
start_time = time.time()
output = model.generate(**inputs, max_new_tokens=100, do_sample=True)
end_time = time.time()# 计算Tokens/s
total_tokens = output.shape[1] - inputs.input_ids.shape[1]
duration = end_time - start_time
tokens_per_sec = total_tokens / duration# 解码并打印输入和输出内容
input_text_decoded = tokenizer.decode(inputs.input_ids[0], skip_special_tokens=True)
full_output_decoded = tokenizer.decode(output[0], skip_special_tokens=True)
new_content = full_output_decoded[len(input_text_decoded):]print(f"输入内容: {input_text_decoded}")
print(f"新生成的内容: {new_content}")
print(f"总生成Token数: {total_tokens}, 总时间: {duration:.2f}s, Tokens/s: {tokens_per_sec:.2f}")# 精确测量首次Token时间
start_time = time.time()
with torch.no_grad():# 使用单步生成(仅首个Token)first_token_output = model(**inputs, return_dict=True)
first_token_time = time.time() - start_timeprint(f"Time to First Token: {first_token_time:.4f}s")

Qwen2.5-0.5B-Instruct: 

(base) root@9gpu-com:~# python t.py
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
正在预热模型...
预热完成!输入内容: 你好,我是Leo
新生成的内容: ,一名来自美国的留学生,现在在加拿大的大学学习。请问你是如何适应新的环境和文化背景的? 我们可以讨论一下。
你好,我是Leo,一名来自美国的留学生,现在在加拿大的大学学习。请问你是如何适应新的环境和文化背景的?
很高兴能与你交流!首先,我想了解一下你的个人情况,包括你的语言能力、文化敏感度以及你在加拿大的居住时间。1. **语言能力**:作为来自美国
总生成Token数: 100, 总时间: 2.28s, Tokens/s: 43.86
Time to First Token: 0.0216s

 Qwen2.5-1.5B-Instruct

(base) root@9gpu-com:~# python t.py
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
正在预热模型...
预热完成!输入内容: 你好,我是Leo
新生成的内容: 。我最近在学习编程,但是遇到了一些困难。你能帮我吗?
当然可以!很高兴能帮助你。请问你遇到的具体问题是关于什么类型的编程呢?是前端开发、后端开发还是其他领域的问题呢?这样我可以更准确地提供帮助。如果你愿意分享更多的信息,我会尽力给你解答。
总生成Token数: 68, 总时间: 1.74s, Tokens/s: 39.03
Time to First Token: 0.0240s
注意事项
  • 确保模型已预热(避免冷启动影响)。

  • 关闭采样(do_sample=False)可减少随机性对首次延迟的影响。

  • 若需真实端到端延迟,需包含tokenizer编码时间。

 

3. 端到端延迟(End-to-End Latency)

测量目标
  • 全链路时间:输入文本→Tokenization→推理→解码→返回结果

工具与方法
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import timemodel_name = "/root/.cache/modelscope/hub/models/Qwen/Qwen2.5-0.5B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name).to("cuda")# 添加预热步骤
print("正在预热模型...")
warmup_text = "Hello"
warmup_inputs = tokenizer(warmup_text, return_tensors="pt").to("cuda")
# 预热生成
with torch.no_grad():for _ in range(3):  # 预热3次model.generate(**warmup_inputs, max_new_tokens=1)# 预热前向传播for _ in range(3):model(**warmup_inputs)
print("预热完成!\n")input_text = "你好,我是Leo"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")def full_pipeline(input_text):# 打点记录各阶段时间start_total = time.time()# 1. 预处理start_preprocess = time.time()inputs = tokenizer(input_text, return_tensors="pt").to("cuda")end_preprocess = time.time()# 2. 推理start_inference = time.time()output = model.generate(**inputs, max_new_tokens=100)end_inference = time.time()# 3. 后处理start_postprocess = time.time()decoded_text = tokenizer.decode(output[0], skip_special_tokens=True)end_postprocess = time.time()end_total = time.time()# 输出各阶段耗时print(f"""预处理: {(end_preprocess - start_preprocess):.4f}s推理: {(end_inference - start_inference):.4f}s后处理: {(end_postprocess - start_postprocess):.4f}s总延迟: {(end_total - start_total):.4f}s""")full_pipeline("你的输入文本")

Qwen2.5-0.5B-Instruct: 

(base) root@9gpu-com:~# python t.py
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
正在预热模型...
预热完成!预处理: 0.0002s推理: 2.2386s后处理: 0.0002s总延迟: 2.2390s

  Qwen2.5-1.5B-Instruct

(base) root@9gpu-com:~# python t.py
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
正在预热模型...
预热完成!预处理: 0.0003s推理: 2.5448s后处理: 0.0003s总延迟: 2.5453s

http://www.xdnf.cn/news/272755.html

相关文章:

  • 【LeetCode Hot100】动态规划篇
  • 记录ruoyi-flowable-plus第一次运行流程报错
  • 编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要
  • 【Linux】日志与策略模式、线程池
  • 《Vue3学习手记8》
  • 高等数学第三章---微分中值定理与导数的应用(3.4~3.5)
  • LeetCode 热题 100 994. 腐烂的橘子
  • CF1000E We Need More Bosses
  • 【转载】【翻译】图解智能体到智能体 (A2A) 协议
  • 冯诺依曼结构与哈佛架构深度解析
  • 【Linux系统】第二节—基础指令(2)
  • 13:图像处理—畸变矫正详解
  • 修复笔记:获取 torch._dynamo 的详细日志信息
  • 【数据结构】励志大厂版·初阶(复习+刷题)排序
  • 【程序+论文】大规模新能源并网下的火电机组深度调峰经济调度
  • TFQMR和BiCGStab方法比较
  • 缓存与数据库的高效读写流程解析
  • 8.1 Python+Docker+企业微信集成实战:自动化报告生成与CI/CD部署全攻略
  • php study 网站出现404 - Page Not Found 未找到
  • 去打印店怎么打印手机文件,网上打印平台怎么打印
  • C++负载均衡远程调用学习之Agent代理模块基础构建
  • 组合模式(Composite Pattern)
  • 探索正态分布:交互式实验带你体验统计之美
  • AI 编程日报 · 2025 年 5 月 04 日|GitHub Copilot Agent 模式发布,Ultralytics 优化训练效率
  • 【Linux】深入理解程序地址空间
  • C语言实现数据结构:堆排序和二叉树_链式
  • JavaScript性能优化实战(9):图像与媒体资源优化
  • 2025-04-26-利用奇异值重构矩阵-美团
  • ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(一)
  • Git从入门到精通-第四章-更新仓库