使用 CMake 构建¶
ExecuTorch 使用 CMake 作为其主要构建系统。即使您不直接使用 CMake,CMake 也可以为其他格式(如 Make、Ninja 或 Xcode)生成脚本。有关信息,请参阅 cmake-generators(7)。
CMake 构建系统构建的目标¶
ExecuTorch 的 CMake 构建系统涵盖了运行时中可能对嵌入式系统用户有用的部分。
libexecutorch_core.a
:ExecuTorch 运行时的核心。不包含任何运算符/内核定义或后端定义。libportable_kernels.a
:ATEN 兼容运算符的实现,遵循[functions.yaml](https://github.com/pytorch/executorch/blob/release/0.4/kernels/portable/functions.yaml)
中的签名。libportable_ops_lib.a
:生成的代码,将libportable_kernels.a
的内容注册到运行时。注意:这必须使用类似
-Wl,-force_load
或-Wl,--whole-archive
的标志链接到您的应用程序中。它包含加载时函数,这些函数会自动注册内核,但链接器通常会默认修剪这些函数,因为没有对它们的直接调用。
executor_runner
:一个示例工具,使用所有1
值作为输入运行.pte
程序文件,并将输出打印到标准输出。它与libportable_kernels.a
链接,因此程序可以使用它实现的任何运算符。
为 CMake 构建准备的一次性设置¶
请按照以下步骤操作,以便在使用 CMake 在您的机器上构建之前准备好工具。
如果您的系统上的 python3 版本早于 3.11
运行
pip install tomli
安装 CMake 版本 3.19 或更高版本
运行
conda install cmake
或pip install cmake
。
配置 CMake 构建¶
克隆或拉取上游存储库后,请按照以下步骤操作,因为构建依赖项可能已更改。
# cd to the root of the executorch repo
cd executorch
# Clean cmake cache directory (cmake-out). It's a good practice to do this
# whenever cloning or pulling the upstream repo.
bash install_requirements.sh --clean
完成后,您无需再次执行此操作,直到您再次从上游存储库中拉取,或者修改任何与 CMake 相关的文件。
CMake 构建选项¶
发布版本提供了旨在提高性能和减小二进制文件大小的优化。它禁用程序验证和 executorch 日志记录,并添加优化标志。
CMAKE_FLAGS="-DCMAKE_BUILD_TYPE=Release"
要进一步优化发布版本的大小,请添加
CMAKE_FLAGS="$CMAKE_FLAGS -DOPTIMIZE_SIZE=ON"
请参阅 CMakeLists.txt
构建运行时组件¶
使用以下命令构建所有目标
# Build using the configuration that you previously generated under the
# `cmake-out` directory.
cmake "$CMAKE_FLAGS" -Bcmake-out .
# NOTE: The `-j` argument specifies how many jobs/processes to use when
# building, and tends to speed up the build significantly. It's typical to use
# "core count + 1" as the `-j` value.
cmake --build cmake-out -j9
使用示例应用程序 executor_runner
执行 .pte 文件¶
首先,使用 设置 ExecuTorch 中描述的说明生成 add.pte
或其他 ExecuTorch 程序文件。
然后,将其传递到命令行工具
./cmake-out/executor_runner --model_path path/to/add.pte
如果成功,您应该会看到消息“模型执行成功”,后跟输出值。
I 00:00:00.000526 executorch:executor_runner.cpp:82] Model file add.pte is loaded.
I 00:00:00.000595 executorch:executor_runner.cpp:91] Using method forward
I 00:00:00.000612 executorch:executor_runner.cpp:138] Setting up planned buffer 0, size 48.
I 00:00:00.000669 executorch:executor_runner.cpp:161] Method loaded.
I 00:00:00.000685 executorch:executor_runner.cpp:171] Inputs prepared.
I 00:00:00.000764 executorch:executor_runner.cpp:180] Model executed successfully.
I 00:00:00.000770 executorch:executor_runner.cpp:184] 1 outputs:
Output 0: tensor(sizes=[1], [2.])
交叉编译¶
以下是有关如何对 Android 和 iOS 执行交叉编译的说明。
Android¶
先决条件:Android NDK,选择以下选项之一
假设 Android NDK 可用,请运行
# Run the following lines from the `executorch/` folder
rm -rf cmake-android-out && mkdir cmake-android-out && cd cmake-android-out
# point -DCMAKE_TOOLCHAIN_FILE to the location where ndk is installed
cmake -DCMAKE_TOOLCHAIN_FILE=/Users/{user_name}/Library/Android/sdk/ndk/25.2.9519653/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a ..
cd ..
cmake --build cmake-android-out -j9
adb shell mkdir -p /data/local/tmp/executorch
# push the binary to an Android device
adb push cmake-android-out/executor_runner /data/local/tmp/executorch
# push the model file
adb push add.pte /data/local/tmp/executorch
adb shell "/data/local/tmp/executorch/executor_runner --model_path /data/local/tmp/executorch/add.pte"
iOS¶
对于 iOS,我们将构建 框架 而不是静态库,它还将在内部包含公共头文件。
从 Mac App Store 安装 Xcode,然后使用终端安装命令行工具
xcode-select --install
构建框架
./build/build_apple_frameworks.sh
运行上述命令并添加 --help
标志,以了解如何构建其他后端(例如 Core ML、MPS 或 XNNPACK)等的更多信息。请注意,某些后端可能需要额外的依赖项以及特定版本的 Xcode 和 iOS。
将生成的
.xcframework
捆绑包复制到您的 Xcode 项目中,将它们链接到您的目标,并且不要忘记添加额外的链接器标志-all_load
。
查看 iOS 演示应用程序 教程以获取更多信息。
后续步骤¶
您已成功将 executor_runner
二进制文件交叉编译到 iOS 和 Android 平台。您可以开始探索高级功能和特性。以下列出了一些您可能想接下来阅读的部分
选择性构建,以构建仅链接到程序使用的内核的运行时,这可以显著减少二进制文件的大小。
关于将应用程序部署到嵌入式设备(如 ARM Cortex-M/Ethos-U 和 XTensa HiFi DSP)的教程。