#machine-learning #surrealdb #models #onnx #run-time #load #surreal-ml

surrealml-core

SurrealML 的核心机器学习库,使 SurrealDB 能够存储和加载 ML 模型

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 机器学习

Download history 383/week @ 2024-05-03 444/week @ 2024-05-10 321/week @ 2024-05-17 370/week @ 2024-05-24 433/week @ 2024-05-31 591/week @ 2024-06-07 434/week @ 2024-06-14 370/week @ 2024-06-21 424/week @ 2024-06-28 607/week @ 2024-07-05 422/week @ 2024-07-12 509/week @ 2024-07-19 706/week @ 2024-07-26 867/week @ 2024-08-02 735/week @ 2024-08-09 971/week @ 2024-08-16

每月 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