跳转至

加载安全张量

译者:片刻小哥哥

项目地址:https://huggingface.apachecn.org/docs/diffusers/using-diffusers/using_safetensors

原始地址:https://huggingface.co/docs/diffusers/using-diffusers/using_safetensors

在 Colab 中打开

在 Studio Lab 中打开

安全张量 是一种用于存储和加载张量的安全且快速的文件格式。通常,PyTorch 模型权重被保存或 腌制 变成一个 .bin 使用 Python 的文件 pickle 公用事业。然而, 泡菜 不安全,pickled 文件可能包含可以执行的恶意代码。 safetensors 是一个安全的替代品 泡菜 ,使其成为共享模型权重的理想选择。

本指南将向您展示如何加载 .safetensor 文件,以及如何将以其他格式存储的稳定扩散模型权重转换为 .safetensor 。在开始之前,请确保已安装 safetensors:

# uncomment to install the necessary libraries in Colab
#!pip install safetensors

如果你看一下 runwayml/stable-diffusion-v1-5 存储库,您将看到里面的权重 文本编码器 , 乌内特瓦伊 子文件夹存储在 .safetensors 格式。默认情况下,🤗 Diffusers 会自动加载这些 .safetensors 如果它们在模型存储库中可用,则从其子文件夹中获取文件。

为了更明确的控制,您可以选择设置 use_safetensors=True (如果 安全张量 尚未安装,您将收到一条错误消息,要求您安装):

from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", use_safetensors=True)

但是,模型权重不一定像上面的示例那样存储在单独的子文件夹中。有时,所有权重都存储在一个 .safetensors 文件。在这种情况下,如果权重是稳定扩散权重,则可以直接使用 来自_single_file() 方法:

from diffusers import StableDiffusionPipeline

pipeline = StableDiffusionPipeline.from_single_file(
    "https://huggingface.co/WarriorMama777/OrangeMixs/blob/main/Models/AbyssOrangeMix/AbyssOrangeMix.safetensors"
)

转换为安全张量

并非集线器上的所有重量都可用 .safetensors 格式,您可能会遇到存储为的权重 .bin 。在这种情况下,请使用 转换空间 将权重转换为 .safetensors 。转换空间下载腌制的权重,对其进行转换,然后打开拉取请求以上传新转换的权重 .safetensors 集线器上的文件。这样,如果腌制文件中包含任何恶意代码,它们就会被上传到集线器 - 该集线器有一个 安全扫描仪 检测不安全的文件和可疑的 pickle 导入 - 而不是您的计算机。

您可以将该模型与新的一起使用 .safetensors 通过指定对拉取请求的引用来指定权重 修订 参数(您也可以在此测试 检查公关 集线器上的空间),例如 refs/pr/22 :

from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-1", revision="refs/pr/22", use_safetensors=True
)

为什么使用安全张量?

使用安全张量有几个原因:

  • 安全是使用 safetensors 的首要原因。随着开源和模型分发的增长,能够相信您下载的模型权重不包含任何恶意代码非常重要。 safetensors 中标头的当前大小会阻止解析非常大的 JSON 文件。
  • 切换模型之间的加载速度是使用 safetensors 的另一个原因,它执行张量的零复制。与以下相比,它特别快 泡菜 如果您将权重加载到 CPU(默认情况),则与直接将权重加载到 GPU 时一样快(如果不是更快的话)。仅当模型已加载时,您才会注意到性能差异,而如果您正在下载权重或首次加载模型,则不会注意到性能差异。

加载整个管道所需的时间:

from diffusers import StableDiffusionPipeline

pipeline = StableDiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", use_safetensors=True)
"Loaded in safetensors 0:00:02.033658"
"Loaded in PyTorch 0:00:02.663379"

但加载 500MB 模型权重的实际时间仅为:

safetensors: 3.4873ms
PyTorch: 172.7537ms
  • Lazy loading is also supported in safetensors, which is useful in distributed settings to only load some of the tensors. This format allowed the BLOOM model to be loaded in 45 seconds on 8 GPUs instead of 10 minutes with regular PyTorch weights.

我们一直在努力

apachecn/AiLearning

【布客】中文翻译组