随着DeepSeek-R1模型的广泛应用,越来越多的开发者开始尝试复现类似的模型,以提升其推理能力。目前已经涌现出不少令人瞩目的成果。然而,这些新模型的推理能力是否真的提高了呢?EvalScope框架是魔搭社区上开源的评估工具(https://github.com/modelscope/evalscope),提供了对R1类模型的推理性能的评测能力。
在本最佳实践中,我们通过728道推理题目(与R1技术报告一致)进行演示。评测数据具体包括:
-
MATH-500:一组具有挑战性的高中数学竞赛问题数据集,涵盖七个科目(如初等代数、代数、数论)共500道题。
-
GPQA-Diamond:该数据集包含物理、化学和生物学子领域的硕士水平多项选择题,共198道题。
-
AIME-2024:美国邀请数学竞赛的数据集,包含30道数学题。
具体的流程包括安装相关依赖、准备模型、评测模型以及评测结果的可视化。让我们开始吧。
01.安装依赖
安装EvalScope模型评估框架:
pip install 'evalscope[app,perf]' -U
02.模型准备
接下来,我们以DeepSeek-R1-Distill-Qwen-1.5B模型为例,介绍评估的过程。首先将模型的能力通过一个OpenAI API兼容的推理服务接入,来进行模型的评测。EvalScope也支持通过transformers推理来进行模型评测,具体可见EvalScope文档。
除了将模型部署到云端支持OpenAI接口的服务使用以外,也可以在本地直接用vLLM,ollama等框架直接拉起模型。这里介绍基于vLLM和lmdeploy推理框架的使用,因为这些推理框架能较好的支持并发多个请求,以加速评测过程,同时R1类模型的输出包含较长的思维链,输出token数量往往超过1万,使用高效的推理框架部署模型,可以提高推理速度。
- 使用vLLM:
VLLM_USE_MODELSCOPE=True CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints.openai.api_server --model deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --served-model-name DeepSeek-R1-Distill-Qwen-1.5B --trust_remote_code --port 8801
- 使用lmdeploy:
LMDEPLOY_USE_MODELSCOPE=True CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --model-name DeepSeek-R1-Distill-Qwen-1.5B --server-port 8801
(可选) 测试推理服务性能
在开始正式模型评测前,可以测试一下模型推理服务的性能,以选择性能更好的推理引擎,使用evalscope的perf子命令即可进行测试:
evalscope perf \` `--parallel 10 \` `--url http://127.0.0.1:8801/v1/chat/completions \` `--model DeepSeek-R1-Distill-Qwen-1.5B \` `--log-every-n-query 5 \` `--connect-timeout 6000 \` `--read-timeout 6000 \` `--api openai \` `--prompt '写一个科幻小说,不少于2000字,请开始你的表演' \` `-n 100
参数说明具体可参考性能评测
Benchmarking summary:``+-----------------------------------+-------------------------------------------------------------------------+``| Key | Value |``+===================================+=========================================================================+``| Time taken for tests (s) | 92.66 |``+-----------------------------------+-------------------------------------------------------------------------+``| Number of concurrency | 10 |``+-----------------------------------+-------------------------------------------------------------------------+``| Total requests | 100 |``+-----------------------------------+-------------------------------------------------------------------------+``| Succeed requests | 100 |``+-----------------------------------+-------------------------------------------------------------------------+``| Failed requests | 0 |``+-----------------------------------+-------------------------------------------------------------------------+``| Throughput(average tokens/s) | 1727.453 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average QPS | 1.079 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average latency (s) | 8.636 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average time to first token (s) | 8.636 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average time per output token (s) | 0.00058 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average input tokens per request | 20.0 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average output tokens per request | 1600.66 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average package latency (s) | 8.636 |``+-----------------------------------+-------------------------------------------------------------------------+``| Average package per request | 1.0 |``+-----------------------------------+-------------------------------------------------------------------------+``| Expected number of requests | 100 |``+-----------------------------------+-------------------------------------------------------------------------+``| Result DB path | outputs/20250213_103632/DeepSeek-R1-Distill-Qwen-1.5B/benchmark_data.db |``+-----------------------------------+-------------------------------------------------------------------------+`` ``Percentile results:``+------------+----------+----------+-------------+--------------+---------------+----------------------+``| Percentile | TTFT (s) | TPOT (s) | Latency (s) | Input tokens | Output tokens | Throughput(tokens/s) |``+------------+----------+----------+-------------+--------------+---------------+----------------------+``| 10% | 5.4506 | nan | 5.4506 | 20 | 1011 | 183.7254 |``| 25% | 6.1689 | nan | 6.1689 | 20 | 1145 | 184.9222 |``| 50% | 9.385 | nan | 9.385 | 20 | 1741 | 185.5081 |``| 66% | 11.0023 | nan | 11.0023 | 20 | 2048 | 185.8063 |``| 75% | 11.0374 | nan | 11.0374 | 20 | 2048 | 186.1429 |``| 80% | 11.047 | nan | 11.047 | 20 | 2048 | 186.3683 |``| 90% | 11.075 | nan | 11.075 | 20 | 2048 | 186.5962 |``| 95% | 11.147 | nan | 11.147 | 20 | 2048 | 186.7836 |``| 98% | 11.1574 | nan | 11.1574 | 20 | 2048 | 187.4917 |``| 99% | 11.1688 | nan | 11.1688 | 20 | 2048 | 197.4991 |``+------------+----------+----------+-------------+--------------+---------------+----------------------+
03.模型评测
我们将MATH-500、GPQA-Diamond和AIME-2024三个数据集整合为一个数据集合,放置于modelscope/R1-Distill-Math-Test数据集中,可以直接使用该数据集的ID进行评测操作。如果希望了解数据集的生成过程或者自行定制数据集合,可以参考使用教程。
数据集:
https://modelscope.cn/datasets/modelscope/R1-Distill-Math-Test
配置评测任务
通过以下Python代码,您可以评测DeepSeek-R1-Distill-Qwen-1.5B模型在推理数据集上的表现:
from evalscope import TaskConfig, run_task``from evalscope.constants import EvalType`` ``task_cfg = TaskConfig(` `model='DeepSeek-R1-Distill-Qwen-1.5B', # 模型名称`` api_url='http://127.0.0.1:8801/v1/chat/completions', # 推理服务地址` `api_key='EMPTY',` `eval_type=EvalType.SERVICE, # 评测类型,SERVICE表示评测推理服务` `datasets=[` `'data_collection', # 数据集名称(固定为data_collection表示使用混合数据集)` `],` `dataset_args={` `'data_collection': {` `'dataset_id': 'modelscope/R1-Distill-Math-Test' # 数据集ID 或 数据集本地路径` `}` `},` `eval_batch_size=32, # 发送请求的并发数` `generation_config={ # 模型推理配置` `'max_tokens': 20000, # 最大生成token数,建议设置为较大值避免输出截断` `'temperature': 0.6, # 采样温度 (deepseek 报告推荐值)` `'top_p': 0.95, # top-p采样 (deepseek 报告推荐值)` `'n': 5 # 每个请求产生的回复数量 (注意 lmdeploy 目前只支持 n=1)` `},``)`` ``run_task(task_cfg=task_cfg)
输出结果:
这里的计算指标是AveragePass@1,每个样本重复生成了5次,最终的评测结果是5次的平均值。由于模型生成时进行了采样,输出结果可能会有一定的波动。
+-----------+--------------+---------------+-------+``| task_type | dataset_name | average_score | count |``+-----------+--------------+---------------+-------+``| math | math_500 | 0.7832 | 500 |``| math | gpqa | 0.3434 | 198 |``| math | aime24 | 0.2 | 30 |``+-----------+--------------+---------------+-------+
如果您只想运行单独其中的某些数据集,可以修改上述配置中的datasets和dataset_args参数,例如如下配置将只评测GPQA-Diamond和AIME-2024两个数据集:
datasets=[` `# 'math_500', # 数据集名称` `'gpqa',` `'aime24'``],``dataset_args={ # EvalScope内置支持,无需指定数据集ID` `'math_500': {'few_shot_num': 0 } ,` `'gpqa': {'subset_list': ['gpqa_diamond'], 'few_shot_num': 0},` `'aime24': {'few_shot_num': 0}``},
04.评测结果可视化
EvalScope支持可视化结果,可以查看模型具体的输出。
运行以下命令,可以启动可视化界面:
evalscope app
终端将输出如下链接内容:
* Running on local URL: http://0.0.0.0:7860
点击链接即可看到如下可视化界面,我们需要先选择评测报告然后点击加载:
此外,选择对应的子数据集,我们也可以查看模型的输出内容,观察模型输出是否正确(或者是答案匹配是否存在问题)。可以看到,在下面的例子中模型确实输出了正确的答案:
05.Tips
在这里分享一下评测时可能会踩的一些“坑”:
-
模型生成配置:
-
max_tokens设置:确保将max_tokens设置为较大的值(通常需要在8000以上)。如果设置过低,模型可能会在输出完整答案前被截断。
-
回复数量n配置:在本次评测中,每个请求生成的回复数量n设置为5,而在R1报告中,n为64。读者可以根据需求调整此参数来平衡评测速度与结果的多样性。
-
数据集的提示模版设置:
-
本文采用了R1报告中的推荐设置,提示模版为:“Please reason step by step, and put your final answer within \boxed{}.”;同时,未设置system prompt。确保提示模版的正确性对于生成预期的结果至关重要。
-
评测Reasoning模型需要设置0-shot,过于复杂的prompt或者few-shot都有可能降低模型的性能。
-
生成答案的解析和匹配:
-
我们复用了Qwen-Math工作中的解析方法,该方法基于规则进行答案解析。然而,这种基于规则的解析可能会导致匹配错误,从而对报告的指标产生轻微影响。建议在使用结果时,多使用评测结果可视化功能,查看解析结果是否存在误差。
06.总结
通过这个流程,开发者可以有效地评测R1类模型在多个数学和科学推理数据集上的表现,从而客观评估具体模型的实际表现,共同推动R1类模型的进一步发展与应用。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。