use std::path::Path;
use crate::inference::native_model::WeightsFile;
use super::{CudaError, CudaRuntime, DeviceTensor};
#[derive(Debug)]
pub struct SafetensorsFile(WeightsFile);
impl SafetensorsFile {
pub fn open(path: impl AsRef<Path>) -> Result<Self, CudaError> {
WeightsFile::open(path).map(Self).map_err(Into::into)
}
pub fn upload(
&self,
runtime: &CudaRuntime,
name: &str,
expected_shape: &[usize],
) -> Result<DeviceTensor<f32>, CudaError> {
let host = self.read_f32(name, expected_shape)?;
DeviceTensor::upload(runtime.stream(), &host, expected_shape)
}
pub fn read_f32(&self, name: &str, expected_shape: &[usize]) -> Result<Vec<f32>, CudaError> {
self.0.read_f32(name, expected_shape).map_err(Into::into)
}
pub(crate) fn host(&self) -> &WeightsFile {
&self.0
}
}
#[cfg(all(test, feature = "_cuda-libraries"))]
mod test_support;