从文件到块: 提高 Hugging Face 存储效率

Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间,Safetensor 文件约 1 GB,而 GGUF 文件甚至可能超过 8 GB。设想一下,仅仅修改 GGUF 文件中的一行元数据,就需要等待数 GB 大小的文件重新上传。除了耗费用户时间和传输成本外,Git LFS 还需要保存文件的两个完整版本,这进一步增加了存储开销。

  • Git LFS 仓库https://hf.co/docs/hub/en/repositories-getting-started#requirements

  • 30 PB 的模型、数据集和 Spaceshttps://hf.co/spaces/xet-team/lfs-analysis

下图展示了 Hub 上各类仓库 (模型、数据集和 Spaces) 中 LFS 存储容量在 2022 年 3 月至 2024 年 9 月期间的增长趋势:

LFS Storage Growth

Hugging Face 的 Xet 团队正在采用一种创新的存储方案: 将文件分块存储。通过只传输发生变化的数据块,我们可以显著提升存储效率和迭代速度,同时确保用户能可靠地访问不断演进的数据集和模型。下面让我们详细了解其工作原理。

基于内容的分块原理

我们采用的分块方法称为基于内容的分块 (Content-Defined Chunking,CDC)。与将文件视为不可分割的整体不同,CDC 根据文件内容本身来确定边界,将文件划分为大小可变的数据块。为了计算这些块的边界,我们使用滚动哈希算法来扫描文件的字节序列。https://en.wikipedia.org/wiki/Rolling_hash

让我们通过一个简单的例子来说明:

transformerstransformerstransformers

这里我们用文本来演示,但实际上这个过程适用于任何字节序列。

滚动哈希算法通过在数据上滑动固定大小的窗口来计算哈希值。比如,当窗口长度为 4 时,算法会依次计算 tranransansf 等字符序列的哈希值,直到处理完整个文件。

当某个位置的哈希值满足预设条件时,就会在该处设置块的边界。例如,可以设置如下条件:

hash(data) % 2^12 == 0

如果序列 mers 的哈希值满足这个条件,那么文件就会被分成三个块:

transformers | transformers | transformers

系统会计算这些块的哈希值,建立块哈希值到实际内容的映射,并最终将它们存储在基于内容寻址的存储系统 (Content-Addressed Storage,CAS) 中。由于这三个块完全相同,CAS 只需要存储一个块的实际内容,从而自动实现了数据去重。🪄

处理插入和删除操作

当文件内容发生变化时,CDC 的优势就体现出来了: 它能够精确定位变化的部分,高效处理插入和删除操作。让我们看一个具体示例,在原文件中插入 super 后:

transformerstransformerssupertransformers

使用相同的边界条件重新应用滚动哈希算法,新的分块结果如下:

transformers | transformers | supertransformers

前两个块的内容系统中已经存在,无需重新存储。只有 supertransformers 是新的数据块,因此保存这个更新版本只需要上传和存储这一个新块即可。

为了验证这种优化方案在实际应用中的效果,我们将 XetHub 上基于 CDC 的存储实现与 Git LFS 进行了对比测试。在三个迭代开发场景中,我们发现存储和传输性能始终提升了 50%。其中一个典型案例是CORD-19 数据集——这是一个在 2020 年至 2022 年间持续更新的 COVID-19 研究论文集合,共有 50 次增量更新。下表对比了两种存储方案的性能指标:https://ai2-semanticscholar-cord-19.s3-us-west-2.amazonaws.com/historical_releases.html

指标基于 Git LFS 的仓库基于 Xet 的仓库
平均下载时间51 分钟19 分钟
平均上传时间47 分钟24 分钟
存储占用8.9 GB3.52 GB

通过只传输和保存变化的数据块,再结合改进的压缩算法和优化的网络请求,基于 Xet 的 CDC 方案显著缩短了上传和下载时间,同时大幅降低了存储多个版本所需的空间。想深入了解测试细节?请查看我们的完整基准测试报告。https://xethub.com/blog/benchmarking-the-modern-development-experience

CDC 技术对 Hub 的影响

那么,CDC 如何应用于 Hugging Face Hub 上的各类文件呢?为了直观展示 CDC 在文件集合上的存储节省潜力,我们开发了一个简单的重复数据删除估算工具。我们用这个工具分析了openai-community/gpt2仓库中 model.safetensors 文件的两个版本,得到了以下结果:

  • 重复数据删除估算工具https://github.com/huggingface/dedupe_estimator

  • openai-community/gpt2https://hf.co/openai-community/gpt2

