Safetensors,快速高效、安全易用的深度学习新工具

本文将介绍一种为深度学习应用提供速度、效率、跨平台兼容性、用户友好性和安全性的新工具。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

什么是Safetensors?

【Safetensors】:https://huggingface.co/docs/safetensors/index

Hugging Face开发了一种名为Safetensors的新序列化格式,旨在简化和精简大型复杂张量的存储和加载。张量是深度学习中使用的主要数据结构,其大小会给效率带来挑战。

Safetensors结合使用高效的序列化和压缩算法来减少大型张量的大小,使其比pickle等其他序列化格式更快、更高效。这意味着,与传统PyTorch序列化格式pytorch_model.binmodel.safetensors相比,Safetensors在CPU上的速度快76.6倍,在GPU上的速度快2倍。请查看速度比较(https://huggingface.co/docs/safetensors/speed)

使用Safetensors的好处

易用性

Safetensors具有简单直观的API,可以在Python中序列化和反序列化张量。这意味着开发人员可以专注于搭建深度学习模型,而不必在序列化和反序列化上花费时间。

跨平台兼容性

可以用Python进行序列化,并方便地使用各种编程语言和平台(如C++、Java和JavaScript)加载生成的文件。这样就可以实现在不同的编程环境中无缝共享模型。

速度

Safetensors针对速度进行了优化,可以高效处理大型张量的序列化和反序列化。因此,它是使用大型语言模型的应用程序的绝佳选择。

大小优化

它混合使用了有效的序列化和压缩算法,以减小大型张量的大小,与其他序列化格式(如pickle)相比,性能更快、更高效。

安全

为了防止序列化张量在存储或传输过程中出现损坏,Safetensors使用了校验和机制。这保证了额外的安全性,确保存储在Safetensors中的所有数据都准确可靠。此外,它还能防止DOS攻击。

懒性加载

在使用多个节点或GPU的分布式环境中工作时,只在每个模型上加载部分张量是很有帮助的。BLOOM利用这种格式在8个 GPU上加载模型仅需45秒,而普通PyTorch加权则需要10分钟。

开始使用Safetensors

在本节中,我们将介绍safetensors API,以及如何保存和加载张量文件。

可以使用pip管理器安装safetensors

pip install safetensors

本文将使用Torch共享张量中的示例来搭建一个简单的神经网络,并使用PyTorch的safetensors.torch API保存模型。

from torch import nn

class Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.a = nn.Linear(100, 100)
        self.b = self.a

    def forward(self, x):
        return self.b(self.a(x))


model = Model()
print(model.state_dict())

正如所看到的,已经成功创建了模型。

OrderedDict([('a.weight', tensor([[-0.0913, 0.0470, -0.0209, ..., -0.0540, -0.0575, -0.0679], [ 0.0268, 0.0765, 0.0952, ..., -0.0616, 0.0146, -0.0343], [ 0.0216, 0.0444, -0.0347, ..., -0.0546, 0.0036, -0.0454], ...,

现在,我们将通过提供model对象和文件名来保存模型。然后,我们将把保存的文件加载到使用nn.Module创建的model对象中。

from safetensors.torch import load_model, save_model

save_model(model, "model.safetensors")

load_model(model, "model.safetensors")
print(model.state_dict())
OrderedDict([('a.weight', tensor([[-0.0913, 0.0470, -0.0209, ..., -0.0540, -0.0575, -0.0679], [ 0.0268, 0.0765, 0.0952, ..., -0.0616, 0.0146, -0.0343], [ 0.0216, 0.0444, -0.0347, ..., -0.0546, 0.0036, -0.0454], ...,

在第二个示例中,我们将尝试保存使用torch.zeros创建的张量。为此,我们将使用save_file函数。

import torch
from safetensors.torch import save_file, load_file

tensors = {
   "weight1": torch.zeros((1024, 1024)),
   "weight2": torch.zeros((1024, 1024))
}
save_file(tensors, "new_model.safetensors")

为了加载张量,我们将使用load_file函数。

load_file("new_model.safetensors")
{'weight1': tensor([[0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         ...,
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.]]),
 'weight2': tensor([[0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         ...,
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.],
         [0., 0., 0.,  ..., 0., 0., 0.]])}

Safetensors API适用于Pytorch、Tensorflow、PaddlePaddle、Flax和Numpy。可以通过阅读Safetensors文档来了解它。

图片

图片来自Torch API

结论

简而言之,Safetensors是一种存储深度学习应用中使用的大型张量的新方法。与其他技术相比,它具有更快、更高效和用户友好的特点。此外,它还能确保数据的保密性和安全性,同时支持各种编程语言和平台。通过使用Safetensors,机器学习工程师可以优化时间,专注于开发更优秀的模型。

强烈推荐在项目中使用Safetensors。许多顶级AI公司,如Hugging Face、EleutherAI和StabilityAI,都在他们的项目中使用了Safetensors。

参考资料

文档:Safetensors(https://huggingface.co/docs/safetensors/index)

博客:https://medium.com/@zergtant/what-is-safetensors-and-how-to-convert-ckpt-model-to-safetensors-13d36eb94d57

GitHub:https://github.com/huggingface/safetensors

推荐书单

IT BOOK 多得(点击查看5折活动书单)icon-default.png?t=N7T8https://u.jd.com/psx2y1M

《面向移动设备的深度学习—基于TensorFlow Lite,ML Kit和Flutter》

《面向移动设备的深度学习—基于TensorFlow Lite,ML Kit和Flutter》详细阐述了与移动设备深度学习开发相关的基本解决方案,主要包括使用设备内置模型执行人脸检测、开发智能聊天机器人、识别植物物种、生成实时字幕、构建人工智能认证系统、使用AI生成音乐、基于强化神经网络的国际象棋引擎、构建超分辨率图像应用程序等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。

本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

《面向移动设备的深度学习—基于TensorFlow Lite,ML Kit和Flutter》icon-default.png?t=N7T8https://item.jd.com/14001258.html

图片

精彩回顾

《使用PyTorch神经网络和YoloV8识别身体姿势》

《使用Stable Diffusion和PyTorch创建艺术二维码》

《活用PyTorch,图像分类实战指南》

《使用PyTorch训练一个LSTM预测模型》

《逐步拆解学习,从简单线性回归到TensorFlow深度学习》

《手把手教你升级PyTorch 2.0和CUDA》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

### Safetensors 的多框架兼容性与 Transformers 模型加载 Safetensors 是一种高效的文件格式,用于存储深度学习模型的权重。它具有安全性、高性能以及良好的跨框架兼容性特点[^1]。 #### 1. **Safetensors 文件的安全性和高效性** Safetensors 提供了一种安全的方式来保存和读取模型权重,避免了传统 Pickle 方法可能带来的安全隐患。通过其零拷贝特性,可以显著提升模型加载的速度,这对于大规模模型尤为重要。 以下是使用 `safetensors` 加载部分张量的一个典型例子: ```python from safetensors import safe_open tensors = {} with safe_open("model.safetensors", framework="pt", device=0) as f: tensor_slice = f.get_slice("embedding") vocab_size, hidden_dim = tensor_slice.get_shape() tensor = tensor_slice[:vocab_size, :hidden_dim] ``` 上述代码展示了如何仅加载特定的部分张量(如嵌入层),从而节省内存资源并加速初始化过程。 --- #### 2. **Transformers 库中的集成** Hugging Face 的 Transformers 库广泛支持各种主流的大规模预训练模型,并提供了对 `safetensors` 格式的内置支持。这意味着可以直接利用 `.safetensors` 文件作为模型权重的来源,而无需额外转换为其他格式。 要加载基于 `safetensors` 存储的 Transformer 模型,可以通过如下方式完成: ```python from transformers import AutoModelForCausalLM, AutoTokenizer # 初始化 tokenizer 和 model tokenizer = AutoTokenizer.from_pretrained("path/to/model", use_safetensors=True) model = AutoModelForCausalLM.from_pretrained( "path/to/model", torch_dtype=torch.float16, low_cpu_mem_usage=True, use_safetensors=True ) # 测试推理功能 input_text = "Hello world!" inputs = tokenizer(input_text, return_tensors="pt").to(model.device) outputs = model.generate(**inputs) print(tokenizer.decode(outputs[0])) ``` 在此过程中,参数 `use_safetensors=True` 明确指定了优先尝试从 `.safetensors` 文件中加载权重。如果该路径不存在对应的 `.safetensors` 文件,则会回退到传统的 PyTorch 权重文件(`.bin`)。此设计增强了灵活性,同时也保留了向后兼容的能力[^3]。 --- #### 3. **多框架的支持能力** 为了适应不同的深度学习生态系统需求,Safetensors 被设计为能够轻松适配多个框架环境。例如,在 TensorFlow 或 JAX 中也可以采用类似的逻辑操作这些二进制数据结构。具体而言,开发者只需调整 `framework` 参数即可切换目标运行时平台: ```python import tensorflow as tf from safetensors.tensorflow import load_file weights = load_file("model.safetensors", tf_device="/GPU:0") for name, value in weights.items(): print(f"{name}: {value.shape}") ``` 这段代码片段演示了在 TensorFlow 下加载相同格式的数据流程序列化对象的方法。 此外,对于那些专注于轻量化部署场景的应用场合来说,诸如 vLLM 这样的优化框架同样推荐配合 `safetensors` 实现更优的整体表现[^2]。 --- ### 总结 综上所述,借助于 Safetensors 所具备的强大特性和易用接口,无论是单机实验还是分布式生产环境中都可以便捷地处理复杂的神经网络架构及其关联组件之间的交互关系。同时,由于其天然契合现代机器学习工作流程的设计理念,使得像 HuggingFace Transformers 等工具链得以无缝衔接其中,进一步促进了整个行业的标准化进程与发展步伐。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值