审计显示safetensors是安全的,可以成为默认格式

发布于 2023 年 5 月 23 日
在 GitHub 上更新

Hugging FaceEleutherAIStability 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本质上是不安全的。(来源:12,视频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用户群提供最终测试。自其诞生以来,格式和库的修改非常少,这是一个稳定性的好兆头。

我们很高兴能让机器学习离所有人的安全和高效更近一步!

社区

注册登录评论