善用Git LFS来降低模型文件对磁盘的占用

news/2024/11/9 2:28:31/

将讲一个实际的例子:对于模型文件,动辄就是好几个G,而有的仓库更是高达几十G,拉一个仓库到本地,稍不注意直接磁盘拉满都有可能。
比如:meta-llama-3.1-8b-instruct,拉到本地后发现居然占用了60G,不得了。

还好有Git LFS 这个大文件管理工具,Git LFS 就好像是一个图书馆。图书馆里有很多书(大文件),但你不需要把所有的书都搬回家,你只需要借阅你需要的书就可以了。Git LFS 就是这个图书馆,它帮你管理这些大文件,让你随时随地都可以“借阅”到它们。

1 . 查看哪些类型的文件需要被追踪:

$ git lfs track
Listing tracked patterns*.7z (.gitattributes)*.ckpt (.gitattributes)*.model (.gitattributes)*.onnx (.gitattributes)*.pickle (.gitattributes)*.pth (.gitattributes)*.safetensors (.gitattributes)......
Listing excluded patterns

这里列出来被追踪的文件对应.gitattributes这个配置文件。

2 . 查看被追踪的大文件是哪些:

$ git lfs ls-files
2b1879f356 * model-00001-of-00004.safetensors
09d433f650 * model-00002-of-00004.safetensors
fc1cdddd6b * model-00003-of-00004.safetensors
92ecfe1a24 * model-00004-of-00004.safetensors
ab33d910f4 * original/consolidated.00.pth
82e9d31979 * original/tokenizer.model

在拉取时,可以临时设置GIT_LFS_SKIP_SMUDGE=1

$ GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/LLM-Research/meta-llama-3.1-8b-instruct.git
Cloning into 'meta-llama-3.1-8b-instruct'...
remote: Enumerating objects: 55, done.
remote: Total 55 (delta 0), reused 0 (delta 0), pack-reused 55
Receiving objects: 100% (55/55), 2.25 MiB | 7.63 MiB/s, done.
Resolving deltas: 100% (19/19), done.$ cd meta-llama-3.1-8b-instruct/$ du -sh
12M   

这样就会跳过被追踪的大文件,进行代码仓库的克隆。


当需要用到某些大文件时,再单独拉取指定文件:

$ git lfs fetch --include="original/tokenizer.model"
fetch: Fetching reference refs/heads/master
Downloading LFS objects: 100% (1/1), 2.2 MB | 0 B/s$ git lfs checkout original/tokenizer.model
Checking out LFS objects: 100% (1/1), 2.2 MB | 0 B/s, done.$ du -sh
16M     .
$ git lfs fetch --include="*.safetensors"
fetch: Fetching reference refs/heads/master
Downloading LFS objects: 100% (4/4), 19 GB | 75 MB/s$ du -sh
15G     .$ git lfs checkout *.safetensors
Checking out LFS objects: 100% (4/4), 16 GB | 179 MB/s, done.$ du -sh
30G   

疑问:为什么git lfs fetch变成了15G,而git checkout 变成了30G呢?

git lfs fetch 是将文件下载到.git/lfs/objects目录下,当然是一些对象格式的文件,以便后续检出。
git lfs checkout 是将.git/lfs/objects下的对象格式文件检出到工作目录,所以这里又增加了一倍的空间占用。

甚至检出后,可以直接将这个.git目录删除掉,这样就可以使占用空间最小,只保留了需要用到的模型文件。


刚刚去看了一下,为什么一开始说clone下来是60多G,因为它仓库原本还有一个.pth文件,我们没有git lfs fetchgit lfs checkout,自然整体少占用了30G左右的空间。
在这里插入图片描述


码字不易,希望对遇到相同问题的朋友有所帮助。


http://www.ppmy.cn/news/1545507.html

相关文章

ubuntu切换不同版本的python

有时候编译安卓或者SDK代码,如果报错,表示 Python 的替代版本尚未被update-alternatives 命令识别,此时需要切换到对应的版本才能正常编译。比如我在编译内核的时候出现了以下报错: CC security/selinux/netif.oCC net/…

【Pytorch】model.eval()与model.train()

model.train(): 作用是启用Batch Normalization 和 Dropout 如果模型中有BN层(Batch Normalization)和Dropout,需要在训练时添加model.train()。model.train()是保证BN层能够用到每一批数据的均值和方差。对于Dropout&#x…

Vue3安装、创建到使用

vue安装 npm install vuenext # 全局安装 vue-cli npm install -g vue/cli #更新插件 项目中运行 vue upgrade --nextvue create 命令 vue create [options] <app-name> options 选项可以是&#xff1a; -p, --preset <presetName>&#xff1a; 忽略提示符并使用已…

Git+Jenkins基本使用

Jenkins是一个开源的实现持续集成的软件工具 持续集成的作用 保证团队开发人员提交代码的质量&#xff0c;减轻软件发布的压力自动完成各个环节的任务&#xff0c;无需太多的人工干预&#xff0c;有利于减少重复过程&#xff0c;以节省时间、费用和工作量 持续集成的特点 是…

【ARM Linux 系统稳定性分析入门及渐进 1.1 -- Crash 工具功能概述】

文章目录 Crasg 功能概述Crash 核心功能Crash 版本独立性为什么使用 Crash 工具?Crash 工具的优势Crash 工具编译debug 信息保留Crasg 功能概述 crash 工具是一个强大的 Linux 内核调试和分析工具,最初基于 SVR4 UNIX 的 crash 命令,但经过显著增强,完全与 GNU GDB 调试器…

《重学Java设计模式》之 单例模式

单例模式主要解决的是&#xff0c;一个全局使用的类频繁的创建和消费&#xff0c;从而提升提升整体的代码的性能。 单例模式原则 私有构造。&#xff08;阻止类被常规方法实例化&#xff09;以静态方法或者枚举返回实例。&#xff08;保证实例的唯一性&#xff09;确保实例只…

streamlit run的启动参数讲解

当你运行 streamlit run 命令时&#xff0c;后面可以带一些参数&#xff0c;用来指定如何运行 Streamlit 应用。下面是 streamlit run 命令的常用参数及其含义&#xff1a; 基本命令&#xff1a; streamlit run your_script.py这个命令会启动 your_script.py 这个 Streamlit …

DNS域名详细解析详解

文章目录 DNS域名详细解析详解一、引言二、DNS域名解析过程1、DNS解析概述1.1、DNS解析的基本步骤 2、代码示例 三、DNS查询类型1、递归查询2、迭代查询 四、总结 DNS域名详细解析详解 一、引言 在互联网的世界里&#xff0c;域名和IP地址是两个不可或缺的概念。IP地址是计算…