You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中@torch.jit.export注解失效,调用inference提示属性不存在

问题原因及解决方案

核心原因

  1. 移动端优化的方法裁剪:optimize_for_mobile在为Android平台优化模型时,默认会优先保留和张量运算强绑定的forward方法,你用@torch.jit.export导出的inference方法因为处理的是字符串这类非张量输入输出,会被自动裁剪,导致加载后找不到该属性。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:47:40