当前位置: 首页 > article >正文

手把手教你玩转模型格式转换:把Stable Diffusion的.ckpt变成.safetensors(附完整代码)

从.ckpt到.safetensorsStable Diffusion模型格式转换实战指南当你从Civitai下载了一个心仪的Stable Diffusion模型却发现它是.ckpt格式时是否曾为加载速度慢和潜在安全风险而困扰本文将带你深入理解不同模型格式的特性并手把手教你如何将.ckpt转换为更高效、更安全的.safetensors格式。1. 深度学习模型格式全景解析在开始转换前我们需要清楚了解各种模型格式的特点和适用场景。不同格式的设计初衷和内部结构差异直接影响着模型的使用体验和安全性。1.1 主流模型格式对比格式开发者包含内容加载速度安全性典型使用场景.ckptPyTorch Lightning模型参数优化器状态训练元数据中等较低PyTorch Lightning训练恢复.safetensorsHugging Face仅模型权重快高生产环境部署.pthPyTorch模型结构参数或仅state_dict中等中等PyTorch模型保存.bin通用原始二进制数据依赖实现低自定义权重存储关键差异点.ckpt文件通常比.safetensors大30%-50%因为它包含了训练状态信息.safetensors的加载速度可比.ckpt快2-3倍尤其在大型模型上安全性方面.safetensors设计上就避免了任意代码执行的风险1.2 为什么推荐safetensorsHugging Face大力推广.safetensors格式并非偶然。这种格式具有三大核心优势安全性不会像pickle-based格式(.ckpt/.pth)那样可能执行恶意代码效率采用内存映射技术实现近乎瞬时的加载兼容性在Diffusers库和ComfyUI中都有原生支持提示即使用户不关心安全因素仅从加载速度考虑转换到safetensors也值得投入时间2. 转换前的准备工作在开始转换前需要确保环境配置正确并理解原始模型的结构特点。2.1 环境配置清单转换工作需要在Python环境中进行以下是必需的软件包及安装命令pip install torch safetensors diffusers transformers版本要求PyTorch ≥ 1.12safetensors ≥ 0.3.1diffusers (最新稳定版)2.2 模型结构分析典型的Stable Diffusion .ckpt文件通常包含以下关键部分{ state_dict: { model.diffusion_model.input_blocks.0.0.weight: ..., model.diffusion_model.input_blocks.0.0.bias: ..., # 数百个类似的键 }, epoch: 100, global_step: 50000, pytorch-lightning_version: 1.6.5, # 其他训练元数据 }需要特别注意的是我们只需要state_dict部分进行转换某些自定义模型可能包含特殊的层结构模型精度(fp16/fp32)会影响转换后的文件大小3. 核心转换流程详解现在进入最关键的转换操作环节。我们将分步骤实现从.ckpt到.safetensors的安全转换。3.1 基础转换代码以下是完整的转换脚本保存为convert_ckpt_to_safetensors.pyimport torch import safetensors.torch from tqdm import tqdm def convert_ckpt_to_safetensors(ckpt_path, safetensors_path, strictTrue): 将.ckpt文件转换为.safetensors格式 参数: ckpt_path: 输入的.ckpt文件路径 safetensors_path: 输出的.safetensors文件路径 strict: 是否严格检查所有键值 # 加载原始ckpt文件 print(f正在加载 {ckpt_path}...) ckpt_data torch.load(ckpt_path, map_locationcpu) # 提取state_dict state_dict ckpt_data[state_dict] if state_dict in ckpt_data else ckpt_data # 验证数据完整性 print(验证模型权重...) for k, v in tqdm(state_dict.items()): if torch.isnan(v).any(): raise ValueError(f发现NaN值在 {k}) if torch.isinf(v).any(): raise ValueError(f发现Inf值在 {k}) # 保存为safetensors格式 print(f正在保存到 {safetensors_path}...) safetensors.torch.save_file(state_dict, safetensors_path) print(转换完成) if __name__ __main__: import argparse parser argparse.ArgumentParser() parser.add_argument(--ckpt, typestr, requiredTrue, help输入.ckpt文件路径) parser.add_argument(--safetensors, typestr, requiredTrue, help输出.safetensors文件路径) args parser.parse_args() convert_ckpt_to_safetensors(args.ckpt, args.safetensors)使用方式python convert_ckpt_to_safetensors.py --ckpt input_model.ckpt --safetensors output_model.safetensors3.2 高级转换技巧针对特殊场景你可能需要以下增强功能处理混合精度模型def convert_with_precision(ckpt_path, safetensors_path, target_dtypetorch.float16): ckpt_data torch.load(ckpt_path, map_locationcpu) state_dict ckpt_data.get(state_dict, ckpt_data) # 转换精度 converted_state_dict { k: v.to(target_dtype) if v.is_floating_point() else v for k, v in state_dict.items() } safetensors.torch.save_file(converted_state_dict, safetensors_path)保留关键元数据def save_with_metadata(state_dict, output_path, metadataNone): if metadata is None: metadata {} # 添加默认元数据 metadata.update({ format: safetensors, converted_from: ckpt, timestamp: datetime.now().isoformat() }) safetensors.torch.save_file( state_dict, output_path, metadatametadata )4. 转换后的验证与调试转换完成后必须验证新生成的.safetensors文件是否可用且效果与原始模型一致。4.1 基础验证方法文件完整性检查python -c import safetensors; print(safetensors.torch.check_file(output_model.safetensors))权重对比脚本def compare_models(ckpt_path, safetensors_path): ckpt_data torch.load(ckpt_path, map_locationcpu) ckpt_sd ckpt_data.get(state_dict, ckpt_data) sf_sd safetensors.torch.load_file(safetensors_path) # 检查键是否一致 assert set(ckpt_sd.keys()) set(sf_sd.keys()), 键不匹配 # 检查值是否一致 for k in ckpt_sd: if not torch.allclose(ckpt_sd[k], sf_sd[k], atol1e-6): print(f差异超过阈值在 {k}) return False return True4.2 实际生成测试在WebUI中测试转换后的模型将.safetensors文件放入models/Stable-diffusion/目录在WebUI界面选择该模型使用相同的提示词和参数生成图像比较与原始.ckpt模型的输出差异典型测试提示词portrait of a wizard, intricate robes, glowing staff, dramatic lighting, highly detailed, digital painting, artstation, concept art, smooth注意细微的差异可能是由于精度转换导致的但如果图像主题或风格发生显著变化则表明转换可能有问题5. 常见问题解决方案在实际操作中你可能会遇到以下典型问题5.1 内存不足错误症状RuntimeError: CUDA out of memory解决方案使用map_locationcpu加载模型分批处理大型模型from collections import OrderedDict def convert_large_model(ckpt_path, safetensors_path, chunk_size1000): ckpt_data torch.load(ckpt_path, map_locationcpu) state_dict ckpt_data.get(state_dict, ckpt_data) # 分批处理 chunks [dict(list(state_dict.items())[i:ichunk_size]) for i in range(0, len(state_dict), chunk_size)] # 保存第一个chunk并追加其余 safetensors.torch.save_file(chunks[0], safetensors_path) for chunk in chunks[1:]: safetensors.torch.save_file(chunk, safetensors_path, appendTrue)5.2 键值不匹配问题症状Error loading state_dict: Missing keys, unexpected keys调试方法def analyze_keys(ckpt_path, safetensors_path): ckpt_data torch.load(ckpt_path, map_locationcpu) ckpt_keys set(ckpt_data.get(state_dict, ckpt_data).keys()) sf_keys set(safetensors.torch.load_file(safetensors_path).keys()) print(仅在ckpt中存在的键:, ckpt_keys - sf_keys) print(仅在safetensors中存在的键:, sf_keys - ckpt_keys)5.3 模型性能调优转换后如果发现推理速度不理想可以尝试优化精度# 转换为fp16 model model.half()启用内存高效加载from diffusers import StableDiffusionPipeline pipe StableDiffusionPipeline.from_pretrained( path/to/model.safetensors, torch_dtypetorch.float16, use_safetensorsTrue, low_cpu_mem_usageTrue )6. 高级应用场景掌握了基础转换后可以进一步优化工作流程6.1 批量转换脚本import glob from pathlib import Path def batch_convert(input_dir, output_dir): input_dir Path(input_dir) output_dir Path(output_dir) output_dir.mkdir(exist_okTrue) for ckpt_file in input_dir.glob(*.ckpt): output_path output_dir / f{ckpt_file.stem}.safetensors convert_ckpt_to_safetensors(str(ckpt_file), str(output_path)) print(f转换完成: {ckpt_file.name} - {output_path.name})6.2 与Git LFS集成大型模型文件适合用Git LFS管理# 初始化LFS git lfs install # 跟踪safetensors文件 git lfs track *.safetensors # 常规git操作 git add .gitattributes git add models/ git commit -m 添加转换后的模型6.3 模型压缩技巧def compress_model(input_path, output_path, compression_level9): state_dict safetensors.torch.load_file(input_path) # 使用量化压缩 compressed_state_dict { k: v.to(torch.float16) if v.is_floating_point() else v for k, v in state_dict.items() } safetensors.torch.save_file( compressed_state_dict, output_path, compression{algorithm: zstd, level: compression_level} )在实际项目中我发现最常遇到的问题不是转换失败而是转换后模型的行为出现微妙差异。这通常是由于精度损失或某些特殊层处理不当导致的。建议在转换关键模型时保留原始.ckpt文件作为备份直到完全验证新格式的可靠性。

相关文章:

手把手教你玩转模型格式转换:把Stable Diffusion的.ckpt变成.safetensors(附完整代码)

从.ckpt到.safetensors:Stable Diffusion模型格式转换实战指南 当你从Civitai下载了一个心仪的Stable Diffusion模型,却发现它是.ckpt格式时,是否曾为加载速度慢和潜在安全风险而困扰?本文将带你深入理解不同模型格式的特性&#…...

so-vits-svc 4.1终极实战指南:从零搭建专业歌声转换系统

so-vits-svc 4.1终极实战指南:从零搭建专业歌声转换系统 【免费下载链接】so-vits-svc SoftVC VITS Singing Voice Conversion 项目地址: https://gitcode.com/gh_mirrors/so/so-vits-svc 在人工智能语音合成领域,歌声转换技术正以前所未有的速度…...

3步掌握AI绘画模型训练:kohya_ss图形化界面终极指南

3步掌握AI绘画模型训练:kohya_ss图形化界面终极指南 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss 还在为复杂的AI模型训练命令行而头疼吗?kohya_ss为你带来了革命性的解决方案!这个强大的A…...

别再死记硬背了!用Java代码和动画图解,5分钟搞懂基数排序的LSD和MSD

基数排序可视化:用动画和Java代码拆解LSD与MSD的奥秘 当你第一次听说基数排序时,脑海中是否浮现出一堆数字在某种神秘规则下自动排列的场景?作为非比较型排序算法中的佼佼者,基数排序通过巧妙的"分桶"策略,让…...

ContentClaw:基于AI与事实核查的自动化内容生成引擎实践

1. 内容整体设计与思路拆解如果你正在运营一个内容网站、博客,或者为某个CMS系统(比如WordPress、Strapi)寻找内容填充方案,那你肯定对“内容生成”这件事又爱又恨。爱的是,AI确实能极大提升效率;恨的是&am…...

2025年年度总结之25.教育之德智

教育之德智 严复对传统道德条目的肯定至晚年变得更为强烈,1921年他在死前将一生经历总结为以下的遗言,供后代子孙参考: 中国必不灭,旧法可损益,而必不可叛。新知无尽,真理无穷,人生一世&#…...

手把手教你用Python实现GFP帧的CRC-16/XMODEM校验与加扰(附完整代码)

Python实战:GFP帧的CRC-16/XMODEM校验与加扰技术解析 在网络协议开发中,GFP(通用成帧规程)作为高效封装各类数据流的标准协议,其帧结构的校验与加扰机制是确保数据传输可靠性的关键环节。本文将深入探讨如何用Python实…...

基于Python与Leaflet的旅行足迹可视化工具:从数据聚合到交互地图生成

1. 项目概述:一个旅行足迹可视化工具最近在整理过去几年的旅行照片和行程记录,发现了一个痛点:虽然手机相册里有海量的照片和定位信息,但很难直观地看到自己到底去过哪些地方,行程轨迹是怎样的。手动在地图上标记不仅耗…...

如何在macOS上免费运行Windows程序?Whisky的终极指南

如何在macOS上免费运行Windows程序?Whisky的终极指南 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 对于macOS用户来说,运行Windows程序一直是个痛点。无论是…...

10个Windows Terminal命令行参数技巧:让你的终端启动效率提升10倍!

10个Windows Terminal命令行参数技巧:让你的终端启动效率提升10倍! 【免费下载链接】terminal The new Windows Terminal and the original Windows console host, all in the same place! 项目地址: https://gitcode.com/GitHub_Trending/term/termin…...

Calibre中文路径乱码终结者:3分钟让你的电子书重获“姓名权“

Calibre中文路径乱码终结者:3分钟让你的电子书重获"姓名权" 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名…...

管家婆辉煌ERP如何设置职员操作权限?

使用管家婆ERP软件经营日常业务时,企业不同岗位的人员使用同一套软件但由于职位、工作范围不同,人员所需要知道的公司资料也就会不尽相同,该如何设置他们的权限呢?今天来和小编一起学习下管家婆辉煌ERP如何设置职员操作权限吧&…...

Go语言构建轻量级反向代理Kraken:从核心原理到生产部署

1. 项目概述:一个轻量级、高性能的Web应用代理工具最近在折腾一些个人项目,经常需要在本地开发环境和远程服务器之间进行调试和测试。传统的方案要么太重,要么配置繁琐,要么性能堪忧。直到我发现了luisabwk/kraken这个项目&#x…...

基于OpenAssistantGPT SDK快速构建智能对话机器人:架构、工具与实战

1. 项目概述:一个能让你快速“组装”智能对话机器人的SDK如果你正在开发一个需要集成对话AI功能的应用,比如一个客服系统、一个智能助手,或者一个带有聊天界面的工具,那么你大概率会遇到一个共同的烦恼:从零开始对接大…...

kirolink:基于Go的AWS SSO令牌代理,无缝桥接Claude Code与内部CodeWhisperer

1. 项目概述与核心价值如果你和我一样,日常开发中重度依赖像 Claude Code 这样的 AI 编程助手,但同时又因为公司或项目使用了 Kiro 这类基于 AWS SSO 的内部身份认证平台而头疼,那么kirolink这个工具的出现,绝对能让你眼前一亮。简…...

AI智能体记忆系统构建:从向量检索到LangChain集成实践

1. 项目概述:为什么我们需要为AI智能体构建“记忆宫殿”?最近在折腾AI智能体(Agent)开发的朋友,估计都遇到过同一个头疼的问题:你精心设计的智能体,在一次对话中表现得像个天才,能完…...

漫画数字阅读革命:Kindle Comic Converter完整使用指南

漫画数字阅读革命:Kindle Comic Converter完整使用指南 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc 在数字阅读时代,漫画爱…...

AISMM模型实施倒计时预警:政策合规收紧+AI审计常态化下,未完成成熟度L3认证的企业将面临3项运营风控升级

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与运营效率提升 AISMM(Artificial Intelligence–Supported Service Management Model)是一种融合AI驱动决策、服务流程建模与实时反馈闭环的智能运维管理框架。它通过…...

别再被销售坑了!手把手教你用Java搞定华夏T83相机的LED屏与语音播报(附完整Demo)

华夏T83相机LED屏与语音播报的Java实战指南 去年接手一个停车场项目时,遇到了华夏T83相机的LED屏控制问题。销售团队只负责安装,对二次开发一问三不知。经过两周的摸索,我发现只需更换一块几十元的主板,配合Java代码就能实现完全自…...

FanControl风扇控制软件:3步完成Windows系统散热优化配置

FanControl风扇控制软件:3步完成Windows系统散热优化配置 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…...

用MATLAB复现经典SEIR模型:从零开始搭建你的第一个疫情传播仿真(附完整代码)

用MATLAB构建SEIR模型:零基础实现疫情传播动态仿真 当第一次看到传染病传播曲线的陡峭上升时,我被数学模型的预测能力震撼了。作为流行病学研究的基础工具,SEIR模型用简洁的微分方程揭示了病毒扩散的内在规律。本文将带你从零开始&#xff0c…...

终极免费方案:用NoFences彻底解决你的Windows桌面混乱问题

终极免费方案:用NoFences彻底解决你的Windows桌面混乱问题 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为满屏的桌面图标而头疼吗?每次找文件都…...

Obsidian Tasks:5步掌握任务优先级管理,让重要事项不再遗漏

Obsidian Tasks:5步掌握任务优先级管理,让重要事项不再遗漏 【免费下载链接】obsidian-tasks Task management for the Obsidian knowledge base. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-tasks Obsidian Tasks 是 Obsidian 知识库…...

基于Next.js与GitHub Pages构建个人开发者门户:从SSG到CI/CD全流程实践

1. 项目概述:一个开发者个人门户的诞生在技术社区里,一个以自己名字命名的.github.io仓库,往往不仅仅是一个静态网站,它更像是一个开发者的数字名片、技术博客、项目集散地,甚至是一个个人品牌的线上总部。今天要聊的这…...

收藏!小白程序员轻松入门大模型:6步解锁AI Agent开发全攻略

本文提供AI大模型应用开发的入门路线图,分为六步:掌握大模型基础与核心技术(如RAG、Prompt工程);提升Python、API调用等开发基础;实践智能问答、知识库等应用场景开发;学习项目落地全流程&#…...

基于AI与双级缓存的新闻聚合器:从架构设计到工程实践

1. 项目概述:一个只传递好消息的AI新闻聚合器最近在做一个挺有意思的Side Project,起因是受够了每天被各种负面新闻轰炸。不知道你有没有同感,一打开新闻App,满屏都是冲突、灾难和让人焦虑的标题党。这不仅仅是个人感受&#xff0…...

Temu在韩国提速“火箭配送”:当日达背后,跨境物流的护城河正在变深

韩国电商市场正在成为全球平台最密集的试验场。Coupang的“火箭配送”用十年时间教育了韩国消费者对配送时效的期待值,而现在,Temu决定在这个已经被拉高的标准线上继续加注。近日,Temu正式在韩国市场推出同名“火箭配送”服务,首尔…...

VisualCppRedist AIO:Windows系统运行库完整解决方案深度指南

VisualCppRedist AIO:Windows系统运行库完整解决方案深度指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist VisualCppRedist AIO是Windows系统必备…...

利用 Taotoken 的模型广场为不同 Agent 工作流选择合适的底层模型

利用 Taotoken 的模型广场为不同 Agent 工作流选择合适的底层模型 在构建复杂的 AI Agent 工作流时,一个常见的挑战是如何为规划、代码生成、逻辑推理等不同的子任务匹配合适的底层模型。不同的任务对模型的能力、响应速度和成本敏感度要求各异。Taotoken 的模型广…...

WeChatMsg终极指南:如何安全备份并深度分析你的微信聊天记录

WeChatMsg终极指南:如何安全备份并深度分析你的微信聊天记录 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...