Multimual算子在动静态编译时行为不一致
2023/05/22
128
问题信息
问题来源 | 产品大类 | 关键字 |
---|---|---|
官方 | 算子开发 | Multimual算子、算子编译 |
问题现象描述
PyTorch在线推理场景,通过二进制配置文件,相同的输入和模型,固定shape场景下的算子可以运行成功,但动态shape场景下出现报错MultinomialWithReplacement算子不支持。
设备信息:昇腾910 AI处理器
PyTorch版本:1.8.1及以上
模型来源:https://huggingface.co/ClueAI/ChatYuan-large-v1
原因分析
- 通过查看~/ascend/log/debug/device-6下的日志,可以确认传入该算子的值不符合要求。
该算子会对传入的每个值进行非负判断,代码如下:
- 通过PyTorch场景hook机制中的register_forward_hook配置将动态编译和静态编译中的前向各层推理结果打印出来,用二分法对比每一层的输出基本相同,需要进一步分析。
- 通过pdb设置断点,单步调试,发现在经过logits_warper函数处理后,动静态编译的结果差异较大。
- 通过打印出logits_warper,发现它是两个对象的list,深入对logtis_warper进行分析。
- logits_wraper是一个类,会去遍历里面的对象,并按顺序处理。
- 将动静态shape场景下的scores保存下来,通过对比可以发现,固定shape场景下的很多非nan值变成了nan值。
- 通过构建单算子用例可以证明masked_fill存在问题。
解决措施
确认masked_fill存在问题后,可以采用规避方案将masked_fill配置在cpu上进行计算。
本页内容