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
相关产品推荐
相关产品推荐

