chilloutmix 模型格式转换完整指南:3 步把 .bin 权重跑进 ONNX 或 Safetensors
【免费下载链接】chilloutmix_NiPrunedFp32Fix项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix
chilloutmix_NiPrunedFp32Fix 是一个 Stable Diffusion 文生图模型,里面三个组件的权重都是 PyTorch 的 .bin 格式。如果你的目标环境只认 ONNX 或 Safetensors,那就得先做一次 chilloutmix 模型格式转换:要么 PyTorch 转 ONNX,要么 PyTorch 转 Safetensors。选好后照着步骤走就行,最容易踩的两个坑和自救方法我也会提前写出来。
🔍 先选格式再动手:三种格式各适合谁
先看看你手里有什么。这套模型由三个组件拼成:text_encoder/是 CLIP 文本编码器,负责把你的提示词变成数字;unet/是核心的去噪网络;vae/是潜空间解码器,负责还原出最终像素。每个目录下的config.json记录结构参数(通道数、层类型、隐层维度等),.bin文件则装着权重本身——config 是图纸,bin 是零件。
三种候选格式的差异:
- PyTorch(.bin):你原本就有的格式。微调、本地开发都靠它,生态最成熟,不急着部署就不用动。缺点是 .bin 走 pickle 序列化,理论上存在代码执行风险,不太适合把权重挂到公开平台。
- ONNX:跨框架的中间表示(可以理解成"通用拼图说明书"),导出一次后就能在 ONNX Runtime 等非 PyTorch 运行时上跑,还能再喂给 TensorRT 这类优化工具,适合跨平台部署和推理加速。
- Safetensors:装的内容和 .bin 一样(纯权重,没有计算图),但格式本身不允许执行代码,加载更安全,还支持内存映射、读取更快。生产环境和公开分发建议选它,理由就两条:安全、快。
一句话建议:部署到别的设备选 ONNX;要发布、要上生产选 Safetensors;还要继续微调就留着 .bin 别动。
⚙️ PyTorch 转 ONNX 实操:5 分钟导出 unet.onnx
ONNX 是按"单张计算图"导出的,这套模型里 UNet 分量最重,所以先拿它开刀。先装依赖、克隆仓库:
pip install torch onnx diffusers transformers git clone https://gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix再用 diffusers 加载、导出。注意下面三个示例输入的尺寸,必须和unet/config.json里的结构对得上:
from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained( "./chilloutmix_NiPrunedFp32Fix", torch_dtype=torch.float32, safety_checker=None, # 检查器用不到,跳过省内存 ) unet = pipe.unet unet.eval() # 尺寸取自 config.json:输入 4 通道、64x64 潜空间;文本侧 77 个 token x 768 维 dummy_latents = torch.randn(1, 4, 64, 64) dummy_timestep = torch.tensor([10]) dummy_prompt = torch.randn(1, 77, 768) torch.onnx.export( unet, (dummy_latents, dummy_timestep, dummy_prompt), "unet.onnx", opset_version=14, # 算子集版本,14 对旧版运行时兼容性最好 do_constant_folding=True, # 把常量计算提前折进图里,推理更快 )两个细节值得懂:opset_version是 ONNX 算子"词汇表"的版本号,越低支持的运行时越多,14 是稳妥值;do_constant_folding是常量折叠,意思是把导出时就能算死的部分直接算好塞进图里。跑完得到unet.onnx,文本编码器同理,把pipe.text_encoder和 token 输入传进去再导一遍即可。
⚡ PyTorch 转 Safetensors:一个循环转完三个组件
Safetensors 只换权重的"容器",不碰结构,是三条路里最快的一条。装好库,循环写盘:
pip install safetensorsimport torch from safetensors.torch import save_file pairs = [ ("unet/diffusion_pytorch_model.bin", "unet/diffusion_pytorch_model.safetensors"), ("text_encoder/pytorch_model.bin", "text_encoder/pytorch_model.safetensors"), ("vae/diffusion_pytorch_model.bin", "vae/diffusion_pytorch_model.safetensors"), ] for old, new in pairs: save_file(torch.load(old, map_location="cpu"), new)map_location="cpu"这一手让权重直接进内存加载,不占显存,纯 CPU 的机器也不会翻车。.safetensors落盘后,diffusers 加载时会优先认它,之后既更快也更安全。
🚑 转换翻车自救:两类问题对症排查
内存不够时怎么转
UNet 的 .bin 有好几个 GB,导出时要同时持有原权重和新图,内存需求大致翻倍。三个办法:
- 加载时加
torch_dtype=torch.float16,精度减半、内存减半,Safetensors 转换和快速验证场景够用; - ONNX 导出用 float32 更稳,内存吃紧就别硬扛,换台内存大的机器或临时加 swap;
- 不必整条 pipeline 一起加载,按组件单独转换,比如只加载 UNet 子目录,转完一个再转下一个。
配置不匹配:config.json 前后必须一致
原则只有一条:权重文件可以换,config.json不能动。转换前后的unet/、text_encoder/、vae/下的原始 config 保持原样——Safetensors 和 ONNX 改的只是权重的存放形式,结构参数一个字都不用变。谁要是顺手换过别的模型的 config,加载时就会报一串形状不匹配。另外看一眼model_index.json:你只转了部分组件的话,没转的组件要原封不动,文件里的指针不能悬空。
✅ 跑通验证才算完:验证模型是否转坏了
别看文件大小,看输出。转换完成后跑一次短推理:
from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained( "./chilloutmix_NiPrunedFp32Fix", torch_dtype=torch.float16, safety_checker=None, ) img = pipe("anime girl walking through a rainy neon street, cinematic lighting").images[0] img.save("check_output.png")图能出、人物风格符合这个模型的 chillout 质感,说明权重没被转坏。如果还导了 ONNX,再用 onnxruntime 做次轻校验:ort.InferenceSession("unet.onnx")能顺利建出会话不报错,图就是可用的。到这里,这次格式转换才算真正收尾。
【免费下载链接】chilloutmix_NiPrunedFp32Fix项目地址: https://ai.gitcode.com/hf_mirrors/emilianJR/chilloutmix_NiPrunedFp32Fix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考