大模型token输出速度测试代码分享,来评估一下你的大模型性能吧!

本地部署大模型,最重要的体验就是输出速度,而输出速度仅仅用提问加计时的方式并不合适,因为不管问题相同或不相同,回答中的 token 数量会有差异,所以最终的计时虽然可以参考但并不准确并不直观。

实际上大模型的输出速度需要看每秒输出 token 量,也就是所谓的 TPS(tokens per second),或者写成 tokens/s

大模型token输出速度测试代码和原理

如何获取具体的 token 输出速度,从单位看原理就比较简单,总 token 量和时间的比值,时间直接用开始时间和结束时间的差值,而一次请求返回的 token 量实际是可以通过 API 获得的。

ollama 的官方文档(API 参考 - Ollama 中文文档: https://ollama.readthedocs.io/api/#generate-a-completion)中就有相关的说明:要计算响应生成的速度(以每秒令牌数为单位),请使用公式:eval_count / eval_duration * 10^9。

好了,让 DeepSeek 帮代劳写一下 python 脚本吧。我稍微调整了一下,最终的输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import requests
import time

# ollama 的 API 地址
OLLAMA_API_URL = "http://localhost:11434/api/generate"

# 请求参数
payload = {
    "model": "deepseek-r1:1.5b",  # 替换为你的模型名称
    "prompt": "玄武门之变结束的当天,李世民在深夜写下一段独白,你觉得他会写什么?",  # 替换为你的输入文本
    "stream": False,  # 设置为 False,一次性返回完整结果
    "max_tokens": 100  # 设置生成的最大 token 数量
}

# 打印 model 和 prompt 信息
print(f"使用的模型: {payload['model']}")
print(f"输入的提示: {payload['prompt']}")

# 记录开始时间
start_time = time.time()
print(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))}")

# 发送请求
response = requests.post(OLLAMA_API_URL, json=payload)

# 记录结束时间
end_time = time.time()
print(f"结束时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))}")

# 解析响应
if response.status_code == 200:
    result = response.json()
    # print(result)
    generated_text = result.get("response", "")
    generated_tokens = result.get("eval_count", 0)  # 获取生成的 token 数量
    elapsed_time = end_time - start_time

    # 计算每秒生成的 token 数量
    tokens_per_second = generated_tokens / elapsed_time

    print(f"生成时间: {elapsed_time:.2f}秒")
    print(f"生成 token 数量: {generated_tokens}")
    print(f"每秒生成 token 数量: {tokens_per_second:.2f}")
else:
    print(f"请求失败,状态码: {response.status_code}")
    print(f"错误信息: {response.text}")

注意:主要修改上面的 model 和 prompt,也就是模型和问题。

建议:ollama run 后进行测试,而不要在没启动的情况下测试,尽量保证相同测试场景,包括问题也尽量一样。

当然,这段代码实际上很糙,没有区分请求、响应等,直接用了发起请求和结束请求的时间,如果需要细化分析,也可以根据参数改进。相关参数:

total_duration:生成响应所花费的时间

load_duration:加载模型所花费的时间(纳秒)

prompt_eval_count:提示中的令牌数

prompt_eval_duration:评估提示所花费的时间(纳秒)

eval_count:响应中的令牌数

eval_duration:生成响应所花费的时间(纳秒)

context:用于此响应的对话编码,可以在下一个请求中发送以保持对话记忆

response:如果响应是流式的,则为空;如果不是流式的,将包含完整的响应

如果能加上模型批量自动化当然就更好了,有兴趣的同学可以继续改进一下,记得分享一份给我。

大模型输出速度实测

我也测试了我手上的设备,装有 P106 显卡的 PC 和 2019 款 Intel 版 MBP,具体配置可以看我前面的文章:

P106 显卡的 PC:百元 P106 显卡跑 7B 大模型,矿渣变 AI 神器,真香!

2019 款 Intel 版 MBP:Intel 版 MacBook 用 ollama 跑大模型:显卡没用上,靠 CPU 硬扛。

今日补了 14B 和 32B 模型的测试数据,汇总后信息如下:

/posts/ai/20250216-share-the-code-for-testing-the-output-speed-of-the-big-model-token/static/MnNybmiKPo3Tygx3T2ucPBMFnBf.png

其中 32B 在 16G 的 MBP 上无法运行,只好放弃。

表面上看模型越大,使用纯 CPU 的推理速度越快。但想想就觉得很扯,这种配置之下,应该没有太大的参考价值。

如果一定要有一个结论,就是:普通电脑跑 7B 模型问题不大,不管用 CPU 还是 GPU,都不算太慢,想速度快就改用 1.5B 的,主要用来测试流程而不是效果。 但 7B 的智商怎能和 70B 相比?更不用说满血的 671B 相比了。

顺便在 2012 款 Mac Mini 上跑了 1.5B 模型试试:

使用的模型: deepseek-r1:1.5b

输入的提示: 玄武门之变结束的当天,李世民在深夜写下一段独白,你觉得他会写什么?

开始时间: 2025-02-16 15:54:29

结束时间: 2025-02-16 15:54:47

生成时间: 18.96 秒

生成 token 数量: 84

每秒生成 token 数量: 4.43

Intel Core i5-3210M 2.50GHz 的 CPU,这么差的 CPU 也是能跑通流程的哦,只是不忍直视。

最后来一张个人觉得做的非常好的输出速度测试图,数据完整,设备性能看上去也很不错:

/posts/ai/20250216-share-the-code-for-testing-the-output-speed-of-the-big-model-token/static/KWAlbYAiBodN5xxO8b1cy6NanPf.png

(来源:零刻 SER9 Pro HX370 与 AI 365 本地部署 deepseek-R1 大模型性能对比 https://zhuanlan.zhihu.com/p/23898680586)

不确定是不是官方做的图,但这图确实做的比较全面了。

最近在看纯 CPU 跑 70B 大模型的方案,如果有方案也能做出如此详细的表格来,大家也就比较容易选择了。大家有推荐的方案吗?下次可以就这个话题继续聊聊。

好了,大模型 token 输出速度测试代码已经分享完毕,我的渣渣设备也给你看了,要不屏幕前的你,用你的设备也来跑个分?期待啊!

RoverTang 支付宝支付宝
RoverTang 微信微信
0%