Safetensors Deduplication

图中的绿色区域表示两个版本之间内容的重叠部分,这意味着我们可以在单个文件内部以及不同版本之间进行有效的数据去重。


Git LFS 存储占用Xet 存储占用
版本 1664 MB509 MB
版本 2548 MB136 MB
总计1.2 GB645 MB

在这个案例中,采用基于 Xet 的存储方案不仅大大缩短了第二个版本的上传和下载时间,还将总存储空间减少了 53%。通过进一步的压缩优化,我们预计还能额外节省 10% 的空间。

我们对 Hub 上的仓库进行的初步研究显示,CDC 技术对某些类型的数据特别有效。例如,微调模型通常只修改部分参数,大部分模型权重在不同版本间保持不变,这使它们非常适合使用数据去重技术。同样,模型检查点文件也是理想的应用场景,因为相邻检查点之间的变化往往很小。这两类文件都展现出 30-85% 的去重比率。考虑到 PyTorch 模型检查点在 Hub 上占用了约 200 TB 的存储空间,如果能达到 50% 的去重率,我们可以立即节省 100 TB 的存储空间,并在未来每月减少 7-8 TB 的增长。

除了降低存储成本,块级数据去重还能显著提升数据传输效率,因为只需要传输实际发生变化的数据块。这对于需要频繁处理多个模型版本或数据集版本的团队来说尤其重要,可以大大减少等待时间,提高工作效率。

目前,我们团队正在开发 Hub 的基于 Xet 存储的概念验证系统,计划在 2025 年初推出首批基于 Xet 的仓库。欢迎关注我们的团队,了解更多技术进展。我们将持续分享在全球分布式仓库扩展 CDC、优化网络性能、保护数据隐私以及并行化分块算法等方面的研究成果。

https://hf.co/xet-team


英文原文:https://hf.co/blog/from-files-to-chunks

原文作者: Jared Sulzdorf, Ann Huang

译者: smartisan

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982074.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大型语言模型演变之路:从Transformer到DeepSeek-R1

