常见问题解答¶
本文档总结了常见问题,并提供了在采用 ExecuTorch 时经常出现的问题的指导。
如果此处未涵盖特定问题,请考虑在 GitHub 的 Issues 或 Discussions 中搜索或创建问题。
安装¶
缺少 /usr/include/python3.x¶
很可能是需要安装 python-dev
库。请运行
sudo apt install python<version>-dev
如果您使用的是 Ubuntu,或者使用等效的安装命令。
ModuleNotFoundError: No module named ‘pytorch_tokenizers’¶
LLM 导出功能需要 pytorch_tokenizers
包。请从 ExecutorTorch 源代码安装该包
pip install -e ./extension/llm/tokenizers/
导出¶
缺少输出变体: { _ }¶
模型可能包含 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 / 尝试调整有界张量的大小…¶
这通常意味着提供的输入与模型导出期间使用的示例输入的形状不匹配。如果模型需要处理不同大小的输入(动态形状),请确保模型导出指定了适当的边界。有关指定动态形状的更多信息,请参阅 表达动态性。
错误 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
调用。