chilloutmix_NiPrunedFp32Fix 模型格式转换:PyTorch 转 ONNX / Safetensors 完整指南
【免费下载链接】chilloutmix_NiPrunedFp32Fix项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix
如果你正在做 chilloutmix_NiPrunedFp32Fix 模型格式转换,大概率卡在同一件事上:仓库给的是 PyTorch 的 .bin 权重,但你的部署环境只认 ONNX,或者想换成加载更快、更安全的 Safetensors。这篇只讲一件事——怎么把这个 Stable Diffusion 模型转成这两种格式,转完还能跑通推理。全程是可复制的命令和代码,不用自己拼。
先看懂三种格式,再决定转哪个
做 diffusers 模型格式互转之前,先拿这张表定方向,别白转:
| 格式 | 定位 | 典型场景 |
|---|---|---|
| PyTorch(.bin) | 原生权重,diffusers 直接加载 | 开发调试、微调训练 |
| ONNX | 跨平台推理图,可脱离 PyTorch 运行 | ONNX 推理部署、服务端/端侧加速 |
| Safetensors | 纯张量存储,加载快且无代码执行风险 | 生产环境加载、仓库分发 |
一句话判断:想给推理提速选 ONNX,只想让加载更安全高效就转 Safetensors,两者都想要就各转一遍,互不冲突。
动手前:一条命令装依赖
pip install torch onnx safetensors diffusers transformers然后把仓库拉到本地,后面所有操作都在仓库根目录执行:
git clone https://gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix cd chilloutmix_NiPrunedFp32Fix仓库里 UNet 权重在 unet/diffusion_pytorch_model.bin,结构参数在 unet/config.json,下面转换会直接用到。
Stable Diffusion 模型转 ONNX:导出 UNet 推理图
产出是一个unet.onnx文件,ONNX Runtime 可以直接加载,不再依赖 PyTorch 运行时。
from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained("./", torch_dtype=torch.float16, safety_checker=None) unet = pipe.unet # 按 UNet 真实输入造 dummy 数据:4 通道 latent、64x64,77 是 CLIP 文本序列长度 latents = torch.randn(1, 4, 64, 64) timestep = torch.tensor([1]) hidden = torch.randn(1, 77, 768) torch.onnx.export(unet, (latents, timestep, hidden), "unet.onnx", opset_version=14, do_constant_folding=True)产物unet.onnx落在仓库根目录。推理时它和unet/config.json里的结构定义配套使用,配置文件本身不用改。
PyTorch 转 Safetensors:三行换容器
这一步只是把权重换个"容器"存放,不重算、不降精度,基本秒级完成。
import torch from safetensors.torch import save_file # 两个最重的组件逐个转,map_location=cpu 避免吃显存 save_file(torch.load("unet/diffusion_pytorch_model.bin", map_location="cpu"), "unet/diffusion_pytorch_model.safetensors") save_file(torch.load("text_encoder/pytorch_model.bin", map_location="cpu"), "text_encoder/pytorch_model.safetensors")产物和原 .bin 放在同一目录,diffusers 加载时会优先识别 .safetensors,旧文件保留或删除都不影响运行。
踩坑:新手最常撞的三个问题
- 转换时内存爆掉→ 全程用
torch.float16加载,UNet 和 text_encoder 分开转,别一次性全量进内存。 - 加载报 config 不匹配→ 核对
unet/config.json的结构参数(in_channels、sample_size)与model_index.json的组件声明是否一致,转换过程中别动这两个文件。 - ONNX 导出报不支持的算子→ 把
opset_version升到 17 再试;只导出 UNet 单组件,别想一条 pipeline 整图导完。
验证:出一张图就算转对了
最省事的验收标准就一条——原 pipeline 还能正常出图:
from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained("./", torch_dtype=torch.float32, safety_checker=None) pipe("a beautiful landscape").images[0].save("test.png")test.png正常生成、画面合理,就说明 chilloutmix_NiPrunedFp32Fix 模型格式转换完成,可以上部署了。万一出问题,排查入口就在各组件目录:unet/、text_encoder/、vae/下的config.json定义结构,model_index.json定义整体拼装关系,对照报错先看它们,基本就能定位。
【免费下载链接】chilloutmix_NiPrunedFp32Fix项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考