12 个版本
0.1.3 | 2024 年 4 月 16 日 |
---|---|
0.1.2 | 2024 年 4 月 2 日 |
0.1.1 | 2024 年 3 月 25 日 |
0.0.8 | 2024 年 1 月 26 日 |
0.0.1 | 2023 年 10 月 31 日 |
#101 in 机器学习
每月 3,351 次下载
在 11 个 (6 个直接) 仓库中使用
110KB
2K SLoC
Surml 核心库
在编译时直接嵌入 ONNX 运行时,无需单独安装 ONNX 运行时或担心与其他运行时的版本冲突。
这个包只是 Surml API 的 Rust 实现。如果您正在运行 Rust 服务器,建议您直接使用这个包。需要注意的是,使用此包时,ONNX 版本需要与客户端相同。对于当前版本的 Surml,ONNX 版本是 1.16.0
。
编译配置
如果没有配置任何内容,该包将编译 ONNX 运行时到二进制文件中。这是默认行为。但是,如果您想使用系统上安装的 ONNX 运行时,您可以在编译包之前设置环境变量 ONNXRUNTIME_LIB_PATH
。这将使包使用系统上安装的 ONNX 运行时。
这里包含在整个 Surml 生态系统中重复使用的错误,这些错误可以构建用于 Axum 和 Actix 网络框架的 HTTP 响应。
Nix 支持
目前不支持 NIX。需要定义 ONNXRUNTIME_LIB_PATH
。这已在 编译配置
部分中解释。
用法
Surml 可以用于存储、加载和执行 ONNX 模型。
存储和访问模型
我们可以使用以下代码存储模型及其元数据
use std::fs::File;
use std::io::{self, Read, Write};
use surrealml_core::storage::surml_file::SurMlFile;
use surrealml_core::storage::header::Header;
use surrealml_core::storage::header::normalisers::{
wrapper::NormaliserType,
linear_scaling::LinearScaling
};
// load your own model here (surrealml python package can be used to convert PyTorch,
// and Sklearn models to ONNX or package them as surml files)
let mut file = File::open("./stash/linear_test.onnx").unwrap();
let mut model_bytes = Vec::new();
file.read_to_end(&mut model_bytes).unwrap();
// create a header for the model
let mut header = Header::fresh();
header.add_column(String::from("squarefoot"));
header.add_column(String::from("num_floors"));
header.add_output(String::from("house_price"), None);
// add normalisers if needed
header.add_normaliser(
"squarefoot".to_string(),
NormaliserType::LinearScaling(LinearScaling { min: 0.0, max: 1.0 })
);
header.add_normaliser(
"num_floors".to_string(),
NormaliserType::LinearScaling(LinearScaling { min: 0.0, max: 1.0 })
);
// create a surml file
let surml_file = SurMlFile::new(header, model_bytes);
// read and write surml files
surml_file.write("./stash/test.surml").unwrap();
let new_file = SurMlFile::from_file("./stash/test.surml").unwrap();
let file_from_bytes = SurMlFile::from_bytes(surml_file.to_bytes()).unwrap();
执行模型
当您加载一个 surml
文件时,您可以使用以下代码执行模型
use surrealml_core::storage::surml_file::SurMlFile;
use surrealml_core::execution::compute::ModelComputation;
use ndarray::ArrayD;
use std::collections::HashMap;
let mut file = SurMlFile::from_file("./stash/test.surml").unwrap();
let compute_unit = ModelComputation {
surml_file: &mut file,
};
// automatically map inputs and apply normalisers to the compute if this data was put in the header
let mut input_values = HashMap::new();
input_values.insert(String::from("squarefoot"), 1000.0);
input_values.insert(String::from("num_floors"), 2.0);
let output = compute_unit.buffered_compute(&mut input_values).unwrap();
// feed a raw ndarray into the model if no header was provided or if you want to bypass the header
let x = vec![1000.0, 2.0];
let data: ArrayD<f32> = ndarray::arr1(&x).into_dyn();
// None input can be a tuple of dimensions of the input data
let output = compute_unit.raw_compute(data, None).unwrap();
ONNX 运行时资产
我们可以通过以下链接找到 ONNX 资产
https://github.com/microsoft/onnxruntime/releases/tag/v1.16.2
依赖项
~5–18MB
~255K SLoC