常见问题¶
本页汇总了常见问题,并提供了采用 ExecuTorch 时常遇到问题的指导。
如果此处未涵盖特定问题,请考虑在 GitHub 的 Issues 或 Discussions 中搜索或创建问题。
安装¶
缺少 /usr/include/python3.x¶
很可能需要安装 python-dev
库。请运行
sudo apt install python<version>-dev
如果您使用 Ubuntu,或者使用等效的安装命令。
导出¶
缺少 out 变体: { _ }¶
模型可能包含 torch 自定义运算符。自定义运算符需要 Executorch 实现,并且需要在导出时加载。请参阅ExecuTorch 自定义运算符文档,了解具体操作方法。
运行时¶
ExecuTorch 错误码定义在 executorch/core/runtime/error.h 中。
推理缓慢 / 性能故障排除¶
如果从源代码构建运行时,请确保构建在发布模式下完成。对于 CMake 构建,可以通过传递 -DCMAKE_BUILD_TYPE=Release
来实现。
确保模型已委托。如果未针对特定加速器,请使用 XNNPACK 委托以提高 CPU 性能。未委托的运算符通常会回退到 ExecuTorch 可移植库,该库设计为备用,不适用于性能敏感的运算符。要针对 XNNPACK,请将 XnnpackPartitioner
传递给 to_edge_transform_and_lower
。有关更多信息,请参阅使用 XNNPACK 后端构建和运行 ExecuTorch。
线程数对 CPU 性能有显著影响。最佳线程数可能取决于模型和应用程序。默认情况下,ExecuTorch 目前会使用与核心数一样多的线程。考虑将线程数设置为核心数 / 2,或者在移动 CPU 上直接设置为 4。
可以使用以下函数设置线程数。请确保在加载或运行模型之前完成此操作。
::executorch::extension::threadpool::get_threadpool()->_unsafe_reset_threadpool(num_threads);
为了更深入地研究模型性能,ExecuTorch 支持运算符级别的性能分析。有关更多信息,请参阅使用 ExecuTorch 开发者工具对模型进行性能分析。
缺少日志¶
ExecuTorch 提供了用于路由运行时日志的钩子。默认情况下,日志会发送到 stdout/stderr,但用户可以覆盖 et_pal_emit_log_message
将日志路由到自定义目标。Android 和 iOS 扩展还提供开箱即用的日志路由到相应的平台日志。有关更多信息,请参阅运行时平台抽象层 (PAL)。
设置输入错误: 0x10 / 尝试调整有界 Tensor 大小…¶
这通常意味着提供的输入与模型导出期间使用的示例输入的形状不匹配。如果模型预计处理可变大小的输入(动态形状),请确保模型导出指定了适当的边界。有关指定动态形状的更多信息,请参阅表达动态性。
错误 0x14(运算符缺失)¶
这通常意味着选择性构建配置不正确。请确保运算符库是从当前版本的模型生成的,并且相应的 et_operator_library
是应用级别 executorch_generated_lib
的依赖项,并且生成的库已链接到应用程序中。
如果 ExecuTorch 可移植库尚未实现给定 ATen 运算符,也可能发生此问题。在这种情况下,请考虑在 GitHub 上搜索或创建问题。
错误 0x20(未找到)¶
此错误可能由于多种原因发生,但最常见的是缺少后端目标。请确保已链接相应的后端目标。对于 XNNPACK,即 xnnpack_backend
。如果后端已链接但仍不可用,请尝试使用 --whole-archive
进行链接:-Wl,--whole-archive libxnnpack_backend.a -Wl,--no-whole-archive
。
重复内核注册中止¶
这表现为崩溃调用堆栈包含 ExecuTorch 内核注册,并因 et_pal_abort
而失败。这通常意味着应用程序中链接了多个 gen_operators_lib
目标。每个目标只能有一个生成的运算符库,尽管每个模型可以有自己的 gen_selected_ops/generate_bindings_for_kernels
调用。