in safetensors/src/tensor.rs [1106:1137]
fn test_serialization_forced_alignement() {
let data: Vec<u8> = vec![0.0f32, 1.0, 2.0, 3.0, 4.0, 5.0]
.into_iter()
.flat_map(|f| f.to_le_bytes())
.collect();
let shape = vec![1, 1, 2, 3];
let attn_0 = TensorView::new(Dtype::F32, shape, &data).unwrap();
let metadata: HashMap<String, TensorView> =
// Smaller string to force misalignment compared to previous test.
[("attn0".to_string(), attn_0)].into_iter().collect();
let out = serialize(&metadata, None).unwrap();
assert_eq!(
out,
[
72, 0, 0, 0, 0, 0, 0, 0, 123, 34, 97, 116, 116, 110, 48, 34, 58, 123, 34, 100, 116,
121, 112, 101, 34, 58, 34, 70, 51, 50, 34, 44, 34, 115, 104, 97, 112, 101, 34, 58,
91, 49, 44, 49, 44, 50, 44, 51, 93, 44, 34, 100, 97, 116, 97, 95, 111, 102, 102,
// All the 32 are forcing alignement of the tensor data for casting to f32, f64
// etc..
115, 101, 116, 115, 34, 58, 91, 48, 44, 50, 52, 93, 125, 125, 32, 32, 32, 32, 32,
32, 32, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 64, 0, 0, 64, 64, 0, 0, 128, 64, 0, 0,
160, 64
],
);
let parsed = SafeTensors::deserialize(&out).unwrap();
let tensor = parsed.tensor("attn0").unwrap();
assert_eq!(
tensor.data().as_ptr() as usize % tensor.dtype().bitsize().div_ceil(8),
0
);
}