#bindings #pytorch #machine-learning #no-alloc #executorch #edge-device

sys no-std executorch-sys

ExecuTorch的不安全Rust绑定 - PyTorch在移动、嵌入式和边缘设备上的设备AI

6个版本

新版本 0.3.0 2024年8月23日
0.2.0 2024年8月9日
0.1.0 2024年8月3日

#891 in 机器学习

Download history 246/week @ 2024-07-29 168/week @ 2024-08-05 21/week @ 2024-08-12

每月下载量435
executorch中使用

Apache-2.0

68KB
395 代码行

executorch-sys

有关项目的通用描述,请参阅executorch crate。

构建

要构建库,您需要首先构建C++库。C++库允许使用许多标志,可以自定义构建哪些模块、内核和扩展。构建了多个静态库,Rust库将链接到它们。以下示例展示了如何使用运行示例hello_world_add所需的标志构建C++库:

# Clone the C++ library
cd ${TEMP_DIR}
git clone --depth 1 --branch v0.3.0 https://github.com/pytorch/executorch.git
cd executorch
git submodule sync --recursive
git submodule update --init --recursive

# Install requirements
./install_requirements.sh

# Build C++ library
mkdir cmake-out && cd cmake-out
cmake \
    -DDEXECUTORCH_SELECT_OPS_LIST=aten::add.out \
    -DEXECUTORCH_BUILD_EXECUTOR_RUNNER=OFF \
    -DEXECUTORCH_BUILD_EXTENSION_RUNNER_UTIL=OFF \
    -DBUILD_EXECUTORCH_PORTABLE_OPS=ON \
    -DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
    -DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
    -DEXECUTORCH_ENABLE_PROGRAM_VERIFICATION=ON \
    -DEXECUTORCH_ENABLE_LOGGING=ON \
    ..
make -j

# Static libraries are in cmake-out/
# core:
#   cmake-out/libexecutorch.a
#   cmake-out/libexecutorch_no_prim_ops.a
# kernels implementations:
#   cmake-out/kernels/portable/libportable_ops_lib.a
#   cmake-out/kernels/portable/libportable_kernels.a
# extension data loader, enabled with EXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON:
#   cmake-out/extension/data_loader/libextension_data_loader.a
# extension module, enabled with EXECUTORCH_BUILD_EXTENSION_MODULE=ON:
#   cmake-out/extension/module/libextension_module_static.a

# Run example
# We set EXECUTORCH_RS_EXECUTORCH_LIB_DIR to the path of the C++ build output
cd ${EXECUTORCH_RS_DIR}/examples/hello_world_add
python export_model.py
EXECUTORCH_RS_EXECUTORCH_LIB_DIR=${TEMP_DIR}/executorch/cmake-out cargo run

executorch crate将始终查找以下静态库:

  • libexecutorch.a
  • libexecutorch_no_prim_ops.a

如果启用了功能标志,则需要额外的库(参见下一节)

  • libextension_data_loader.a
  • libextension_module_static.a

只有当您的模型使用它们时,才需要实现内核的静态库,并且它们应该由使用executorch crate的二进制文件手动链接。例如,hello_world_add示例使用一个只有一个加法操作的操作模型,因此它使用以下命令编译C++库:

println!("cargo::rustc-link-lib=static:+whole-archive=portable_kernels");
println!("cargo::rustc-link-lib=static:+whole-archive=portable_ops_lib");

let libs_dir = std::env::var("EXECUTORCH_RS_EXECUTORCH_LIB_DIR").unwrap();
println!("cargo::rustc-link-search={}/kernels/portable/", libs_dir);

注意,操作和内核库使用+whole-archive链接,以确保所有符号都包含在二进制文件中。

Cargo功能

  • data-loader

    包含FileDataLoaderMmapDataLoader结构。如果没有此功能,则唯一可用的数据加载器是BufferDataLoader。需要libextension_data_loader.a静态库,使用EXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON编译C++ executorch

  • module

    包含Module结构体。需要libextension_module_static.a静态库,使用EXECUTORCH_BUILD_EXTENSION_MODULE=ON编译C++ executorch。还包含std功能。

  • std

    启用标准库。此功能默认启用,但可以禁用以在no_std环境中构建executorch。注意:no_std仍在开发中,请参阅https://github.com/pytorch/executorch/issues/4561

默认情况下启用std功能。

依赖项

~0–2MB
~40K SLoC