DeepSeek-R1在vLLM-Ascend上的精度问题定位
作者:昇腾实战派
知识地图:https://blog.csdn.net/Lumos_Lovegood/article/details/161601003
背景概述
在基于vLLM-Ascend推理框架部署DeepSeek-R1模型时,我们发现模型在大部分输入输出场景下精度符合预期,在少量场景下精度可能存在一些问题。具体表现为GPQA和AIME2024等数据集的评测得分低于论文报告值。
本文从配置对齐、权重验证、输出分析、版本二分、代码定位等多个维度出发,系统性地排查并解决了该精度问题,并进一步修复了叠加MTP(Multi-Token Prediction)特性后出现的精度异常。
环境信息
| 环境信息 | 版本 |
|---|---|
| 推理框架 | vLLM-Ascend(0.9.1) |
| 硬件设备 | Atlas 800I A3 单机 |
| 特性 | torchair图模式 |
| 并行策略 | DP4、TP4、ETP16 |
问题描述
在使用aisbench测评工具对DeepSeek-R1做正确性验证的过程中,模型在输入输出较短的数据集上的验证结果符合论文精度预期,而在部分输出长序列文本的数据集上,模型的得分较低,以下是针对DeepSeek-R1在vLLM-Ascend推理框架上的长序列精度问题定位思路。
定位思路
- 检查模型评测配置是否与模型论文配置对齐;
- 检查权重文件是否有误,如权重非官方来源、配置文件有已知问题且有新的pr修改;
- 对评测数据集的模型输出结果进行分析,发掘有用信息;
- 找到精度无误的版本,进行dump对比和pr二分以找出版本引入该问题的位置;
- 对vllm和vllm-ascend源码中有关长序列的相关代码进行正向定位。
排查过程
模型正确性验证配置参考:deepseek-ai/DeepSeek-R1

官方给出的temp为0.6,topp为0.95,max-seq-len为32K,实际测试时已经对齐该配置。
bad case分析:


由于精度测试时服务化配置的为32K左右,这里可以看到应该是输出到了32K左右因为长度被截断了,这里后面的输出文本全部为重复吐句子。因此后续工作选取该用例为badcase进行测试。
"\nEight circles of radius $34$ are sequentially tangent, and two of the circles are tangent to $AB$ and $BC$ of triangle $ABC$, respectively. $2024$ circles of radius $1$ can be arranged in the same manner. The inradius of triangle $ABC$ can be expressed as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.[asy] pair A = (2,1); pair B = (0,0); pair C = (3,0); dot(A^^B^^C); label(\"$A$\", A, N); label(\"$B$\", B, S); label(\"$C$\", C, S); draw(A--B--C--cycle); for(real i=0.62; i<2.7; i+=0.29){ draw(circle((i,0.145), 0.145)); } [/asy]\n\nPlease reason step by step, and put your final answer within \\boxed{}."
注:
- badcase分析工具现版本已经加入msit工具包中。
排查权重和aisbench工具配置
- 检查测试配置对齐模型论文配置;
- 使用相同的权重和工具,在MindIE上跑完整数据集,排查权重和工具是否有不对的地方。
现象:MindIE上完整数据集精度符合预期。
Dump 模型输出对比
- 同框架不同模式对比——验证单算子下的模型精度
- 不同框架对比——MindIE框架下的模型精度
多次测试中找到一个badcase,在该case下单算子回答正确,图模式多次回答结果都为错误。
单算子模式下错误的问题中,模型没有重复输出某句话的现象并且会给出答案(即使答案是错的),而图模式下大多都是重复输出某句话的现象。因此需要使用msit llm dump工具对该case的logits进行落盘。
dump工具的使用见Pytorch场景数据dump.md,以及torchair下dump使用见TorchAir场景Dump.md。
排查代码逻辑——位置编码(问题根因)
由于单算子精度正确,图模式精度有问题,差异就是图以及图模式才会用到的几个算子。因此对长序列下相关的算子打点排查,即rope、FIA、kv_rms_norm_rope_cache、interleave_rope。
这里从两个方面去解决:
- 模型层面定位(替换模型中的算子来解决精度问题)——使用单算子模式替换成fia算子、kv_rms_norm_rope_cache、interleave_rope 进行精度问题排查,检查替换后的算子接入模型后是否有异常。
- 算子层面定位(正向排查算子的精度问题)——dump模型中的输入输出后,根据单算子调用和torchair图模式场景下的UT实现进行定位。
这里主要介绍下从算子层面定位的解决过程。
在torchair代码部分指定输入,dump指定layer:
通过torchair组网对应的FX图的eager mode跑用例7 bad case的输出结果。(后续该模式可用于图模式的精度验证和debug)
在对代码打点的过程中,注意到max_postional_embeddings可能有些异常。
下面是vllm代码中deepseek长序列下rope长度外推策略:

