chilloutmix_NiPrunedFp32Fix 模型转换:PyTorch、ONNX、Safetensors 互转一次搞定
【免费下载链接】chilloutmix_NiPrunedFp32Fix项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix
chilloutmix_NiPrunedFp32Fix 仓库里的 .bin 权重无法被部分推理框架与安全加载平台直接读取。本文给出 chilloutmix_NiPrunedFp32Fix 模型转换的完整实操流程:PyTorch 转 ONNX、bin 转 safetensors,以及转换后怎么验证。
格式速决:先定 SD 模型格式转换的目标
动手前先看这张表,确定你要的是哪个格式,再往下找到对应章节:
| 格式 | 适合场景 | 说明 |
|---|---|---|
| PyTorch(.bin,仓库原始格式) | 开发、微调、本地训练 | diffusers、transformers 直接可加载,无需转换 |
| ONNX(.onnx) | 跨平台推理、ONNX Runtime 部署 | 冻结的计算图,脱离 PyTorch 也能跑推理 |
| Safetensors(.safetensors) | 生产环境安全加载 | 纯张量存储、无代码执行风险,diffusers 可原生加载 |
一句话决策:部署目标是 ONNX Runtime 就转 ONNX;只想把 .bin 换成安全格式就转 safetensors。
环境准备:依赖与仓库一次装好
🚀 所有依赖集中在这一条命令里,后面各节不再重复:
pip install torch onnx diffusers transformers safetensors把仓库拉到本地,转换全程在模型目录内操作:
git clone https://gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix cd chilloutmix_NiPrunedFp32Fix仓库是 Stable Diffusion Pipeline 架构,核心组件目录和权重文件名如下,后面转换脚本会用到:
| 组件 | 权重文件 | 结构定义 |
|---|---|---|
| text_encoder/ | pytorch_model.bin | config.json(CLIP 文本编码器) |
| unet/ | diffusion_pytorch_model.bin | config.json(去噪主网络 UNet,负责把噪声潜变量一步步变成图像) |
| vae/ | diffusion_pytorch_model.bin | config.json(图像编解码器) |
PyTorch 转 ONNX:用 torch.onnx.export 导出 unet
这一步在做什么:StableDiffusionPipeline.from_pretrained从仓库加载整条管线,然后用假输入"回放"一次 UNet 的前向计算,torch.onnx.export把计算图记录成 .onnx 文件。UNet 的输入形状在 config.json 里写死了(64×64 潜变量、77×768 文本特征),假输入必须按这个形状构造。
import torch from diffusers import StableDiffusionPipeline pipe = StableDiffusionPipeline.from_pretrained( "./chilloutmix_NiPrunedFp32Fix", # 改成你的模型目录路径 torch_dtype=torch.float32, safety_checker=None, ) sample = torch.randn(1, 4, 64, 64) # 潜变量:64x64,对应 unet config 的 sample_size encoder_hidden_states = torch.randn(1, 77, 768) # 文本特征:77 为 CLIP 最大词数,768 为隐藏层维度 timestep = torch.tensor([1]) torch.onnx.export( pipe.unet, (sample, timestep, encoder_hidden_states), "unet.onnx", # 输出路径,可自定义 opset_version=14, # ONNX 算子集版本:推理端版本旧就调低,新就调高 do_constant_folding=True, )需要你按环境修改的只有三处:第一处加载路径、opset_version、输出文件名。导出完成且文件体积与 unet 权重同量级,即视为导出成功。
bin 转 safetensors:三个组件三步转完
这一步在做什么:用torch.load原样读出权重字典,再用safetensors.torch.save_file写回磁盘——不改结构、不重训练,属于无损换容器。三个 .bin 各转一次即可。
import torch from safetensors.torch import save_file pairs = [ ("text_encoder/pytorch_model.bin", "text_encoder/pytorch_model.safetensors"), ("unet/diffusion_pytorch_model.bin", "unet/diffusion_pytorch_model.safetensors"), ("vae/diffusion_pytorch_model.bin", "vae/diffusion_pytorch_model.safetensors"), ] for src, dst in pairs: state_dict = torch.load(src, map_location="cpu") # 放 CPU 上读,避免显存爆掉 save_file(state_dict, dst)需要你按环境修改的:pairs里只保留你目录中真实存在的 .bin 路径,只转部分组件就删掉对应行。各目录下的 config.json 保持原样、与权重放在同一目录,不需要任何改动。
转换后怎么验证:跑一张测试图
diffusers 能直接加载 safetensors,所以最省事的验证是用转换后的目录跑一次文本生图。判定标准:
- ✅ 成功:正常生成 test_output.png,画面有内容、无大面积灰块或噪点。
- 失败:抛形状不匹配、权重缺失等异常,或输出纯黑/纯灰图——说明权重与配置没对上,去下面排错。
from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained( "./chilloutmix_NiPrunedFp32Fix", # 指向已转换的模型目录 torch_dtype=torch.float32, safety_checker=None, ) image = pipe("a beautiful landscape").images[0] image.save("test_output.png")注意 ONNX 的验证方式不同:StableDiffusionPipeline 不认 .onnx 文件,它的通过标准是导出过程无报错、文件体积与 unet 原始权重同量级,再交给 ONNX Runtime 做推理测试。
排错速查:常见现象按"现象→原因→处理"对号入座
⚠️ 转换中途卡住时,先按下表定位,比从头排查快:
| 现象 | 原因 | 处理 |
|---|---|---|
| 加载/转换时 torch.cuda.OutOfMemoryError 或进程被系统杀掉 | float32(fp32,全精度存储)整套权重内存占用大 | 加载时改用torch_dtype=torch.float16;或按组件逐个转换 |
| onnx 导出报错或产物文件异常小 | opset 版本偏低,或假输入形状与 config 不符 | opset_version提到 14 及以上;确认假输入为 1×4×64×64 与 1×77×768 |
| 转换后加载立刻报形状不匹配 | config.json 与权重不同步 | 转换时不动原 config.json,权重放回同一目录;不要混入其他模型的配置文件 |
save_file报 state_dict 缺键或结构异常 | torch.load拿到的字典结构与预期不符 | 先打印state_dict顶层键名确认结构,再重新保存 |
转完、验完,三种格式即可按各自场景直接投入使用。
【免费下载链接】chilloutmix_NiPrunedFp32Fix项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考