2 个不稳定版本

0.1.0 2020年7月12日
0.0.0 2020年7月11日

#12 in #microcontroller

Apache-2.0

7MB
136K SLoC

C++ 127K SLoC // 0.1% comments Rust 5K SLoC // 0.0% comments C 3K SLoC // 0.2% comments Python 487 SLoC // 0.1% comments Bazel 301 SLoC // 0.1% comments Crystal 123 SLoC // 0.1% comments Objective-C 20 SLoC

docs.rs Crates.io

tfmicro

TensorFlow + no_std + Rust = ❤️

这个包包含用于 TensorFlow Lite for Microcontrollers 项目的 Rust 绑定。TensorFlow Lite for Microcontrollers 是 TensorFlow Lite 的一个版本,设计为无需标准库即可运行,适用于微控制器、wasm 等。

感谢 CargoCC crate,对于新的平台无需进行移植 - 只需将 tfmicro 放入您的 Cargo.toml 中即可。您需要后端有一个 C++ 编译器,包括交叉编译目标,但在大多数情况下,这已经存在。

此实现的目的是在提供所有常用 Rust 保证的同时提供可用性。尽管如此,此 crate 调用大量的 C/C++ 代码,您应该像对待任何其他传统 C/C++ 代码库一样,采用通常的方法(静态分析、内存保护、模糊测试)。

目前固定在 TensorFlow 33689c48ad

入门

在您的 Cargo.toml 的依赖关系部分添加 tfmicro

[dependencies]
tfmicro = 0.1.0

要了解如何将 TensorFlow Micro C 示例映射到惯用的 Rust 代码,请查看 测试 目录。否则,请参阅 用法 获取更一般的描述。

用法

创建一个模型

通常,模型以扩展名为 .tflite 的二进制文件格式从 TensorFlow 训练框架导出。您可以使用 include_bytes! 宏直接将其导入 Rust。

然后,我们可以使用 Model::from_buffer 方法执行零拷贝转换到 Model

let model_array = include_bytes!("../examples/models/hello_world.tflite");
let model = Model::from_buffer(&model_array[..]).unwrap();

创建一个张量区域

TensorFlow解释器需要一个名为“张量竞技场”的工作区域。您可以为此使用栈上的数组,尽管它在使用时必须保持作用域。如果您有stdalloc环境,则可以传递一个堆分配的Vec

const TENSOR_ARENA_SIZE: usize = 4 * 1024;
let mut arena: [u8; TENSOR_ARENA_SIZE] = [0; TENSOR_ARENA_SIZE];

在创建解释器之前,TensorFlow要求确定竞技场的大小。然而,一旦创建了解释器,您可以通过调用arena_used_bytes来获取模型实际使用的字节数。

创建解释器和输入张量

要运行模型,与C API中的方法非常相似地构建了一个解释器。请注意,与C API不同,不需要error_reporter。TensorFlow的错误报告始终在info日志级别传递到标准Rust log框架。这允许使用任何兼容的日志实现。

解释器需要一个操作解析器。最简单的方法是传递一个AllOpResolver,但要节省内存,请使用只包含所需操作的MutableOpResolver

let op_resolver = AllOpResolver::new();

let mut interpreter =
    MicroInterpreter::new(&model, op_resolver, &mut arena[..]).unwrap();

interpreter.input(0, &[0.0]).unwrap(); // Input tensor of length 1

使用input方法设置输入张量。简单的模型只使用一个张量,可以使用索引0指定。

运行模型和输出张量

通过在解释器上调用invoke方法来运行模型。结果输出张量可以通过在解释器上调用output方法来获取。

interpreter.invoke().unwrap();

dbg!(interpreter.output(0).as_data::<f32>());

这就是最小使用案例的全部内容!有关更高级的使用案例,请参阅测试文件夹

开发

请参阅DEVELOP.md

许可(此crate)

Apache 2.0

版权所有2020 Kevin Hill 和 Richard Meadows

根据Apache License,版本2.0(“许可证”)进行许可;除非适用法律规定或书面同意,否则不得使用此文件,除非符合许可证。您可以在以下位置获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律规定或书面同意,否则在许可证下分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可证的具体语言,请参阅许可证。

依赖关系