而在vllm-ascend的attention部分,图模式下seq_len的长度并未乘以缩放因子,这样会导致模型实际可处理序列长度被截断或越界。理想情况是引入插值+温度缩放后,将模型可处理长度拓展到max_position_embeddings * scaling_factor的序列长度。
实际未乘以缩放因子的推理过程中,并未出现过越界等问题,所以这里对应到了上文提到的badcase吐字重复现象。
bugfix_pr详见:[v0.9.1][bugfix] fix accuracy prolem for deepseek V3/R1 models with t… · vllm-project/vllm-ascend@a3a3d38
使用该修改后长序列数据集下精度测试结果正常。
总结
部分精度问题可以从位置编码部分入手。
具体定位方法主要通过先找到标杆,固定随机种子后,对以上几个位置的入参出参进行dump打点,来对比实际的输入输出是否和标杆一致。由于deepseek在npu上的图模式走的是torchair路线,打点相当于torch原生的图模式会稍微容易一些,虽然也不简单。这里强烈建议使用MindStudio的dump工具,在torchair模式下dump数据。
叠加MTP后的精度问题
问题描述
服务化(tp4dp4ep16)部署成功后,请求过程中指定temperture=0的时候模型回答结果符合预期情况,但是temperature=0.6的时候,MTP的接受率始终为0,且模型输出存在精度问题。如下图:

定位思路
理论上来说mtp被拒绝的情况(MTP接受率为0)下会不影响主模型精度。这里初步测试了一下离线的推理,发现精度是正常的,因此定位从以下几个角度考虑:
- dump tensor 正向定位,查看异常logits。
- 模拟mtp token,实际上关闭mtp propose,查看mtp接受率为0时最终输出结果是否正常。
- 输出正常:说明mtp 模型运行过程中有修改部分主模型数据,如kv cache
- 信息:多dp服务化,若request不能满足所有dp,会对未有req的dp组发起dumm_run(1)
- 实验:修改dummy_run 逻辑,定界是dummy_run 引起的还是propose引起的。
排查过程
(1)KVcache处理逻辑:在小模型推错的场景,对KVcache的处理逻辑是直接进行下一轮,还是把上一轮的kvcache删除? – 与吴雨珊对齐实现逻辑
(2)后处理对接流程排查:以不开MTP,tempture = 0.6,把Seed固定作为标杆,开启MTP,tempture = 0.6,把Seed固定,观察第一个decode是否符合预期。
Dump 模型输出对比
由于使用了mtp特性,会额外有个投机小模型,这里分别对主模型和小模型进行dump。
固定seed后,已不开MTP为标杆,将主模型的输出进行打点进行对比,对比发现给投机小模型的输入不符合预期,查看后处理代码,打印相关的入参发现后处理采样的 rejection_random_sample_pytorch 中的逻辑存在问题(该段逻辑在并行解码部分),这里的变量虽然会在下面被再次赋值,但由于tensor类浅拷贝原因,原数据被改写后未能写回。
修改如下:
总结
MTP功能的精度问题可以着重从以下几个方面来看:mtp实现、后处理实现。
具体定位方法主要通过先找到标杆,固定随机种子后,对以上几个位置的入参出参进行dump打点,来对比实际的输入输出是否和标杆一致。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)