安全高效的张量存储格式 支持零拷贝和延迟加载
safetensors是一种新的张量存储格式,旨在安全高效地保存机器学习模型。与pickle相比,它提供了更好的安全性,同时通过零拷贝技术保持高性能。该库支持Python和Rust,提供简单的API用于张量的存储和加载。safetensors支持延迟加载、布局控制和多种数据类型,适用于大规模模型的存储和分发。在加载速度和内存效率方面表现优异,尤其适合分布式环境。
这个仓库实现了一种新的简单格式,用于安全地存储张量(相对于pickle而言),同时仍然保持快速(零拷贝)。
你可以通过pip管理器安装safetensors:
pip install safetensors
对于源码,你需要安装Rust
# 安装Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # 确保它是最新的并使用稳定版本 rustup update git clone https://github.com/huggingface/safetensors cd safetensors/bindings/python pip install setuptools_rust pip install -e .
import torch from safetensors import safe_open from safetensors.torch import save_file tensors = { "weight1": torch.zeros((1024, 1024)), "weight2": torch.zeros((1024, 1024)) } save_file(tensors, "model.safetensors") tensors = {} with safe_open("model.safetensors", framework="pt", device="cpu") as f: for key in f.keys(): tensors[key] = f.get_tensor(key)
N
,一个无符号小端64位整数,包含头部的大小{
字符(0x7B)开始。{"TENSOR_NAME": {"dtype": "F16", "shape": [1, 16, 256], "data_offsets": [BEGIN, END]}, "NEXT_TENSOR_NAME": {...}, ...}
的字典,
data_offsets
指向相对于字节缓冲区开始的张量数据位置(即不是文件中的绝对位置),
BEGIN
是起始偏移量,END
是结束后的偏移量(因此总张量字节大小 = END - BEGIN
)。__metadata__
来包含自由格式的字符串到字符串映射。不允许使用任意JSON,所有值必须是字符串。注意:
serde_json
隐式决定。任何晦涩的内容可能会在以后被修改,比如表示整数的奇怪方式、换行符和UTF-8字符串中的转义。这只会出于安全考虑而进行。[]
的张量),它们仅仅是标量。这个crate的主要理由是消除在PyTorch
中默认使用pickle
的需求。
机器学习领域还有其他格式,以及更通用的格式。
让我们看看替代方案,以及为什么这种格式被认为是有趣的。 这是我非常个人且可能有偏见的观点:
格式 | 安全 | 零拷贝 | 懒加载 | 无文件大小限制 | 布局控制 | 灵活性 | Bfloat16/Fp8 |
---|---|---|---|---|---|---|---|
pickle (PyTorch) | ✗ | ✗ | ✗ | 🗸 | ✗ | 🗸 | 🗸 |
H5 (Tensorflow) | 🗸 | ✗ | 🗸 | 🗸 | ~ | ~ | ✗ |
SavedModel (Tensorflow) | 🗸 |