Skip to content

将文件推送到 Hub

[[open-in-colab]]

🤗 Diffusers 提供了一个 [~diffusers.utils.PushToHubMixin] 用于将你的模型、调度器或管道上传到 Hub。这是一种将你的文件存储在 Hub 上的简单方法,也允许你与他人分享你的工作。在幕后,[~diffusers.utils.PushToHubMixin]:

  1. 在 Hub 上创建一个仓库
  2. 保存你的模型、调度器或管道文件,以便以后重新加载
  3. 将包含这些文件的文件夹上传到 Hub

本指南将向你展示如何使用 [~diffusers.utils.PushToHubMixin] 将你的文件上传到 Hub。

你需要先使用你的访问 token 登录到你的 Hub 帐户:

py
from huggingface_hub import notebook_login

notebook_login()

模型

要将模型推送到 Hub,请调用 [~diffusers.utils.PushToHubMixin.push_to_hub] 并指定要存储在 Hub 上的模型的仓库 ID:

py
from diffusers import ControlNetModel

controlnet = ControlNetModel(
    block_out_channels=(32, 64),
    layers_per_block=2,
    in_channels=4,
    down_block_types=("DownBlock2D", "CrossAttnDownBlock2D"),
    cross_attention_dim=32,
    conditioning_embedding_out_channels=(16, 32),
)
controlnet.push_to_hub("my-controlnet-model")

对于模型,你也可以指定要推送到 Hub 的权重的 variant。例如,要推送 fp16 权重:

py
controlnet.push_to_hub("my-controlnet-model", variant="fp16")

[~diffusers.utils.PushToHubMixin.push_to_hub] 函数会保存模型的 config.json 文件,权重会自动以 safetensors 格式保存。

现在你可以从你在 Hub 上的仓库中重新加载模型:

py
model = ControlNetModel.from_pretrained("your-namespace/my-controlnet-model")

调度器

要将调度器推送到 Hub,请调用 [~diffusers.utils.PushToHubMixin.push_to_hub] 并指定要存储在 Hub 上的调度器的仓库 ID:

py
from diffusers import DDIMScheduler

scheduler = DDIMScheduler(
    beta_start=0.00085,
    beta_end=0.012,
    beta_schedule="scaled_linear",
    clip_sample=False,
    set_alpha_to_one=False,
)
scheduler.push_to_hub("my-controlnet-scheduler")

[~diffusers.utils.PushToHubMixin.push_to_hub] 函数会将调度器的 scheduler_config.json 文件保存到指定的仓库。

现在你可以从你在 Hub 上的仓库中重新加载调度器:

py
scheduler = DDIMScheduler.from_pretrained("your-namepsace/my-controlnet-scheduler")

管道

你也可以将整个管道及其所有组件推送到 Hub。例如,使用你想要的参数初始化 [StableDiffusionPipeline] 的组件:

py
from diffusers import (
    UNet2DConditionModel,
    AutoencoderKL,
    DDIMScheduler,
    StableDiffusionPipeline,
)
from transformers import CLIPTextModel, CLIPTextConfig, CLIPTokenizer

unet = UNet2DConditionModel(
    block_out_channels=(32, 64),
    layers_per_block=2,
    sample_size=32,
    in_channels=4,
    out_channels=4,
    down_block_types=("DownBlock2D", "CrossAttnDownBlock2D"),
    up_block_types=("CrossAttnUpBlock2D", "UpBlock2D"),
    cross_attention_dim=32,
)

scheduler = DDIMScheduler(
    beta_start=0.00085,
    beta_end=0.012,
    beta_schedule="scaled_linear",
    clip_sample=False,
    set_alpha_to_one=False,
)

vae = AutoencoderKL(
    block_out_channels=[32, 64],
    in_channels=3,
    out_channels=3,
    down_block_types=["DownEncoderBlock2D", "DownEncoderBlock2D"],
    up_block_types=["UpDecoderBlock2D", "UpDecoderBlock2D"],
    latent_channels=4,
)

text_encoder_config = CLIPTextConfig(
    bos_token_id=0,
    eos_token_id=2,
    hidden_size=32,
    intermediate_size=37,
    layer_norm_eps=1e-05,
    num_attention_heads=4,
    num_hidden_layers=5,
    pad_token_id=1,
    vocab_size=1000,
)
text_encoder = CLIPTextModel(text_encoder_config)
tokenizer = CLIPTokenizer.from_pretrained("hf-internal-testing/tiny-random-clip")

将所有组件传递给 [StableDiffusionPipeline] 并调用 [~diffusers.utils.PushToHubMixin.push_to_hub] 将管道推送到 Hub:

py
components = {
    "unet": unet,
    "scheduler": scheduler,
    "vae": vae,
    "text_encoder": text_encoder,
    "tokenizer": tokenizer,
    "safety_checker": None,
    "feature_extractor": None,
}

pipeline = StableDiffusionPipeline(**components)
pipeline.push_to_hub("my-pipeline")

[~diffusers.utils.PushToHubMixin.push_to_hub] 函数将每个组件保存到存储库中的子文件夹中。现在,你可以从 Hub 上的存储库中重新加载管道:

py
pipeline = StableDiffusionPipeline.from_pretrained("your-namespace/my-pipeline")

隐私

在 [~diffusers.utils.PushToHubMixin.push_to_hub] 函数中设置 private=True 以使你的模型、调度器或管道文件保持私密:

py
controlnet.push_to_hub("my-controlnet-model-private", private=True)

私有存储库仅对你自己可见,其他用户无法克隆存储库,你的存储库也不会出现在搜索结果中。即使用户拥有你私有存储库的 URL,他们也会收到 404 - 抱歉,我们找不到你正在查找的页面。你必须登录才能从私有存储库中加载模型。