ExecuTorch 运行时 API 参考¶
ExecuTorch C++ API 为导出的 PyTorch 模型提供了一个设备上执行框架。
有关运行时 API 的教程式介绍,请查看 运行时教程 及其 简化 版本。
有关 API 如何演变以及弃用过程的详细信息,请参阅 ExecuTorch API 生命周期和弃用策略。
模型加载和执行¶
-
class Program¶
反序列化的 ExecuTorch 程序二进制文件。
公共类型
公共函数
-
Result<const void*> get_constant_buffer_data(size_t buffer_idx, size_t nbytes) const¶
获取Program中索引为buffer_idx的常量缓冲区。
- 参数
buffer_idx – [in] 常量缓冲区中缓冲区的索引。
nbytes – [in] 从缓冲区读取的字节数。
- 返回值
具有相应索引的缓冲区。
-
size_t num_methods() const¶
返回程序中的方法数量。
-
Result<const char*> get_method_name(size_t method_index) const¶
返回特定索引处方法的名称。
- 参数
method_index – [in] 要检索的方法名称的索引。必须小于
num_methods()
返回的值。- 返回值
-
Result<Method> load_method(const char *method_name, MemoryManager *memory_manager, EventTracer *event_tracer = nullptr) const¶
加载指定名称的方法并准备执行。
- 参数
method_name – [in] 要加载的方法的名称。
memory_manager – [in] 在初始化和执行加载方法期间使用的分配器。如果
memory_manager.temp_allocator()
为null,则运行时将使用et_pal_allocate()
分配临时内存。event_tracer – [in] 用于此方法运行的事件跟踪器。
- 返回值
成功时返回加载的方法,失败时返回错误。
-
Result<MethodMeta> method_meta(const char *method_name) const¶
收集指定名称方法的元数据。
- 参数
method_name – [in] 要获取元数据的方法的名称。
- ET_DEPRECATED Result< const char * > get_output_flattening_encoding (const char *method_name="forward") const
已弃用:获取输出的pytree编码字符串。已弃用,因为此功能最终将从核心程序移动到更高级别的结构中,但目前该结构尚不存在。
- 参数
method_name – [in] 要获取编码的方法的名称。
- 返回值
输出的pytree编码字符串
公共静态函数
- static ET_NODISCARD Result< Program > load (DataLoader *loader, Verification verification=Verification::Minimal)
从提供的加载器加载Program。该Program将持有指向加载器的指针,该加载器必须比返回的Program实例存活更久。
- static inline ET_DEPRECATED ET_NODISCARD Result< Program > Load (DataLoader *loader, Verification verification=Verification::Minimal)
已弃用:请改用小写
load()
。
-
static HeaderStatus check_header(const void *data, size_t size)¶
在提供的data中查找ExecuTorch程序头。
- 参数
data – [in] 来自可能包含ExecuTorch程序的文件开头的data。
size – [in]
data
的字节大小。必须>=kMinHeadBytes
。
- 返回值
描述data中是否存在头的值。
公共静态属性
-
static constexpr size_t kMinHeadBytes = 64¶
调用
check_header
所需的最小字节数。
-
Result<const void*> get_constant_buffer_data(size_t buffer_idx, size_t nbytes) const¶
-
class Method¶
executorch程序的可执行方法。映射到原始nn.Module上的python方法,如
forward()
。公共函数
- ET_NODISCARD Error set_input (const EValue &input_evalue, size_t input_idx)
将内部输入值设置为与提供的value等效。
- 参数
input_evalue – [输入] 要复制到方法输入中的 evalue。如果 evalue 是一个张量,则在大多数情况下会复制数据,因此此处传入的张量并不总是需要在此调用结束后仍然存在。但有一种情况是 Method 会保留指向张量数据的指针。根据方法的内存计划,输入可能没有为其预分配缓冲区空间。在这种情况下,执行器将为此处提供的作为输入的张量的内存分配别名,而不是将输入深度复制到内存计划的区域。
input_idx – [输入] 要设置的输入的基于零的索引。必须小于 inputs_size() 返回的值。
- 返回值
成功时返回 Error::Ok,失败时返回非 Ok。
- ET_NODISCARD Error set_inputs (const executorch::aten::ArrayRef< EValue > &input_evalues)
设置所有方法输入的值。
有关行为的更详细说明,请参阅 set_input()。
- 参数
input_evalues – [输入] 所有方法输入的新值。每个元素的类型必须与相应输入的类型匹配。如果某个元素的值是张量,则尝试允许动态形状,但 dtype 必须始终一致。
- 返回值
成功时返回 Error::Ok,失败时返回非 Ok。
- ET_NODISCARD Error set_output_data_ptr (void *buffer, size_t size, size_t output_idx)
将指定方法输出的数据缓冲区设置为提供的值。
注意:根据方法的内存计划,输出张量可能没有为其预分配缓冲区空间,在这种情况下,执行器会将这些张量指向此处提供的缓冲区,因此用户应注意此内存的生命周期要长于执行器的前向传播。
- 参数
buffer – [输入] 要将指定张量指向的内存块。
size – [输入] 缓冲区的长度(以字节为单位),必须大于或等于指定张量的 nbytes。
output_idx – [输入] 要为其设置 data_ptr 的输出的索引。必须对应于一个张量,并且该张量不能由内存计划分配缓冲区。
- 返回值
成功时返回 Error::Ok,失败时返回非 Ok。
- ET_NODISCARD Error get_outputs (EValue *output_evalues, size_t length)
将方法的输出复制到提供的数组中。
警告:输出包含内部张量输出的浅拷贝。请勿修改返回的张量元素。
TODO(T139259264):添加检查以检测输出突变或深度复制输出。
- 参数
output_evalues – [输入] 要将输出复制到的数组。前
outputs_size()
个元素将设置为相应的输出值。数组的其余部分将设置为 EValue 值 None。length – [输入]
output_evalues
数组的大小(以元素为单位)。必须大于或等于outputs_size()
。
- 返回值
成功时返回 Error::Ok,失败时返回非 Ok。
- ET_NODISCARD Error get_inputs (EValue *input_evalues, size_t length)
将方法的输入复制到提供的数组中。
警告:输入包含内部张量输入的浅拷贝。请勿修改返回的张量元素。
- 参数
input_evalues – [输入] 要将输入复制到的数组。前
inputs_size()
个元素将设置为相应的输入值。数组的其余部分将设置为 EValue 值 None。length – [输入]
input_evalues
数组的大小(以元素为单位)。必须大于或等于inputs_size()
。
- 返回值
成功时返回 Error::Ok,失败时返回非 Ok。
- ET_NODISCARD Error execute ()
执行方法。
注意:如果方法已使用
step()
api 部分执行,则将失败。- 返回值
成功时返回 Error::Ok,失败时返回非 Ok。
- ET_EXPERIMENTAL ET_NODISCARD Error step ()
实验性:在方法中推进/执行单个指令。
- 返回值
Error::Ok – 步骤成功
非 Ok – 步骤失败
Error::EndOfMethod – 方法已成功完成执行
- ET_DEPRECATED ET_NODISCARD Error experimental_step ()
已弃用:请改用
step()
。
- ET_EXPERIMENTAL ET_NODISCARD Error reset_execution ()
- ET_DEPRECATED ET_NODISCARD Error experimental_reset_execution ()
已弃用:请改用
reset_execution()
。
-
MethodMeta method_meta() const¶
返回与调用 Method 对应的 MethodMeta。
- ET_DEPRECATED const EValue & get_input (size_t i) const
已弃用:请改用 MethodMeta 来访问元数据,并使用 set_input 更新 Method 输入。
- ET_DEPRECATED EValue & mutable_input (size_t i)
已弃用:请改用 MethodMeta 来访问元数据,并使用 set_input 更新 Method 输入。
- ET_DEPRECATED EValue & mutable_output (size_t i)
已弃用:请改用 MethodMeta 来访问元数据,并使用 get_output 检索 Method 输出。
-
class MethodMeta¶
描述 ExecuTorch 程序中的方法。
用于创建MethodMeta对象的程序必须比MethodMeta存活时间更长。它与Method是分开的,以便可以在不支付加载完整Method的初始化成本的情况下访问此信息。
公共函数
-
const char *name() const¶
获取此方法的名称。
- 返回值
方法名称。
-
size_t num_inputs() const¶
获取此方法的输入数量。
- 返回值
输入数量。
-
Result<Tag> input_tag(size_t index) const¶
获取指定输入的标签。
- 参数
index – [in] 要查找的输入的索引。
- 返回值
输入的标签,只能是 [Tensor, Int, Bool, Double, String]。
-
Result<TensorInfo> input_tensor_meta(size_t index) const¶
获取有关指定输入的元数据。
- 参数
index – [in] 要查找的输入的索引。
- 返回值
成功时的元数据,或失败时的错误。仅对 tag::Tensor 有效
-
size_t num_outputs() const¶
获取此方法的输出数量。
- 返回值
输出数量。
-
Result<Tag> output_tag(size_t index) const¶
获取指定输出的标签。
- 参数
index – [in] 要查找的输出的索引。
- 返回值
输出的标签,只能是 [Tensor, Int, Bool, Double, String]。
-
Result<TensorInfo> output_tensor_meta(size_t index) const¶
获取有关指定输出的元数据。
- 参数
index – [in] 要查找的输出的索引。
- 返回值
成功时的元数据,或失败时的错误。仅对 tag::Tensor 有效
-
size_t num_memory_planned_buffers() const¶
获取此方法所需内存规划缓冲区的数量。
- 返回值
内存规划缓冲区的数量。
-
Result<int64_t> memory_planned_buffer_size(size_t index) const¶
获取指定内存规划缓冲区的大小(以字节为单位)。
- 参数
index – [in] 要查找的缓冲区的索引。
- 返回值
成功时的大小(以字节为单位),或失败时的错误。
- inline ET_DEPRECATED size_t num_non_const_buffers () const
已弃用:请改用num_memory_planned_buffers()。
-
inline Result<int64_t> non_const_buffer_size(size_t index) const¶
已弃用:请改用memory_planned_buffer_size()。
-
const char *name() const¶
-
class DataLoader¶
从数据源加载数据。
参见 //executorch/extension/data_loader 以了解常见实现。
公共函数
- virtual ET_NODISCARD Result< FreeableBuffer > load (size_t offset, size_t size, const SegmentInfo &segment_info) const =0
从底层数据源加载数据。
注意:此操作必须是线程安全的。如果此调用修改了公共状态,则实现必须自行进行锁定。
- 参数
offset – 数据源中开始加载的字节偏移量。
size – 要加载的字节数。
segment_info – 要加载的段的信息。
- 返回值
一个
FreeableBuffer
,它拥有已加载的数据。
- inline virtual ET_NODISCARD Error load_into (size_t offset, size_t size, const SegmentInfo &segment_info, void *buffer) const
将底层数据源中的数据加载到提供的缓冲区中。
注意:此操作必须是线程安全的。如果此调用修改了公共状态,则实现必须自行进行锁定。
- 参数
offset – 数据源中开始加载的字节偏移量。
size – 要加载的字节数。
segment_info – 要加载的段的信息。
buffer – 要将数据加载到的缓冲区。必须指向至少
size
字节的内存。
- 返回值
一个指示加载是否成功的错误。
- virtual ET_NODISCARD Result< size_t > size () const =0
返回底层数据源的长度,通常是文件大小。
-
类 MemoryAllocator¶
一个根据大小进行简单分配并返回内存地址指针的类。它用特定大小的缓冲区设置书签。分配只是检查空间并在每次分配请求时使用 cur_ 指针增长。
简单示例
// 用户在堆中分配一个 100 字节长的内存。 uint8_t* memory_pool = malloc(100 * sizeof(uint8_t)); MemoryAllocator allocator(100, memory_pool) // 将分配器对象传递给 Executor
在幕后,ExecuTorch 将调用 allocator.allocate() 以保持 cur_ 指针的迭代。
由 executorch::runtime::internal::PlatformMemoryAllocator 派生。
公共函数
-
内联 MemoryAllocator(uint32_t size, uint8_t *base_address)¶
构造一个给定
size
的新内存分配器,从提供的base_address
开始。- 参数
size – [in]
base_address
处缓冲区的大小(以字节为单位)。base_address – [in] 要从中分配的缓冲区。不拥有此缓冲区,因此它必须在 MemoryAllocator 的生命周期内有效。
-
内联 虚 void *allocate(size_t size, size_t alignment = kDefaultAlignment)¶
分配
size
字节的内存。- 参数
size – [in] 要分配的字节数。
alignment – [in] 返回指针的最小对齐方式。必须是 2 的幂。
- 返回值
nullptr – 内存不足,或
alignment
不是 2 的幂。- 返回值
成功时分配的内存的对齐指针。
公共静态属性
-
静态 constexpr size_t kDefaultAlignment = alignof(void*)¶
此类返回的内存的默认对齐方式。确保结构的指针字段将对齐。但是,根据工具链和体系结构,较大的类型(如
long double
)可能不会对齐。
-
内联 MemoryAllocator(uint32_t size, uint8_t *base_address)¶
-
类 HierarchicalAllocator¶
一组可用于表示设备内存层次结构的缓冲区。
公共函数
-
内联 显式 HierarchicalAllocator(Span<Span<uint8_t>> buffers)¶
使用给定的缓冲区数组构造一个新的分层分配器。
内存 ID 基于
buffers
中的索引:buffers[N]
的内存 ID 为N
。buffers.size()
必须 >=MethodMeta::num_non_const_buffers()
。buffers[N].size()
必须 >=MethodMeta::non_const_buffer_size(N)
。
-
内联 ET_DEPRECATED HierarchicalAllocator(uint32_t n_allocators, MemoryAllocator *allocators)¶
已弃用:请改用跨度。
- 内联 ET_NODISCARD Result< void * > get_offset_address (uint32_t memory_id, size_t offset_bytes, size_t size_bytes)
返回从给定缓冲区的基础地址开始的字节偏移量
offset_bytes
处的地址,该地址指向至少size_bytes
的内存。- 参数
**memory_id** – **[输入]** 层次结构中缓冲区的 ID。
**offset_bytes** – **[输入]** 指定缓冲区中的字节偏移量。
**size_bytes** – **[输入]** 在偏移量处应可用的内存量。
- 返回值
成功时,返回指定缓冲区中请求的字节偏移量的地址。失败时,返回一个非 Ok 错误。
-
内联 显式 HierarchicalAllocator(Span<Span<uint8_t>> buffers)¶
-
类 MemoryManager¶
在 Method 加载和执行期间使用的分配器的容器类。
此类整合了 Method 加载和执行的所有动态内存需求。这可以允许基于堆的以及无堆的执行(与某些嵌入式场景相关),并且总体上提供了对内存使用的更多控制。
但是,此类无法确保所有分配都已记录在案,因为内核和后端实现可以自由地使用单独的方式来分配内存(例如,用于暂存空间)。但我们确实建议后端和内核在尽可能的情况下使用这些提供的分配器。
公共函数
-
内联 显式 MemoryManager(MemoryAllocator *method_allocator, HierarchicalAllocator *planned_memory = nullptr, MemoryAllocator *temp_allocator = nullptr)¶
构造一个新的 MemoryManager。
- 参数
**method_allocator** – **[输入]** 加载 Method 和分配其内部结构时使用的分配器。必须比使用它的 Method 存活时间更长。
**planned_memory** – **[输入]** 执行 Method 时用于可变张量数据的内存规划缓冲区。必须比使用它的 Method 存活时间更长。如果 Method 不使用任何内存规划张量数据,则可以为
nullptr
。此 HierarchicalAllocator 中缓冲区的大小必须与相应的MethodMeta::num_memory_planned_buffers()
和MethodMeta::memory_planned_buffer_size(N)
值一致,这些值嵌入在 Program 中。**temp_allocator** – **[输入]** 在内核或委托执行期间分配临时数据时使用的分配器。必须比使用它的 Method 存活时间更长。如果 Method 不使用分配临时数据的内核或委托,则可以为
nullptr
。此分配器将在执行期间每次内核或委托调用后重置。
-
内联 ET_DEPRECATED MemoryManager(__attribute__((unused)) MemoryAllocator *constant_allocator, HierarchicalAllocator *non_constant_allocator, MemoryAllocator *runtime_allocator, MemoryAllocator *temporary_allocator)¶
已弃用:请改用不带
constant_allocator
的构造函数。TODO(T162089316):所有用户迁移到新构造函数后,删除此项。
-
内联 MemoryAllocator *method_allocator() const¶
-
内联 HierarchicalAllocator *planned_memory() const¶
返回用于可变张量数据的内存规划缓冲区。
-
内联 MemoryAllocator *temp_allocator() const¶
返回在内核或委托执行期间用于分配临时数据的分配器。
此分配器将在执行期间每次内核或委托调用后重置。
-
内联 显式 MemoryManager(MemoryAllocator *method_allocator, HierarchicalAllocator *planned_memory = nullptr, MemoryAllocator *temp_allocator = nullptr)¶
值¶
-
struct EValue¶
公共函数
-
class Tensor¶
一个最小的Tensor类型,其API是at::Tensor的源兼容子集。
注意:此类的实例不拥有提供给它的TensorImpl,这意味着调用方必须保证TensorImpl的生存时间长于任何指向它的Tensor实例。
有关此处使用的返回/参数类型以及它们与at::Tensor的关系,请参阅TensorImpl上的文档。
公共类型
-
using DimOrderType = TensorImpl::DimOrderType¶
用于
dim_order()
元素的类型。
公共函数
-
inline TensorImpl *unsafeGetTensorImpl() const¶
返回指向底层TensorImpl的指针。
注意:客户端应谨慎地直接操作TensorImpl而不是Tensor。很容易破坏东西。
-
inline size_t nbytes() const¶
返回张量的大小(以字节为单位)。
注意:仅返回活动空间,而不是底层数据块的总容量。
-
inline ssize_t size(ssize_t dim) const¶
返回给定维度上张量的大小。
注意:size()故意不返回SizeType,即使它返回SizeType数组的一个元素。这样做是为了帮助使此方法的调用与at::Tensor更兼容,并与该类以及ETensor中的其他方法保持一致。
-
inline ssize_t dim() const¶
返回张量的维度数。
-
inline ssize_t numel() const¶
返回张量中元素的数量。
-
inline ScalarType scalar_type() const¶
返回张量中元素的类型(int32、float、bool等)。
-
inline ssize_t element_size() const¶
返回张量中一个元素的大小(以字节为单位)。
-
内联 const ArrayRef<DimOrderType> dim_order() const¶
返回维度在内存中的排列顺序。
-
内联 const ArrayRef<StridesType> strides() const¶
返回张量在每个维度上的步长。
-
内联 TensorShapeDynamism shape_dynamism() const¶
返回张量形状的可变性。
-
内联 const void *const_data_ptr() const¶
返回指向常量底层数据块的指针。
-
内联 void *mutable_data_ptr() const¶
返回指向可变底层数据块的指针。
- 模板<typename T> 内联 ET_DEPRECATED T * data_ptr () const
已弃用:请改用 const_data_ptr 或 mutable_data_ptr。
- 内联 ET_DEPRECATED void * data_ptr () const
已弃用:请改用 const_data_ptr 或 mutable_data_ptr。
- 内联 ET_DEPRECATED void set_data (void *ptr) const
已弃用:更改张量引用的 data_ptr。不释放先前指向的数据,也不假设新指针的所有权语义。此 API 在 at::Tensor 中不存在,因此内核开发人员应避免使用它。
-
using DimOrderType = TensorImpl::DimOrderType¶