昇腾故障案例详情页

Multimual算子在动静态编译时行为不一致

更新时间: 2023/05/22

暂无评分

问题信息

问题来源产品大类关键字
官方算子开发Multimual算子、算子编译

问题现象描述

PyTorch在线推理场景,通过二进制配置文件,相同的输入和模型,固定shape场景下的算子可以运行成功,但动态shape场景下出现报错MultinomialWithReplacement算子不支持。

设备信息:昇腾910 AI处理器

PyTorch版本:1.8.1及以上

模型来源:https://huggingface.co/ClueAI/ChatYuan-large-v1

原因分析

  1. 通过查看~/ascend/log/debug/device-6下的日志,可以确认传入该算子的值不符合要求。

    该算子会对传入的每个值进行非负判断,代码如下:

  2. 通过PyTorch场景hook机制中的register_forward_hook配置将动态编译和静态编译中的前向各层推理结果打印出来,用二分法对比每一层的输出基本相同,需要进一步分析。

  3. 通过pdb设置断点,单步调试,发现在经过logits_warper函数处理后,动静态编译的结果差异较大。

  4. 通过打印出logits_warper,发现它是两个对象的list,深入对logtis_warper进行分析。

  5. logits_wraper是一个类,会去遍历里面的对象,并按顺序处理。

    • 第一个对象是TemperatureLogitsWarper,发现里面只对scores的每一个值除以self.temperature,self.temperature和scores值在动静态场景都一样,故问题不在这个类上。

    • 第二个对象是TopKLogitsWarper,通过单步调试发现top_k和indices_to_remove在动静态shape场景下一致,经过masked_fill之后差异非常大。

  6. 将动静态shape场景下的scores保存下来,通过对比可以发现,固定shape场景下的很多非nan值变成了nan值。

  7. 通过构建单算子用例可以证明masked_fill存在问题。

解决措施

确认masked_fill存在问题后,可以采用规避方案将masked_fill配置在cpu上进行计算。

本页内容

该页面对您有帮助吗?
我要评分