将文件推送到 Hub
🤗 Diffusers 提供了一个 PushToHubMixin 用于将您的模型、调度器或管道上传到 Hub。这是一种将文件存储在 Hub 上的简单方法,还可以让您与他人分享您的工作。在后台,PushToHubMixin
- 在 Hub 上创建一个仓库
- 保存您的模型、调度器或管道文件,以便以后重新加载
- 将包含这些文件的文件夹上传到 Hub
本指南将向您展示如何使用 PushToHubMixin 将您的文件上传到 Hub。
您需要先使用您的访问 令牌 登录到您的 Hub 帐户
from huggingface_hub import notebook_login
notebook_login()
模型
要将模型推送到 Hub,请调用 push_to_hub() 并指定要存储在 Hub 上的模型的仓库 ID
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 的权重的 变体。例如,要推送 fp16
权重
controlnet.push_to_hub("my-controlnet-model", variant="fp16")
该 push_to_hub() 函数保存模型的 config.json
文件,并且权重会自动以 safetensors
格式保存。
现在您可以从 Hub 上的仓库中重新加载模型了
model = ControlNetModel.from_pretrained("your-namespace/my-controlnet-model")
调度器
要将调度器推送到 Hub,请调用 push_to_hub() 并指定要存储在 Hub 上的调度器的仓库 ID
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")
该 push_to_hub() 函数将调度器的 scheduler_config.json
文件保存到指定的仓库中。
现在您可以从 Hub 上的仓库中重新加载调度器了
scheduler = DDIMScheduler.from_pretrained("your-namepsace/my-controlnet-scheduler")
管道
您还可以将整个管道及其所有组件推送到 Hub。例如,使用所需的参数初始化 StableDiffusionPipeline 的组件
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 并调用 push_to_hub() 以将管道推送到 Hub
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")
该 push_to_hub() 函数将每个组件保存到仓库中的子文件夹中。现在您可以从 Hub 上的仓库中重新加载管道了
pipeline = StableDiffusionPipeline.from_pretrained("your-namespace/my-pipeline")
隐私
在 push_to_hub() 函数中设置 private=True
以使您的模型、调度器或管道文件保持私密
controlnet.push_to_hub("my-controlnet-model-private", private=True)
私有仓库仅对您可见,其他用户将无法克隆该仓库,并且您的仓库不会出现在搜索结果中。即使用户拥有您私有仓库的 URL,他们也会收到 404 - 抱歉,我们找不到您要查找的页面
。您必须 登录才能从私有仓库加载模型。