将讲一个实际的例子:对于模型文件,动辄就是好几个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 fetch
和git lfs checkout
,自然整体少占用了30G左右的空间。
码字不易,希望对遇到相同问题的朋友有所帮助。