mod buffer;
mod local;
use crate::common::error::RustBertError;
pub use buffer::BufferResource;
pub use local::LocalResource;
use std::fmt::Debug;
use std::ops::DerefMut;
use std::path::PathBuf;
use std::sync::RwLockWriteGuard;
use tch::nn::VarStore;
use tch::{Device, Kind};
pub enum Resource<'a> {
PathBuf(PathBuf),
Buffer(RwLockWriteGuard<'a, Vec<u8>>),
}
pub trait ResourceProvider: Debug + Send + Sync {
fn get_local_path(&self) -> Result<PathBuf, RustBertError>;
fn get_resource(&self) -> Result<Resource, RustBertError>;
}
impl<T: ResourceProvider + ?Sized> ResourceProvider for Box<T> {
fn get_local_path(&self) -> Result<PathBuf, RustBertError> {
T::get_local_path(self)
}
fn get_resource(&self) -> Result<Resource, RustBertError> {
T::get_resource(self)
}
}
pub fn load_weights(
rp: &(impl ResourceProvider + ?Sized),
vs: &mut VarStore,
kind: Option<Kind>,
device: Device,
) -> Result<(), RustBertError> {
match rp.get_resource()? {
Resource::Buffer(mut data) => vs.load_from_stream(std::io::Cursor::new(data.deref_mut())),
Resource::PathBuf(path) => vs.load(path),
}?;
cast_var_store(vs, kind, device);
Ok(())
}
#[cfg(feature = "remote")]
mod remote;
use crate::pipelines::common::cast_var_store;
#[cfg(feature = "remote")]
pub use remote::RemoteResource;