PyTorch中@torch.jit.export注解失效,调用inference提示属性不存在
问题原因及解决方案
核心原因
- 移动端优化的方法裁剪:
optimize_for_mobile在为Android平台优化模型时,默认会优先保留和张量运算强绑定的forward方法,你用@torch.jit.export导出的inference方法因为处理的是字符串这类非张量输入输出,会被自动裁剪,导致加载后找不到该属性。 - Lite解释器的功能限制:通过
_save_for_lite_interpreter保存的是适配移动端Lite运行时的模型,该运行时对自定义导出方法的支持有限,尤其是处理非张量类型的方法,无法被正常保留。
修复方案
方案一:优化时强制保留导出方法
修改optimizeSave函数,添加参数让优化工具保留所有导出的方法:
def optimizeSave(model, model_folder): scripted_module = torch.jit.script(model) # 关键参数:保留所有@torch.jit.export标记的方法 scripted_module_optimized = optimize_for_mobile( scripted_module, preserve_exported_methods=True ) scripted_module_optimized._save_for_lite_interpreter(f"{model_folder}/inference.pt")
方案二:改用标准脚本模型保存(非移动端专用)
如果不需要严格适配移动端Lite运行时,可跳过移动端优化步骤,直接保存标准脚本模型:
def optimizeSave(model, model_folder): scripted_module = torch.jit.script(model) # 直接保存脚本模型,不使用Lite解释器格式 scripted_module.save(f"{model_folder}/inference.pt")
加载后inference方法可正常调用。
方案三:适配移动端张量处理逻辑(推荐)
如果要在Android移动端运行,建议把字符串处理逻辑转为张量兼容的操作,因为PyTorch Lite对张量的支持更完善。比如将字符串编码为张量输入,处理后再解码为字符串:
class MyModel(nn.Module): def __init__(self): super(MyModel, self).__init__() def forward(self, x): return x @torch.jit.export def inference(self, x: torch.Tensor) -> torch.Tensor: # 示例:模拟字符串转张量后的处理逻辑 # 实际场景需实现字符串与张量的编码/解码逻辑 return x + 1
内容的提问来源于stack exchange,提问作者user1072605
相关产品推荐
相关产品推荐

