Save and Share:
Safetensors 是一种卓越的模型格式,专为安全存储张量而设计。与该领域的许多替代方案相比,它在速度和性能方面都表现出色。Safetensors 不仅速度极快,而且在设计之初就以简单性和安全性为核心,这使其与机器学习中使用的许多传统格式区分开来。
为什么选择 Safetensors?
由于有大量可用于机器学习和数据存储的格式,你可能会想知道是什么让 Safetensors 与众不同。 那么,让我们花点时间比较一下这些格式,以了解 Safetensors 如何在关键参数上交付:
- 安全:随机下载的文件是否会运行任意代码?
- 零拷贝:读取文件是否需要比原始文件更多的内存?
- 延迟加载:是否可以在不加载所有内容的情况下检查文件? 是否可以仅加载其中的一些张量,而无需扫描整个文件(这在分布式环境中很重要)?
- 布局控制:可以控制张量在文件中的位置,以确保快速访问单个张量吗?
- 无文件大小限制:文件大小有限制吗?
- 灵活性:可以将自定义代码保存在格式中,并在以后无需额外代码即可使用吗?
- Bfloat16:该格式是否支持原生 bfloat16,而无需进行奇怪的变通方法?
每个符号 ✔ 表示存在,❌ 表示不存在,~ 表示部分存在,? 表示某个功能的存在情况未知。
格式 | 安全 | 零拷贝 | 延迟加载 | 无文件大小限制 | 布局控制 | 灵活性 | Bfloat16 |
---|---|---|---|---|---|---|---|
SafeTensors | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ |
pickle (PyTorch) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
H5 (Tensorflow) | ✔ | ❌ | ✔ | ✔ | ~ | ~ | ❌ |
SavedModel (Tensorflow) | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ |
MsgPack (flax) | ✔ | ✔ | ❌ | ✔ | ❌ | ❌ | ✔ |
Protobuf (ONNX) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cap’n’Proto | ✔ | ✔ | ~ | ✔ | ✔ | ~ | ❌ |
Numpy (npy,npz) | ✔ | ? | ? | ❌ | ✔ | ❌ | ❌ |
pdparams (Paddle) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
从这个比较中,你可以看到 Safetensors 满足或超过了其他模型格式提供的功能。 其“零拷贝”数据操作和延迟加载能力尤其值得注意,这可以显著提高机器学习任务中的数据处理效率。
一些值得注意的比较
虽然所有格式都有其独特的优势,但让我们来看看 Safetensors 与一些更常用的格式相比如何:
- Pickle (PyTorch):一种广泛使用的格式,但 pickle 有一个显着的缺点——它不安全,因为它允许执行任意代码。
- H5 (Tensorflow):虽然安全,但它不支持零拷贝,而零拷贝是高效数据操作不可或缺的功能。
- SavedModel (Tensorflow):此格式特定于 Tensorflow,并且缺乏其他应用程序的灵活性。
- Numpy (npz):虽然流行,但此格式不支持 bfloat16,这在 ML 领域中正变得越来越重要。
Safetensors 的底层原理
深入了解 Safetensors,我们发现它不仅仅是一种数据格式,而是深思熟虑的设计选择的组合,这些选择增强了安全性、效率和实用性:
- 零拷贝:Safetensors 的设计允许在 CPU 上进行真正的零拷贝(如果文件已在缓存中)。在 GPU 上,虽然由于缺少磁盘缓存,始终需要复制,但该设计避免了在任何给定时间在 CPU 上分配所有张量的需要。
- 字节序:Safetensors 使用小端字节序,这是数据存储中的一个流行选择。
- 顺序:它采用“C”或行优先顺序。 这种选择符合数据存储中的普遍标准。
- 步长:不支持步长。 所有张量都需要先打包,然后再序列化。 此设计决策基于序列化格式中的当前使用模式。
更进一步
Safetensors 不仅仅是一种高效且安全的数据存储格式,它还带来了一些额外的优势:
- 防止 DOS 攻击:Safetensors 的设计减轻了恶意文件导致 DOS 攻击的可能性。 标头的大小有限制,以防止解析过大的 JSON,并且保证文件中的地址不重叠,这意味着加载文件永远不应超过内存中的文件大小。
- 更快的加载速度:Safetensors 绕过了 PyTorch 中的额外 CPU 副本,与 pickle 相比,实现了极快的 CPU 加载时间。 GPU 加载时间与其 PyTorch 等效项一样快或更快。
- 延迟加载:在分布式设置(多节点或多 GPU)中,Safetensors 能够仅加载部分张量,从而显着加快了模型加载时间并改善了开发反馈循环。
实际应用
Safetensors 已经在领先的 AI 企业中得到广泛采用,例如 Hugging Face, EleutherAI, 和 StabilityAI。 几个使用 Safetensors 的突出项目包括:
- huggingface/transformers
- AUTOMATIC1111/stable-diffusion-webui
- Llama-cpp
- microsoft/TaskMatrix
- hpcaitech/ColossalAI
- huggingface/pytorch-image-models
- CivitAI
- huggingface/diffusers
- coreylowman/dfdx
- invoke-ai/InvokeAI
- oobabooga/text-generation-webui
- Sanster/lama-cleaner
- PaddlePaddle/PaddleNLP
- AIGC-Audio/AudioGPT
- brycedrennan/imaginAIry
- comfyanonymous/ComfyUI
- LianjiaTech/BELLE
总之,Safetensors 凭借其独特的特性和优势,必将在机器学习和数据存储领域掀起一场变革。 所以,继续前进,试一试吧——模型格式的未来在等着你!