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