0x00 前言
早在《Git-LFS 的使用和迁移笔记》中我们已经说过,Github 的 LFS 每月只有少量免费额度供用户使用,一旦超额,仓库就会被限制检出。
在 21 年的时候,Github LFS 的免费额度有 1G,现在免费额度下降到了 500M,而且还是和 Packages 存储空间共用的:
要想扩容,只能购买资源包,一个资源包提供 50G ,每个月需要支付 $5 。
很多时候我们的工程只有少量的几个大文件, 500M 不够、50G 又太多,最重要的是不想浪费每个月 $5 去供养这几个文件,该怎么办呢?
0x10 妥协的方案
Github 规定,单个文件 > 100M
则定义为大文件,需要使用 LFS 管理,但是 LFS 免费空间只有 500M (单个账号、不是单个仓库)。
因此很多时候为了妥协这个限制,我们尽量不让文件超过 100M:
- 可以解压的: 解压成一堆小文件
- 不能解压的: 分卷压缩成不大于 100M 的卷
往往程序还要写一些额外的逻辑去兼容这些小文件的处理。
有没有不妥协的方法呢?
0x20 免费扩容 LFS
其实是有的。
随着近年 AI 的爆火,作为模型训练、托管平台的 Hugging Face 开始被熟知。
Hugging Face 基于 Git 来管理 模型、数据集和应用,有点类似于 GitHub:
对比项 | Hugging Face | GitHub |
---|---|---|
用途 | 存储 AI 资源(模型、数据集、应用) | 存储 代码项目 |
版本控制 | 基于 Git | 基于 Git |
支持 Git LFS | ✅(适合大文件) | ✅(有限制) |
存储对象 | .ckpt 、.safetensors 、.bin 、.json 等 |
.py 、.cpp 、.java 、.md 等 |
主要用户 | AI 开发者、研究人员 | 代码开发者 |
因为 Hugging Face 主要托管的是 AI 模型、而不是代码,每个 AI 模型动辄都有几 G,因此它给到的 LFS 免费额度比 Github 大方得多,每个账号有 100G 上限,而且还能用于私有仓库:
又由于 Hugging Face 也是基于 Git 做版本管理的,因此我们只需:
- 新建一个 Hugging Face 的 Model 或 Dataset 仓库
- 然后以 Git 子模块方式嵌入到 Github 仓库中
- Github 主工程管理代码、Hugging Face 子工程管理 LFS
这样就可以实现 Github 仓库 LFS 的免费扩容。
Hugging Face 的 LFS 没有限制大文件的类型,不是模型文件也是可以的
0x30 实例
0x31 创建仓库
这里我创建了两个示例仓库:
- Github 仓库: https://github.com/EXP/Demo-Code
- Hugging Face 仓库: https://huggingface.co/datasets/EXP/Demo-LFS
0x32 配置 ssh 连接
因为涉及大文件传输,建议本地都通过 ssh 访问两个仓库,详细可参考《Github 一机多号配置》。
- Github 添加 ssh 公钥位置: https://github.com/settings/keys
- Hugging Face 添加 ssh 公钥位置: https://huggingface.co/settings/keys
最终 ~/.ssh/config
的配置中应该有以下配置以指定 ssh 私钥:
Host github.com
User ${Github.Account.email}
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
Host huggingface.co
User ${Huggingface.Account.email}
Hostname hf.co
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443
所有账号都配置好后,在本地终端执行命令:
ssh -T git@github.com
ssh -T git@hf.co
0x33 配置 ssh 代理
这两个平台在国内除了 Github 的 ssh,其实都被墙了:
平台 | HTTP 访问 | SSH 访问 |
---|---|---|
GitHub | ❌(被墙) | ✅(可用) |
Hugging Face | ❌(被墙) | ❌(被墙) |
因此我们还需要在 ~/.gitconfig
至少配置 git 的 ssh 代理:
# [http]
# proxy = socks5://127.0.0.1:10089
# [https]
# proxy = socks5://127.0.0.1:10089
[git]
proxy = socks5://127.0.0.1:10089
详细可参考《Github Desktop 代理设置》和《trojan 睁眼看世界教程》。
0x34 初始化仓库
网络环境配置好之后,先拉取 Github 仓库到本地:
git clone git@github.com:EXP/Demo-Code.git
然后以子工程的形式、拉取 Hugging Face 仓库:
cd Demo-Code
git submodule add git@hf.co:datasets/EXP/Demo-LFS.git
0x35 安装 Git LFS
在 Hugging Face 子工程中安装 LFS:
cd Demo-LFS
git lfs install
0x36 跟踪大文件
最后在 Hugging Face 仓库中,指定需要 LFS 跟踪的文件格式,譬如我指定的大文件格式为 *.grf
:
git lfs track "*.grf"
echo "*.grf" >> .gitattributes
此后 .gitattributes
就会把每一个 *.grf
文件都作为大文件进行跟踪:
随后就可以用 git commit
和 git push
命令和正常代码一样去上传大文件了。
在 Hugging Face 的 Demo-LFS 仓库中,还可以通过 Settings -> Storage Usage -> List LFS files
管理已托管到 LFS 中的大文件:
0xF0 参考文档
- Github LFS 价格:https://huggingface.co/docs/hub/storage-limits
- Hugging Face LFS 价格:https://huggingface.co/docs/hub/storage-limits