首次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
用户输入完成到模型返回第一个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
编码时间。
全链路时间:输入文本→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