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

Android端LibTorch加载PyTorch模型报错:找不到aten::empty.memory_format schema

解决Android LibTorch加载模型时"找不到aten::empty.memory_format schema"的问题

替代-force_load的强制初始化方法

1. 显式触发算子相关代码链接

在你的JNI初始化代码(比如JNI_OnLoad)中,主动调用一次带memory_format参数的aten::empty,让链接器无法剥离相关的算子注册逻辑:

#include <torch/torch.h>

jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    // 生成一个临时张量,触发aten::empty.memory_format的代码链接
    at::Tensor dummy = at::empty(
        {1}, 
        at::TensorOptions().memory_format(at::MemoryFormat::Contiguous)
    );
    // 其他初始化逻辑
    return JNI_VERSION_1_6;
}

2. 使用链接器-u选项强制保留注册符号

通过nm命令查看libtorch.so中的算子注册符号(比如搜索empty_memory_format相关的静态变量),找到对应的符号名后,在CMake配置中添加-u参数强制链接器保留该符号:

target_link_libraries(your_jni_target
    PRIVATE
    ${TORCH_LIBRARIES}
    # 替换为实际找到的符号名,示例符号仅供参考
    -u __ZN3at6detail30empty_memory_format_schema_registrationE
)

符号名可以通过nm -D libtorch.so | grep empty_memory_format命令在LibTorch库中查询。

3. 调用LibTorch初始化函数

部分LibTorch版本提供了全局初始化函数,在加载模型前调用可确保所有算子完成注册:

#include <torch/torch.h>

void load_model() {
    torch::init(); // 触发所有静态初始化逻辑
    auto model = torch::jit::load("your_model.pt");
    // 模型后续操作
}

aten::empty.memory_format的schema注册位置

该算子的schema注册逻辑位于LibTorch的ATen模块中:

  • schema定义:aten/src/ATen/ops/empty_ops.h,通过TORCH_OPERATOR宏完成注册
  • 实现代码:aten/src/ATen/native/TensorFactories.cpp,对应的实现函数为empty_memory_format

静态注册的核心是通过全局静态变量将算子schema注册到c10::Dispatcher,如果链接器剥离了这些静态变量,就会出现找不到schema的错误。

内容的提问来源于stack exchange,提问作者leremjs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:15