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

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

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

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

工具与方法
from transformers import AutoModelForCausalLM, AutoTokenizer
import time

model_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 / duration

print(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 time

model_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_time

print(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 time

model_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

你可能感兴趣的:(linux,运维,服务器)