13个版本

0.0.14 2021年8月2日
0.0.13 2021年8月1日
0.0.12 2021年4月11日
0.0.11 2021年2月23日
0.0.8 2020年8月26日

#221 in 机器学习

Download history 87/week @ 2024-01-01 178/week @ 2024-01-08 185/week @ 2024-01-15 94/week @ 2024-01-22 41/week @ 2024-01-29 118/week @ 2024-02-05 95/week @ 2024-02-12 116/week @ 2024-02-19 167/week @ 2024-02-26 164/week @ 2024-03-04 87/week @ 2024-03-11 124/week @ 2024-03-18 131/week @ 2024-03-25 164/week @ 2024-04-01 165/week @ 2024-04-08 155/week @ 2024-04-15

每月下载量626
用于 2 crates

MIT/Apache

2MB
58K SLoC

ONNX Runtime

github crates.io docs.rs build status codecov

这是为Microsoft的ONNX Runtime(版本1.8)编写的Rust封装尝试。

该项目由两个crate组成

变更日志

build.rs 脚本支持下载Microsoft ONNX Runtime的预构建版本,提供以下目标

CPU

  • Linux x86_64
  • macOS x86_64
  • macOS aarch64(无预构建二进制文件,无CI测试,见 #74
  • Windows i686
  • Windows x86_64

GPU

  • Linux x86_64
  • Windows x86_64

警告:

  • 这是一个实验,还在进行中;它完整/工作/安全。欢迎提供帮助!
  • 基本推理工作,见 onnxruntime/examples/sample.rsonnxruntime/tests/integration_tests.rs
  • ONNX Runtime有很多选项来控制推理过程,但这些选项尚未公开。
  • 此项目在macOS Catalina上开发和测试。其他平台应该也能工作,但尚未测试。

设置

build.rs 脚本支持以下三种不同的策略来获取ONNX Runtime

  1. 从上游下载预构建的二进制文件;
  2. 指向已安装的本地版本;
  3. 从源代码编译(尚未实现)。

要选择使用哪种策略,请将环境变量 ORT_STRATEGY 设置为

  1. download:如果未设置 ORT_STRATEGY,则为默认值;
  2. system:使用本地安装的版本(使用环境变量 ORT_LIB_LOCATION 来指向安装路径)
  3. compile:编译库

download 策略支持下载支持 CUDA 的 ONNX 版本。要使用此功能,请设置环境变量 ORT_USE_CUDA=1(仅支持 Linux 或 Windows)。

在构建脚本允许编译运行时之前,请参阅编译说明以了解有关此过程的一些详细信息。

关于 'ORT_STRATEGY=system' 的说明

当使用 ORT_STRATEGY=system 时,如果库未安装在系统路径中,则执行构建的二进制文件(例如测试)可能会失败,至少在 macOS 上是这样。发生类似以下错误

dyld: Library not loaded: @rpath/libonnxruntime.1.7.1.dylib
  Referenced from: onnxruntime-rs.git/target/debug/deps/onnxruntime_sys-22eb0e3e89a0278c
  Reason: image not found

要修复此问题,可以

  • 设置环境变量 LD_LIBRARY_PATH 指向可以找到库的路径。

  • 调整 .cargo/config 文件以包含提供 完整路径 的链接器标志

    [target.aarch64-apple-darwin]
    rustflags = ["-C", "link-args=-Wl,-rpath,/full/path/to/onnxruntime/lib"]
    

有关更多信息,请参阅 rust-lang/cargo #5077

示例

使用 C API 的 C++ 示例(C_Api_Sample.cpp)已移植到低级 crate(onnxruntime-sys)和高级 on(onnxruntime)。

onnxruntime-sys

要运行此示例(onnxruntime-sys/examples/c_api_sample.rs

# Download the model (SqueezeNet 1.0, ONNX version: 1.3, Opset version: 8)
❯ curl -LO "https://github.com/onnx/models/raw/master/vision/classification/squeezenet/model/squeezenet1.0-8.onnx"
❯ cargo run --example c_api_sample
[...]
    Finished dev [unoptimized + debuginfo] target(s) in 1.88s
     Running `target/debug/examples/c_api_sample`
Using Onnxruntime C API
2020-08-09 09:37:41.554922 [I:onnxruntime:, inference_session.cc:174 ConstructorCommon] Creating and using per session threadpools since use_per_session_threads_ is true
2020-08-09 09:37:41.556650 [I:onnxruntime:, inference_session.cc:830 Initialize] Initializing session.
2020-08-09 09:37:41.556665 [I:onnxruntime:, inference_session.cc:848 Initialize] Adding default CPU execution provider.
2020-08-09 09:37:41.556678 [I:onnxruntime:test, bfc_arena.cc:15 BFCArena] Creating BFCArena for Cpu
2020-08-09 09:37:41.556687 [V:onnxruntime:test, bfc_arena.cc:32 BFCArena] Creating 21 bins of max chunk size 256 to 268435456
2020-08-09 09:37:41.558313 [I:onnxruntime:, reshape_fusion.cc:37 ApplyImpl] Total fused reshape node count: 0
2020-08-09 09:37:41.559327 [I:onnxruntime:, reshape_fusion.cc:37 ApplyImpl] Total fused reshape node count: 0
2020-08-09 09:37:41.559476 [I:onnxruntime:, reshape_fusion.cc:37 ApplyImpl] Total fused reshape node count: 0
2020-08-09 09:37:41.559607 [V:onnxruntime:, inference_session.cc:671 TransformGraph] Node placements
2020-08-09 09:37:41.559615 [V:onnxruntime:, inference_session.cc:673 TransformGraph] All nodes have been placed on [CPUExecutionProvider].
2020-08-09 09:37:41.559639 [I:onnxruntime:, session_state.cc:25 SetGraph] SaveMLValueNameIndexMapping
2020-08-09 09:37:41.559787 [I:onnxruntime:, session_state.cc:70 SetGraph] Done saving OrtValue mappings.
2020-08-09 09:37:41.560252 [I:onnxruntime:, session_state_initializer.cc:178 SaveInitializedTensors] Saving initialized tensors.
2020-08-09 09:37:41.563467 [I:onnxruntime:, session_state_initializer.cc:223 SaveInitializedTensors] Done saving initialized tensors
2020-08-09 09:37:41.563979 [I:onnxruntime:, inference_session.cc:919 Initialize] Session successfully initialized.
Number of inputs = 1
Input 0 : name=data_0
Input 0 : type=1
Input 0 : num_dims=4
Input 0 : dim 0=1
Input 0 : dim 1=3
Input 0 : dim 2=224
Input 0 : dim 3=224
2020-08-09 09:37:41.573127 [I:onnxruntime:, sequential_executor.cc:145 Execute] Begin execution
2020-08-09 09:37:41.573183 [I:onnxruntime:test, bfc_arena.cc:259 AllocateRawInternal] Extending BFCArena for Cpu. bin_num:13 rounded_bytes:3154176
2020-08-09 09:37:41.573197 [I:onnxruntime:test, bfc_arena.cc:143 Extend] Extended allocation by 4194304 bytes.
2020-08-09 09:37:41.573203 [I:onnxruntime:test, bfc_arena.cc:147 Extend] Total allocated bytes: 9137152
2020-08-09 09:37:41.573212 [I:onnxruntime:test, bfc_arena.cc:150 Extend] Allocated memory at 0x7fb7d6cb7000 to 0x7fb7d70b7000
2020-08-09 09:37:41.573248 [I:onnxruntime:test, bfc_arena.cc:259 AllocateRawInternal] Extending BFCArena for Cpu. bin_num:8 rounded_bytes:65536
2020-08-09 09:37:41.573256 [I:onnxruntime:test, bfc_arena.cc:143 Extend] Extended allocation by 4194304 bytes.
2020-08-09 09:37:41.573262 [I:onnxruntime:test, bfc_arena.cc:147 Extend] Total allocated bytes: 13331456
2020-08-09 09:37:41.573268 [I:onnxruntime:test, bfc_arena.cc:150 Extend] Allocated memory at 0x7fb7d70b7000 to 0x7fb7d74b7000
Score for class [0] =  0.000045440644
Score for class [1] =  0.0038458651
Score for class [2] =  0.00012494653
Score for class [3] =  0.0011804523
Score for class [4] =  0.0013169361
Done!

onnxruntime

要运行此示例(onnxruntime/examples/sample.rs

# Download the model (SqueezeNet 1.0, ONNX version: 1.3, Opset version: 8)
❯ curl -LO "https://github.com/onnx/models/raw/master/vision/classification/squeezenet/model/squeezenet1.0-8.onnx"
❯ cargo run --example sample
[...]
    Finished dev [unoptimized + debuginfo] target(s) in 13.62s
     Running `target/debug/examples/sample`
Uninitialized environment found, initializing it with name "test".
2020-08-09 09:34:37.395577 [I:onnxruntime:, inference_session.cc:174 ConstructorCommon] Creating and using per session threadpools since use_per_session_threads_ is true
2020-08-09 09:34:37.399253 [I:onnxruntime:, inference_session.cc:830 Initialize] Initializing session.
2020-08-09 09:34:37.399284 [I:onnxruntime:, inference_session.cc:848 Initialize] Adding default CPU execution provider.
2020-08-09 09:34:37.399313 [I:onnxruntime:test, bfc_arena.cc:15 BFCArena] Creating BFCArena for Cpu
2020-08-09 09:34:37.399335 [V:onnxruntime:test, bfc_arena.cc:32 BFCArena] Creating 21 bins of max chunk size 256 to 268435456
2020-08-09 09:34:37.410516 [I:onnxruntime:, reshape_fusion.cc:37 ApplyImpl] Total fused reshape node count: 0
2020-08-09 09:34:37.417478 [I:onnxruntime:, reshape_fusion.cc:37 ApplyImpl] Total fused reshape node count: 0
2020-08-09 09:34:37.420131 [I:onnxruntime:, reshape_fusion.cc:37 ApplyImpl] Total fused reshape node count: 0
2020-08-09 09:34:37.422623 [V:onnxruntime:, inference_session.cc:671 TransformGraph] Node placements
2020-08-09 09:34:37.428863 [V:onnxruntime:, inference_session.cc:673 TransformGraph] All nodes have been placed on [CPUExecutionProvider].
2020-08-09 09:34:37.428954 [I:onnxruntime:, session_state.cc:25 SetGraph] SaveMLValueNameIndexMapping
2020-08-09 09:34:37.429079 [I:onnxruntime:, session_state.cc:70 SetGraph] Done saving OrtValue mappings.
2020-08-09 09:34:37.429925 [I:onnxruntime:, session_state_initializer.cc:178 SaveInitializedTensors] Saving initialized tensors.
2020-08-09 09:34:37.436300 [I:onnxruntime:, session_state_initializer.cc:223 SaveInitializedTensors] Done saving initialized tensors
2020-08-09 09:34:37.437255 [I:onnxruntime:, inference_session.cc:919 Initialize] Session successfully initialized.
Dropping the session options.
2020-08-09 09:34:37.448956 [I:onnxruntime:, sequential_executor.cc:145 Execute] Begin execution
2020-08-09 09:34:37.449041 [I:onnxruntime:test, bfc_arena.cc:259 AllocateRawInternal] Extending BFCArena for Cpu. bin_num:13 rounded_bytes:3154176
2020-08-09 09:34:37.449072 [I:onnxruntime:test, bfc_arena.cc:143 Extend] Extended allocation by 4194304 bytes.
2020-08-09 09:34:37.449087 [I:onnxruntime:test, bfc_arena.cc:147 Extend] Total allocated bytes: 9137152
2020-08-09 09:34:37.449104 [I:onnxruntime:test, bfc_arena.cc:150 Extend] Allocated memory at 0x7fb3b9585000 to 0x7fb3b9985000
2020-08-09 09:34:37.449176 [I:onnxruntime:test, bfc_arena.cc:259 AllocateRawInternal] Extending BFCArena for Cpu. bin_num:8 rounded_bytes:65536
2020-08-09 09:34:37.449196 [I:onnxruntime:test, bfc_arena.cc:143 Extend] Extended allocation by 4194304 bytes.
2020-08-09 09:34:37.449209 [I:onnxruntime:test, bfc_arena.cc:147 Extend] Total allocated bytes: 13331456
2020-08-09 09:34:37.449222 [I:onnxruntime:test, bfc_arena.cc:150 Extend] Allocated memory at 0x7fb3b9985000 to 0x7fb3b9d85000
Dropping Tensor.
Score for class [0] =  0.000045440578
Score for class [1] =  0.0038458686
Score for class [2] =  0.0001249467
Score for class [3] =  0.0011804511
Score for class [4] =  0.00131694
Dropping TensorFromOrt.
Dropping the session.
Dropping the memory information.
Dropping the environment.

还可以参考集成测试(onnxruntime/tests/integration_tests.rs),它执行简单的模型下载和推理,并验证结果。

绑定生成

绑定(onnxruntime-sys 的基础)已提交到 git 仓库。这意味着 bindgen 在每次构建中不再是一个依赖项(已将其设置为可选),因此构建时间更好。

要生成新的绑定(例如,如果您的平台没有绑定,或者发生版本升级),请使用带有 generate-bindings 功能的 crate 进行构建。

注意:请确保已安装 rustup 组件 rustfmt,以便格式化绑定

rustup component add rustfmt

然后在每个平台上使用正确的功能标志进行构建

❯ cd onnxruntime-sys
❯ cargo build --features generate-bindings

使用 Docker 生成 Linux 绑定

准备容器

❯ docker run -it --rm --name rustbuilder -v "$PWD":/usr/src/myapp -w /usr/src/myapp rust:1.50.0 /bin/bash
❯ apt-get update
❯ apt-get install clang
❯ rustup component add rustfmt

生成绑定

❯ docker exec -it --user "$(id -u)":"$(id -g)" rustbuilder /bin/bash
❯ cd onnxruntime-sys
❯ cargo build --features generate-bindings

使用 Vagrant 生成 Windows 绑定

您可以使用 nbigaouette/windows_vagrant_rust 来配置一个可以构建项目并生成绑定的 Windows 虚拟机。

Windows 可以构建 x86 和 x86_64 绑定

❯ rustup target add i686-pc-windows-msvc x86_64-pc-windows-msvc
❯ cd onnxruntime-sys
❯ cargo build --features generate-bindings --target i686-pc-windows-msvc
❯ cargo build --features generate-bindings --target x86_64-pc-windows-msvc

执行

必须遵守 Rust 行为准则。对于升级或调解问题,请直接联系 Nicolas([email protected])而不是 Rust 调解团队。

许可证

本项目受以下任一许可证的许可

由您选择。

依赖项

约4-6.5MB
约141K SLoC