Safetensors是一种专为存储大型张量数据设计的文件格式,由Hugging Face团队开发,旨在提供安全高效的模型参数存储解决方案。下面将详细介绍Safetensors格式及其特点,并全面梳理当前主流的大模型文件格式。
一、Safetensors格式详解
1. 基本概念与设计背景
Safetensors是一种专为存储和加载大型张量(tensors)而设计的文件格式,文件扩展名通常为.safetensors
。它解决了传统存储格式(如PyTorch的.pt/.pth文件)存在的几个关键问题:
- 安全性问题:传统格式使用Python的Pickle模块进行序列化,可能在加载时执行任意代码,带来安全风险
- 效率问题:处理极大规模模型时,传统格式的加载速度和内存效率可能成为瓶颈
- 可移植性问题:不同框架和工具对模型文件格式的支持程度不一,导致跨平台共享复杂
2. 核心特性
Safetensors具有以下显著特点:
- 安全性:采用纯二进制格式,不依赖Pickle序列化,避免了潜在代码执行风险
- 高效性:支持零拷贝(zero-copy)加载和内存映射(memory mapping),显著提升大模型加载速度
- 跨平台/跨框架:适用于PyTorch、TensorFlow等多种深度学习框架
- 简洁性:文件结构简单明了,便于理解和实现
3. 文件结构
Safetensors文件采用精心设计的二进制格式,主要由以下几部分组成:
- 头部信息(Header):包含文件元数据和校验信息,如格式版本、数据长度等
- 张量索引表(Tensor Metadata):记录每个张量的名称、数据类型、形状和偏移量
- 张量数据区(Tensor Data):实际存储张量数据的连续内存块
这种结构设计使得Safetensors能够快速定位特定张量,同时高效加载数据。
4. 使用示例
保存Safetensors文件
import torch
from safetensors.torch import save_file# 定义PyTorch模型权重
weights = {"weight1": torch.randn(3, 3), "weight2": torch.ones(5)}# 保存为safetensors格式
save_file(weights, "model.safetensors")
加载Safetensors文件
from safetensors.torch import load_file# 加载safetensors文件
loaded_weights = load_file("model.safetensors", device="cpu")for key, value in loaded_weights.items():print(f"{key}: {value}")
部分加载优化
对于大型模型,可以只加载需要的部分张量:
from safetensors import safe_openwith 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[:, :hidden_dim]
5. 优势与局限性
主要优势:
- 安全性高,避免恶意代码执行风险
- 加载速度快,支持内存映射和零拷贝
- 文件体积紧凑,存储效率高
- 跨框架支持良好
局限性:
- 生态系统相对较新,社区支持不如传统格式广泛
- 主要与PyTorch集成良好,对其他框架支持仍在完善
- 不支持存储自定义对象和复杂结构
二、大模型主流文件格式全览
除了Safetensors外,当前大模型领域主要使用以下几种文件格式:
1. PyTorch原生格式(.pt/.pth)
- 特点:PyTorch默认序列化格式,使用Python的Pickle模块,可保存完整模型结构或仅权重(state_dict)
- 优点:与PyTorch生态无缝集成,灵活性高
- 缺点:存在安全风险(反序列化漏洞),大文件加载较慢
- 适用场景:PyTorch框架内的训练、微调和调试
- 代表模型:Meta的Llama系列、通义千问(Qwen)等
2. GGUF格式
- 特点:GGML的升级版,专为本地推理优化,支持元数据和灵活量化策略
- 优点:加载速度快、内存占用低,支持多GPU和量化(如4-bit)
- 缺点:主要面向CPU/本地推理,生态相对局限
- 适用场景:边缘设备部署、低延迟本地应用
- 代表工具:llama.cpp、alpaca.cpp
3. ONNX格式(.onnx)
- 特点:开放神经网络交换格式,将模型转换为计算图形式
- 优点:跨框架兼容性好,支持多硬件加速,推理性能高
- 缺点:转换过程复杂,动态结构支持有限
- 适用场景:跨框架部署、硬件加速推理
- 代表运行时:ONNX Runtime
4. TensorFlow格式
包括多种子类型:
- SavedModel:TensorFlow标准导出格式,包含完整模型
- .ckpt:检查点格式,保存权重和训练状态
- 优点:与TensorFlow生态深度集成
- 缺点:依赖TensorFlow环境
- 代表模型:Google的PaLM、BERT等
5. Hugging Face格式(.bin/.json)
-
组成:
- pytorch_model.bin:模型权重
- config.json:模型结构配置
- tokenizer.json:分词器配置
-
优点:与Transformers库无缝集成
-
缺点:文件体积较大
-
适用场景:Hugging Face生态系统中的模型共享
6. HDF5格式(.h5)
- 特点:通用科学数据存储格式,曾为Keras默认格式
- 优点:跨平台兼容性好
- 缺点:逐渐被其他格式取代
- 适用场景:科研存档和兼容性要求高的场景
三、主流格式对比与选型建议
1. 关键特性对比表
格式 | 量化支持 | 安全性 | 跨框架 | 加载速度 | 适用场景 | 代表模型/工具 |
---|---|---|---|---|---|---|
Safetensors | 部分 | 高 | 是 | 快 | 安全敏感部署、开源共享 | Hugging Face生态模型 |
GGUF | 是 | 中 | 否 | 极快 | 本地/边缘推理 | Llama系列、alpaca.cpp |
PyTorch(.pt) | 否 | 低 | 否 | 中等 | PyTorch训练/调试 | Llama, Qwen |
ONNX | 否 | 高 | 是 | 快 | 跨框架/硬件加速 | 多框架转换模型 |
TensorFlow | 否 | 中 | 否 | 中等 | TensorFlow生态 | PaLM, BERT |
HF(.bin) | 否 | 中 | 部分 | 中等 | Hugging Face生态 | Transformers库模型 |
2. 选型建议
根据具体需求选择最合适的格式:
- 安全优先:选择Safetensors,避免生产环境中的代码注入风险
- 本地推理:GGUF凭借内存映射和量化支持,适合资源受限的边缘设备
- 跨框架部署:ONNX或Safetensors提供良好的跨框架兼容性
- 框架绑定:根据主要使用的深度学习框架选择原生格式(如PyTorch→.pt, TensorFlow→SavedModel)
- 长期存储:优先使用标准化格式(Safetensors或GGUF),避免技术迭代导致的兼容性问题
四、技术发展趋势
大模型文件格式的发展呈现以下趋势:
- 安全性提升:Safetensors等安全格式逐渐取代存在风险的Pickle序列化格式
- 量化技术普及:GGUF等支持量化的格式在边缘计算中广泛应用
- 跨框架兼容性:ONNX和Safetensors等格式推动模型在不同框架间的无缝迁移
- 加载效率优化:零拷贝、内存映射等技术显著提升大模型加载速度
随着大模型技术的不断发展,文件格式的选择将更加注重安全性、效率与跨平台兼容性的平衡。Safetensors作为新兴的安全高效格式,正在获得越来越广泛的应用,有望成为未来大模型存储的主流格式之一。