mindformers/pynative/layers/dropout.py 中 Dropout 在 drop_prob=0.0 时仍会调用底层 mindspore.mint.nn.functional.dropout。
mindformers/pynative/layers/dropout.py
Dropout
drop_prob=0.0
mindspore.mint.nn.functional.dropout
当 dropout 概率为 0 时,语义上 dropout 已关闭,训练态下也应直接返回输入,不应继续下发 dropout 算子。当前行为会产生不必要的算子执行/图中节点,影响性能和算子行为预期。
最小复现逻辑:
import mindspore as ms from mindspore import context from mindformers.pynative.layers.dropout import Dropout context.set_context(mode=context.PYNATIVE_MODE) x = ms.ops.randn((2, 4, 16), dtype=ms.float32) dropout = Dropout(0.0) dropout.set_train(True) out = dropout(x) 预期行为: drop_prob=0.0 时直接返回输入,不调用底层 dropout 算子。 实际行为: drop_prob=0.0 且 training=True 时仍进入底层 dropout ### 详细的环境信息描述 MindFormers 分支:master / 当前开发分支 执行模式:PYNATIVE_MODE 影响模块:mindformers/pynative/layers/dropout.py 硬件/驱动/MindSpore 版本:所有版本 ### 其他辅助信息 parallel_core/training_graph/transformer/dropout.py 中已有类似短路逻辑: if not self.training or not self.use_dropout: return x pynative dropout 实现应保持一致:当 drop_prob=0.0 或 eval 模式时直接返回输入。 ### 版本信息 MF当前master Thanks for contributing 🎉!
Checklist
🐞 问题详细描述
mindformers/pynative/layers/dropout.py中Dropout在drop_prob=0.0时仍会调用底层mindspore.mint.nn.functional.dropout。当 dropout 概率为 0 时,语义上 dropout 已关闭,训练态下也应直接返回输入,不应继续下发 dropout 算子。当前行为会产生不必要的算子执行/图中节点,影响性能和算子行为预期。
最小复现逻辑:
import mindspore as ms from mindspore import context from mindformers.pynative.layers.dropout import Dropout context.set_context(mode=context.PYNATIVE_MODE) x = ms.ops.randn((2, 4, 16), dtype=ms.float32) dropout = Dropout(0.0) dropout.set_train(True) out = dropout(x) 预期行为: drop_prob=0.0 时直接返回输入,不调用底层 dropout 算子。 实际行为: drop_prob=0.0 且 training=True 时仍进入底层 dropout ### 详细的环境信息描述 MindFormers 分支:master / 当前开发分支 执行模式:PYNATIVE_MODE 影响模块:mindformers/pynative/layers/dropout.py 硬件/驱动/MindSpore 版本:所有版本 ### 其他辅助信息 parallel_core/training_graph/transformer/dropout.py 中已有类似短路逻辑: if not self.training or not self.use_dropout: return x pynative dropout 实现应保持一致:当 drop_prob=0.0 或 eval 模式时直接返回输入。 ### 版本信息 MF当前master Thanks for contributing 🎉!