summaryrefslogtreecommitdiff
path: root/src/model.rs
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2025-03-25 19:24:16 +0100
committerDennis Kobert <dennis@kobert.dev>2025-03-25 19:24:16 +0100
commite85e1cee0f662fe03ec2644330ae81b69502ca7b (patch)
tree4d5f44b3819ff86da65bdd1d6ccc055607c8e9fd /src/model.rs
parenta7da9c7140181ab4ef4af5e5f3222ca44741d66a (diff)
Build basic inference setup in rust
Diffstat (limited to 'src/model.rs')
-rw-r--r--src/model.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/model.rs b/src/model.rs
new file mode 100644
index 0000000..04eb6c8
--- /dev/null
+++ b/src/model.rs
@@ -0,0 +1,59 @@
+use burn::{
+ nn::conv::{Conv2d, Conv2dConfig},
+ nn::{Linear, Relu},
+ prelude::*,
+};
+use nn::{LeakyReluConfig, LinearConfig};
+
+use burn::record::{FullPrecisionSettings, NamedMpkFileRecorder, Recorder};
+use burn_import::pytorch::PyTorchFileRecorder;
+
+type ArrayBackend = burn_ndarray::NdArray<f32>;
+
+#[derive(Module, Debug)]
+pub struct Net<B: Backend> {
+ input_lin: Linear<B>,
+ relu1: Relu,
+ lin2: Linear<B>,
+ relu2: Relu,
+ lin3: Linear<B>,
+}
+
+impl<B: Backend> Net<B> {
+ /// Create a new model.
+ pub fn init(device: &B::Device) -> Self {
+ let input_size = 8;
+ let input_lin = LinearConfig::new(input_size, 16).init(device);
+ let relu1 = Relu::new();
+ let lin2 = LinearConfig::new(16, 4).init(device);
+ let relu2 = Relu::new();
+ let lin3 = LinearConfig::new(4, 1).init(device);
+ Self {
+ input_lin,
+ relu1,
+ lin2,
+ relu2,
+ lin3,
+ }
+ }
+
+ /// Forward pass of the model.
+ pub fn forward(&self, x: Tensor<B, 1>) -> Tensor<B, 1> {
+ let x = self.input_lin.forward(x);
+ let x = self.relu1.forward(x);
+ let x = self.lin2.forward(x);
+ let x = self.relu2.forward(x);
+ let x = self.lin3.forward(x);
+ x
+ }
+}
+
+/// Load the model from the file in your source code (not in build.rs or script).
+pub fn load_model() -> Net<ArrayBackend> {
+ let device = Default::default();
+ let record: NetRecord<ArrayBackend> = PyTorchFileRecorder::<FullPrecisionSettings>::default()
+ .load("./perf.pt".into(), &device)
+ .expect("Failed to decode state");
+
+ Net::<ArrayBackend>::init(&device).load_record(record)
+}