审计显示safetensors是安全的,可以成为默认格式
Hugging Face与EleutherAI和Stability AI密切合作,委托对
safetensors
库进行了一次外部安全审计,审计结果使这三家组织能够将该库作为保存模型的默认格式。
由Trail of Bits执行的安全审计完整结果可在此处找到:报告。
以下博客文章解释了该库的起源、这些审计结果为何重要以及下一步计划。
什么是 safetensors?
🐶Safetensors是一个用于在最常用框架(包括 PyTorch、TensorFlow、JAX、PaddlePaddle 和 NumPy)中保存和加载张量的库。
为了更具体的解释,我们将使用 PyTorch。
import torch
from safetensors.torch import load_file, save_file
weights = {"embeddings": torch.zeros((10, 100))}
save_file(weights, "model.safetensors")
weights2 = load_file("model.safetensors")
与其他格式相比,它还具有许多很酷的功能,最值得注意的是加载文件是安全的,我们稍后会看到。
当您使用transformers
时,如果安装了safetensors
,则这些文件将优先使用,以防止出现问题,这意味着
pip install safetensors
可能是安全运行safetensors
文件所需的唯一操作。
展望未来,由于该库已通过验证,safetensors
现在将默认安装在transformers
中。下一步是将模型默认保存为safetensors
格式。
我们很高兴看到safetensors
库已在 ML 生态系统中使用,包括
为什么要创建新格式?
创建这个库的原因是 PyTorch 在底层使用了pickle
,而pickle
本质上是不安全的。(来源:1、2,视频、3)
使用 pickle,攻击者可以编写一个伪装成模型的恶意文件,在用户不知情的情况下完全控制用户的电脑,从而盗取用户的所有比特币 😓。
尽管 pickle 的这一漏洞在计算机安全领域广为人知(并在 PyTorch 的文档中有所提及),但在更广泛的机器学习社区中并不普及。
Hugging Face Hub 是一个任何人都可以上传和分享模型的平台,因此努力防止用户感染恶意软件非常重要。
我们还在采取措施确保现有的 PyTorch 文件没有恶意,但我们能做的最好就是标记可疑文件。
当然,还有其他文件格式,但似乎没有一种能完全满足我们团队确定的理想要求。
除了安全性,safetensors
还支持惰性加载,并且通常加载速度更快(在 CPU 上快约 100 倍)。
惰性加载意味着以高效的方式仅加载张量的一部分。这个特殊功能使得能够通过高效的推理库(例如text-generation-inference)进行任意分片,从而以最高效率在各种硬件类型上加载大型语言模型(如 LLaMA、StarCoder 等)。
因为它加载速度快且与框架无关,我们甚至可以使用该格式在 PyTorch 或 TensorFlow 中从同一个文件加载模型。
安全审计
由于safetensors
的主要优点是提供安全保障,我们希望确保它确实能做到这一点。这就是为什么 Hugging Face、EleutherAI 和 Stability AI 联手进行外部安全审计以确认其安全性。
重要发现
- 未发现导致任意代码执行的严重安全漏洞。
- 检测并修复了规范格式中的一些不精确之处。
- 修复了由于缺少验证而允许多语言文件的问题。
- 提出了并实施了对测试套件的大量改进。
本着开放和透明的精神,所有公司同意将报告完全公开。
需要注意的一个重要事项是该库是用 Rust 编写的。这直接从语言本身增加了额外的安全层。
虽然无法证明没有缺陷,但这是朝着确保safetensors
确实可以安全使用迈出的重要一步。
未来展望
对于 Hugging Face、EleutherAI 和 Stability AI 来说,主要计划是默认转向使用这种格式。
EleutherAI 已在他们的 LM Evaluation Harness 中增加了对存储为safetensors
格式的模型的评估支持,并且正在努力在他们的 GPT-NeoX 分布式训练库中支持该格式。
在transformers
库中,我们正在进行以下工作:
- 创建
safetensors
。 - 验证它是否有效,并能兑现所有承诺(对 LLM 的惰性加载,所有框架的单一文件,更快的加载)。
- 验证其安全性。(这是今天的公告。)
- 使
safetensors
成为核心依赖项。(这已经完成或即将完成。) - 使
safetensors
成为默认保存格式。这将在几个月后进行,届时我们将获得足够的反馈,以确保它造成的干扰尽可能小,并且足够多的用户已经安装了该库,即使在相对较旧的transformers
版本上也能加载新模型。
至于safetensors
本身,我们正在研究为 LLM 训练添加更高级的功能,这在现有格式中存在自身的问题。
最后,我们计划在不久的将来发布1.0
版本,由庞大的transformers
用户群提供最终测试。自其诞生以来,格式和库的修改非常少,这是一个稳定性的好兆头。
我们很高兴能让机器学习离所有人的安全和高效更近一步!