Hugging Face(拥抱面孔),与EleutherAI和Stability AI密切合作,已经对safetensors
库进行了外部安全审计,审计结果使得这三个组织可以朝着将该库设为保存模型的默认格式迈进。
Trail of Bits所进行的完整安全审计结果可以在这里找到:Report。
以下博文解释了该库的起源,为什么这些审计结果很重要以及下一步的计划。
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
库已经在机器学习生态系统中得到使用,包括:
- Civitai
- Stable Diffusion Web UI
- dfdx
- LLaMA.cpp
为什么要创建新的东西?
创建这个库的原因是因为PyTorch在底层使用了pickle
,而pickle
本质上是不安全的。(来源:1,2,video,3)
使用pickle,可以编写一个伪装成模型的恶意文件,该文件可以在用户不知情的情况下将用户计算机的完全控制权交给攻击者,从而允许攻击者窃取用户的所有比特币 😓。
尽管pickle中的这个漏洞在计算机安全领域广为人知(并且在PyTorch文档中得到确认),但在更广泛的机器学习社区中并不是常识。
由于Hugging Face Hub是一个任何人都可以上传和共享模型的平台,因此重要的是采取措施防止用户感染恶意软件。
我们还在采取措施确保现有的PyTorch文件不是恶意的,但我们能做的最好的事情就是标记看起来可疑的文件。
当然,还有其他文件格式,但没有一个似乎符合我们团队确定的完整理想要求。
除了安全,safetensors
还允许延迟加载和更快的加载速度(在CPU上大约快100倍)。
延迟加载意味着以高效的方式仅加载张量的一部分。这个特性使得可以使用高效的推理库(比如text-generation-inference)对LLMs(如LLaMA、StarCoder等)进行任意分片,以在各种类型的硬件上以最大效率加载。
由于加载速度非常快且与框架无关,我们甚至可以使用该格式在PyTorch或TensorFlow中加载相同文件的模型。
安全审计
由于safetensors
的主要优势是提供安全保证,我们希望确保它确实能够实现。这就是为什么Hugging Face、EleutherAI和Stability AI联手进行了外部安全审计以确认这一点。
重要发现:
- 未发现导致任意代码执行的重大安全漏洞。
- 检测并修复了规范格式中的一些不准确之处。
- 修复了一些缺失的验证,允许多语言文件。
- 提出并实施了许多对测试套件的改进。
为了公开透明,所有公司都同意将报告完全公开。
完整报告
需要注意的一点是,该库是用Rust编写的。这增加了从语言本身直接获得的额外安全层。
虽然不可能证明没有缺陷,但这是向人们提供确保safetensors确实安全可用的重要一步。
展望未来
Hugging Face、EleutherAI和Stability AI的总体计划是默认使用这种格式。
EleutherAI已经支持在他们的LM评估工具中评估以safetensors存储的模型,并正在致力于在他们的GPT-NeoX分布式训练库中支持该格式。
在transformers
库中,我们将执行以下步骤:
- 创建safetensors。
- 验证其是否能够履行所有承诺(LLM的惰性加载、所有框架的单个文件、更快的加载)。
- 验证其安全性。(这是今天的公告。)
- 使safetensors成为核心依赖。(这已经完成或即将完成。)
- 将safetensors设为默认保存格式。这将在几个月后发生,届时我们将获得足够的反馈,以确保它不会造成尽可能少的中断,并且足够多的用户已经拥有该库,可以在相对较旧的
transformers
版本上加载新模型。
至于safetensors本身,我们正在研究为LLM训练增加更多高级功能,该训练存在着一系列当前格式的问题。
最后,我们计划在不久的将来发布一个1.0
版本,transformers
的大量用户将提供最后的测试步骤。自从它们问世以来,该格式和库几乎没有进行过修改,这是一个稳定的迹象。
我们很高兴能够让机器学习离安全和高效更近一步!