在https://modelscope.cn/下载的SD模型是一些文件夹和文件,其实是Stable Diffusion模型的“分模块存储格式”,和传统的单文件.ckpt/.safetensors是同一模型的不同存储方式,只是魔搭(ModelScope)平台默认用**“分布式权重拆分”**来存储模型,具体解释如下:
Stable Diffusion模型本身由多个功能模块组成(比如unet、vae、text_encoder等),传统的.ckpt/.safetensors是把这些模块的权重打包成一个文件;而魔搭平台为了适配“模型按需加载” “分布式训练”等场景,会把每个模块的权重拆分成单独的文件夹存储(你看到的unet、vae等文件夹,里面就是对应模块的权重文件)。
这些拆分后的文件,可以直接被魔搭的Python SDK调用,也能转换成传统的单文件.safetensors(如果需要在Automatic1111等SD WebUI中使用):
不需要合并,直接通过ModelScope的代码加载模型生成图片,示例代码:
from modelscope.pipelines import pipeline
from modelscope.outputs import OutputKeys
# 加载拆分后的模型
pipe = pipeline(text-to-image, model=AI-ModelScope/stable-diffusion-v1-5)
# 生成图片
result = pipe({text: 一只可爱的柯基犬在草地上玩耍})
result[OutputKeys.IMAGE].save(corgi.png)
如果你需要在Automatic1111等WebUI中使用,需要把这些拆分的模块合并成单文件,步骤:
a.安装依赖:pip install transformers diffusers safetensors
b.运行合并代码(指定魔搭模型路径):
from diffusers import StableDiffusionPipeline
import torch
from safetensors.torch import save_file
# 加载魔搭拆分的模型
pipe = StableDiffusionPipeline.from_pretrained(
"C:/Users/dahao/.cache/modelscope/hub/models/AI-ModelScope/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
# 合并权重并保存为.safetensors
merged_weights = {}
for name, param in pipe.unet.state_dict().items():
merged_weights[f"unet.{name}"] = param
for name, param in pipe.vae.state_dict().items():
merged_weights[f"vae.{name}"] = param
for name, param in pipe.text_encoder.state_dict().items():
merged_weights[f"text_encoder.{name}"] = param
# 保存到SD WebUI的models/Stable-diffusion目录
save_file(merged_weights, "C:/sd-webui/models/Stable-diffusion/sd-v1-5.safetensors")
运行后就能得到单文件的.safetensors模型,直接放到SD WebUI的对应文件夹即可使用。
这些文件夹不是“错误文件”,而是模型的拆分权重,既可以直接用代码调用,也能合并成你熟悉的单文件格式。