大型语言模型的崛起被认为是人工智能领域的一次革命,从2017年Transformer架构的引入开始,到2025年DeepSeek-R1的推出,每一步都在不断改变着人机交互的方式,推动着学术界与产业界的深度融合。 1. Transformer的引领(201…

设计模式(7)——SOLID原则之接口隔离原则

设计模式(7)——SOLID原则之接口隔离原则 概念示例总结 概念 客户端不应被强迫依赖于其不使用的方法。这句话的意思是指尽量缩小接口的范围,使得客户端的类不必实现其不需要的行为。 根据接口隔离原则,你必须将“臃肿”的方法拆…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准,方便小学生书法和练字。Word,Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时,如果没有专用模板、奇奇怪怪的插件,使用起来会碰到各种问题。比如,Word里面用…

C++学习之路,从0到精通的征途:入门基础

目录 一.C的第一个程序 二.命名空间 1.namespace的价值 2.命名空间的定义 3.命名空间使用 三.C的输入与输出 1.<iostream> 2.流 3.std(standard) 四.缺省参数 1.缺省参数的定义 2.全缺省/半缺省 3.声明与定义 ​五.函数重载 1.参数个数不同 2.参数类型不…

rust学习笔记12-hashmap与1. 两数之和

rust集合中也有hashmap&#xff0c;昨天已经提到过&#xff0c;学过java同学再熟悉不过了&#xff0c;一道经典面试题问hashmap在java1.8的实现原理&#xff0c;数组哈希表红黑树&#xff0c;rust中hashmap在功能上和java一样&#xff0c;但实现上有很大差别&#xff0c;它的基…

通过多线程同时获取H264和H265码流

目录 一.RV1126 VI采集摄像头数据并同时编码H264、H265的大概流程​编辑​编辑 1.1初始化VI模块&#xff1a; 1.2H264、H265的VENC模块初始化&#xff1a; 1.3VI分别绑定H264的VENC层和H265的VENC层&#xff1a; ​​​​​​​1.4开启H264线程采集H264的VENC数据&#xff…

SpringBoot为什么要禁止循环依赖?

大家好&#xff0c;我是锋哥。今天分享关于【SpringBoot为什么要禁止循环依赖?】面试题。希望对大家有帮助&#xff1b; SpringBoot为什么要禁止循环依赖? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 和 Spring 框架之所以要避免循环依赖&#xf…

The Rust Programming Language 学习 (三)

所有权 所有权&#xff08;系统&#xff09;是 Rust 最为与众不同的特性&#xff0c;它让 Rust 无需垃圾回收器&#xff08;garbage collector&#xff09;即可保证内存安全。因此&#xff0c;理解 Rust 中所有权的运作方式非常重要。 这里是非常重非常重的一个知识点,这里一…

基于物联网技术的电动车防盗系统设计(论文+源码)

1总体设计 本课题为基于物联网技术的电动车防盗系统&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;其采用STM32F103单片机为控制器&#xff0c;通过NEO-6M实现GPS定位功能&#xff0c;通过红外传感器检测电瓶是否离开位&#xff0c;通过Air202 NBIOT模块将当前的数…

雷池WAF的为什么选择基于Docker

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点&#xff1a; 容器&#xff1a;Docker 使用容器来封装应用程序及其依赖项&#xff0c;使其能够在任何环境中都能…

解决docker认证问题 failed to authorize: failed to fetch oauth token

报错信息[bash1]解决方案 全局代理打开“buildkit”: false &#xff0c;见[图1] [bash1] >docker build -t ffpg . [] Building 71.8s (3/3) FINISHED docker:desktop-linux> [internal] load bui…

LINUX网络基础 [一] - 初识网络,理解网络协议

目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型&#xff08;理论标准&#xff09; …

【Docker】容器安全之非root用户运行

【Docker】容器安全之非root用户运行 1. 场景2. 原 Dockerfile 内容3. 整改结果4. 非 root 用户带来的潜在问题4.1 文件夹读写权限异常4.2 验证文件夹权限 1. 场景 最近有个项目要交付&#xff0c;第三方测试对项目源码扫描后发现一个问题&#xff0c;服务的 Dockerfile 都未指…

亚马逊云科技Marketplace(中国区)上架专业服务产品, “云生态连接器”价值凸显

近日&#xff0c;由西云数据运营的亚马逊云科技Marketplace&#xff08;中国区&#xff09;正式支持专业服务产品。此次发布将大幅简化企业对云专业服务的采购流程&#xff0c;实现云软件从规划、部署到支持的全生命周期管理&#xff0c;同时也为合作伙伴提供了更多的销售机会。…

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件&#xff0c;找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…

HCIA—IP路由静态

一、概念及作用 1、概念&#xff1a;IP路由是指在IP网络中&#xff0c;数据从源节点到目的节点所经过的路径选择和数据转发的过程。 2、作用 ①实现网络互联&#xff1a;使不同网段的设备能够相互通信&#xff0c;构建大规模的互联网络 ②优化网络拓扑&#xff1a;根据网络…

【计算机网络入门】初学计算机网络(十一)重要

目录 1. CIDR无分类编址 1.1 CIDR的子网划分 1.1.1 定长子网划分 1.1.2 变长子网划分 2. 路由聚合 2.1 最长前缀匹配原则 3. 网络地址转换NAT 3.1 端口号 3.2 IP地址不够用&#xff1f; 3.3 公网IP和内网IP 3.4 NAT作用 4. ARP协议 4.1 如何利用IP地址找到MAC地址…

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具&#xff0c;便于在客户端软件中…

【Linux跬步积累】—— 线程池详解(有源代码)

文章目录 一、如何实现一个线程1、基本结构2、实现成员函数3、演示4、代码总汇Thread.hppMain.cc 二、如何封装线程池1、设计成员变量2、构造函数与析构函数3、初始化4、启动与回收5、主线程放入任务6、子线程读取任务7、终止线程池 三、测试四、线程池总代码1、ThreadPool.hpp…

【Linux】自定协议和序列化与反序列化

目录 一、序列化与反序列化概念 二、自定协议实现一个加法网络计算器 &#xff08;一&#xff09;TCP如何保证接收方的接收到数据是完整性呢&#xff1f; &#xff08;二&#xff09;自定义协议 &#xff08;三&#xff09;自定义协议的实现 1、基础类 2、序列化与反序列…