这里这张图非常的清晰,借鉴至这篇文章(https://medium.com/squeezebits-team-blog/vllm-vs-tensorrt-llm-1-an-overall-evaluation-88f281bf01c7),主要就是涉及 TTFT、TPOT、Total Inference Time (Latency) 以及图中没有提及的 TPS,这几个大模型的性能指标不只是适用于纯语言大模型 LLM,也适用于多模态大模型 MLLM,所以还是比较通用。
定义:从向模型输入 prompt 开始到模型生成第一个输出 token 所花费的时间。
作用:从业务角度来说是反映模型的初始响应速度,对于实时交互式应用非常重要,较低的TTFT可以提高用户体验,使用户感觉模型响应迅速;从算法推理角度来说,其实主要是在掐大模型推理的 Prefill 时间,更加准确一些的是上图中的 Queueing Time + Prefill Latency 时间和。
定义:从输入 prompt 到模型生成完整输出所消耗的总时间。
作用:总体的响应时间,包含 TTFT 和生成所有 tokens 的时间,当然对于需要快速响应的应用,延时越低越好。
定义:模型在输出阶段 (Decode 阶段) 每个输出 token 的延时。
计算方式:
作用:衡量模型生成阶段自回归蹦出来输出的效率。
定义:模型每秒生成的tokens数量。
计算方式:
作用:直接衡量模型的生成速度 (还是指 decode 阶段)。TPS 越高,表示模型生成文本的速度越快。
下面实操在 transformers 中测量 TTFT、TPOT、Latency 和 TPS 数据的代码。
def measure_performance(model, tokenizer, prompt, max_new_tokens=50):
inputs = tokenizer(prompt, return_tensors="pt")
input_ids = inputs.input_ids.to(model.device)
# 测量TTFT
start_time = time.time()
with torch.no_grad():
outputs = model.generate(input_ids, max_new_tokens=1)
ttft = time.time() - start_time
# 测量TPOT和Latency
start_time = time.time()
with torch.no_grad():
outputs = model.generate(input_ids, max_new_tokens=max_new_tokens)
total_time = time.time() - start_time
tpot = (total_time - ttft) / max_new_tokens
latency = total_time
# 计算TPS
tps = max_new_tokens / latency
return ttft, tpot, latency, tps
prompt = "Once upon a time"
ttft, tpot, latency, tps = measure_performance(model, tokenizer, prompt)
print(f"TTFT: seconds")
print(f"TPOT: seconds")
print(f"Latency: seconds")
print(f"TPS: tokens/second")
如果你稍微心细一些可能会发现上述的代码是在掐 max_new_tokens
的时间,而实际的输出 token 数一定会是 <= max_new_tokens
,这应该很好理解。所以更加准确一些的测试方法是掐实际输出 tokens,实际输出 tokens 可以使用类似 len(tokenizer.encode(response))
的代码进行计算。
所以可以看到大模型这种生成的模式测性能,指标和以前的 CV 小模型测性能差别非常之大。
好文章,需要你的鼓励
后来广为人知的“云上奥运”这一说法,正是从这一刻起走上历史舞台。云计算这一概念,也随之被越来越多的人所熟知。乘云科技CEO郝凯对此深有感受,因为在2017年春节过后不久,他的公司开始成为阿里云的合作伙伴,加入了滚滚而来的云计算大潮中。同一年,郝凯带领团队也第一次参加了阿里云的“双11”活动,实现了800万元的销售业绩。
随着各行各业数字化变革的不断深入,人类社会正加速迈向智能化。作为智能世界和数字经济的坚实底座,数据中心也迎来了蓬勃发展。面