作者​:昇腾实战派
知识地图​: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推理框架上的长序列精度问题定位思路。

定位思路

  1. 检查模型评测配置是否与模型论文配置对齐;
  2. 检查权重文件是否有误,如权重非官方来源、配置文件有已知问题且有新的pr修改;
  3. 对评测数据集的模型输出结果进行分析,发掘有用信息;
  4. 找到精度无误的版本,进行dump对比和pr二分以找出版本引入该问题的位置;
  5. 对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{}."
​

注:

  1. badcase分析工具现版本已经加入msit工具包中。

依赖工具:Ascend/msit - GitCode

排查权重和aisbench工具配置

  1. 检查测试配置对齐模型论文配置;
  2. 使用相同的权重和工具,在MindIE上跑完整数据集,排查权重和工具是否有不对的地方。

现象:MindIE上完整数据集精度符合预期。

Dump 模型输出对比

  1. 同框架不同模式对比——验证单算子下的模型精度
  2. 不同框架对比——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。

这里从两个方面去解决:

  1. 模型层面定位(替换模型中的算子来解决精度问题)——使用单算子模式替换成fia算子、kv_rms_norm_rope_cache、interleave_rope 进行精度问题排查,检查替换后的算子接入模型后是否有异常。
  2. 算子层面定位(正向排查算子的精度问题)——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)下会不影响主模型精度。这里初步测试了一下离线的推理,发现精度是正常的,因此定位从以下几个角度考虑:

  1. dump tensor 正向定位,查看异常logits。
  2. 模拟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类浅拷贝原因,原数据被改写后未能写回。
在这里插入图片描述

修改如下:
在这里插入图片描述

具体见[BUGFIX] FIX mtp accuraccy when temperture is not 0 by JC-ut0 · Pull Request #1632 · vllm-project/vllm-ascend

总结

MTP功能的精度问题可以着重从以下几个方面来看:mtp实现、后处理实现。

具体定位方法主要通过先找到标杆,固定随机种子后,对以上几个位置的入参出参进行dump打点,来对比实际的输入输出是否和标杆一致。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