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

pth的模型格式怎么变成SafeTensors了?

文章目录

  • 背景
  • 传统模型格式的安全隐患
  • 效率与资源瓶颈
  • 跨框架兼容性限制
  • Hugging Face 的解决方案:SafeTensors
  • 行业与社区的推动
  • SafeTensors 的意义
  • 总结

背景

最近要找一些适合embedding的模型,在huggingface模型库上看到一些排名比较靠前的,准备down下来,然后通过ollama在本地启动,一看格式怎么是SafeTensors? ollama好像不支持啊,因此先研究以下这个格式的由来。
Hugging Face 推出的 SafeTensors 格式是为了解决传统模型序列化方法(如 PyTorch 的 .pt/.pth 或 TensorFlow 的 .ckpt)在安全性、效率和跨框架兼容性等方面的痛点。其背景可以从以下几个关键问题和技术需求来理解:


传统模型格式的安全隐患

问题:反序列化漏洞
• PyTorch 默认使用 pickle 库序列化模型,而 pickle 在反序列化时会执行任意代码。攻击者可以通过篡改模型文件注入恶意代码,导致用户加载模型时触发攻击(如远程代码执行、数据泄露等)。

• 案例:2022 年发现多个 PyTorch 模型因 pickle 漏洞被恶意利用(CVE 编号 CVE-2022-8926)。

• 这一漏洞在开源社区和模型共享场景中尤其危险,用户无法信任来源不明的模型文件。

安全需求
• 需要一种仅存储张量数据、不执行代码的格式,从根本上消除反序列化攻击的风险。


效率与资源瓶颈

问题:加载速度与内存占用
• 传统格式(如 PyTorch 的 torch.save)在加载时需要将整个文件读入内存,导致大模型加载缓慢且内存占用高。

• 对于边缘设备(如手机、IoT 设备)或低资源环境,传统格式的加载效率成为瓶颈。

效率需求
• 支持零拷贝加载(Zero-copy):直接从磁盘映射张量数据到内存,避免冗余内存复制。

• 分块加载:仅加载部分权重(如大型语言模型的某几层),减少内存压力。


跨框架兼容性限制

问题:框架绑定的模型格式
• PyTorch 的 .pt 和 TensorFlow 的 .ckpt 格式彼此不兼容,导致多框架协作困难。

• 开发者需要为不同框架重复转换模型,增加了维护成本。

兼容性需求
• 定义一种框架无关的标准化格式,支持 PyTorch、TensorFlow、JAX 等多种框架直接加载。


Hugging Face 的解决方案:SafeTensors

为应对上述问题,Hugging Face 设计并开源了 SafeTensors 格式,其核心设计原则包括:
• 安全性优先:仅存储张量数据,不含可执行代码。

• 高效加载:通过内存映射(Memory-mapping)实现零拷贝加载,大幅减少内存占用。

• 跨框架支持:统一格式可被 PyTorch、TensorFlow、JAX 等框架直接读取。

• 轻量化:文件体积更小,传输和存储成本更低。

技术实现
• 数据存储:使用二进制格式存储张量元数据(形状、数据类型)和原始字节。

• 元信息标准化:通过 JSON 头文件记录模型结构信息,支持快速索引。

• 签名验证:可选添加哈希签名,确保文件完整性。


行业与社区的推动

• 开源社区需求:Hugging Face Hub 上托管了数十万个公开模型,用户需要安全可靠的共享方式。

• 企业安全合规:金融、医疗等领域对模型部署有严格的安全要求,传统格式无法满足审计标准。

• 边缘计算兴起:物联网和移动端设备需要轻量、高效的模型格式。


SafeTensors 的意义

• 安全性:消除反序列化漏洞,成为模型分发的安全标准。

• 性能优化:零拷贝加载使百亿参数模型的加载时间从分钟级降至秒级。

• 生态整合:推动多框架协作,简化模型部署流程。

• 行业影响:被 Hugging Face Hub、Stability AI 等平台采纳为默认格式,逐步替代传统方法。


总结

Hugging Face 推出 SafeTensors 的背景是传统模型格式在安全性、效率和兼容性上的严重缺陷。通过设计一种安全、高效、跨框架的标准化格式,它不仅解决了模型共享中的安全风险,还提升了大规模模型部署的效率,成为现代机器学习工程中的重要基础设施。

http://www.xdnf.cn/news/408277.html

相关文章:

  • Matlab 空调温度时延模型的模糊pid控制
  • YOLOv8网络结构
  • 1.10-数据传输格式
  • Java使用POI+反射灵活的控制字段导出Excel
  • MapReduce 的工作原理
  • 数据库分区与分表详解
  • java 中 pojo 的详细讲解
  • BGP练习
  • Java 内存模型(JMM)与内存屏障:原理、实践与性能权衡
  • Python基础:类的深拷贝与浅拷贝-->with语句的使用及三个库:matplotlib基本画图-->pandas之Series创建
  • 用户态到内核态:Linux信号传递的九重门(二)
  • 微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg
  • 使用 DMM 测试 TDR
  • Ai应用部署离不开Docker环境
  • shell脚本实现docker运行镜像挂载
  • 【分享】利用自定义表单,文件摆渡系统实现数据合规与高效流转
  • Spark,hadoop 集群的常用命令
  • 科技快讯 | 字节跳动开源一款Deep Research项目;全球首个氮化镓量子光源芯片发布
  • 如何使用 Winget 命令安装 Microsoft Teams
  • 2.2 微积分的解释
  • Xubuntu系统详解
  • 解决pip安装PyPI默认源速度慢
  • TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议
  • Bash 执行命令的基本流程
  • [Java][Leetcode middle] 121. 买卖股票的最佳时机
  • tensorflow-cpu
  • 9.渐入佳境 -- 套接字的多种可选项
  • 配置yarn模式
  • 使用 gma 绘制汉魏洛阳城
  • 针对面试-mysql篇