博文头图
Gitea+Git LFS:深度学习代码+模型备份同步的优雅解法

Gitea+Git LFS:深度学习代码+模型备份同步的优雅解法

引子

P.S. 我这个人写博客喜欢写一个有引导性的碎碎念,如果你简单看了眼标题,觉得你可能遇到了类似的问题,那么完全可以直接跳过这段直接看正文。

如果你平时的核心工作是进行深度学习,也就是俗称的“炼丹”,那么你很有可能遇到下面这几个头疼的问题:

  • 你平时在自己的本地电脑上写代码,但训练的时候需要将代码同步到训练专用的GPU服务器上去。每次手动压缩代码在上传到服务器上真的非常麻烦。
  • 你的训练服务器又又又又崩溃了。恰好上面存放着你近几天的训练成果,但是你没来得及将他们从训练服务器上拷到你本地。就这样,你跑了数天的几个实验白跑了。
  • 你辛辛苦苦跑了跑了好几个模型,发现还是最初的超参数和网络结构效果最好。你想回退到之前的版本,这时候你看着你的数个备份的代码压缩包,不知道应该回退到哪个。

那么你现在需要一套深度学习代码、模型的备份与同步的解决方案了。

Git?你或许想到了Git。

Git备份代码是完全没有问题的,它或许能完美解决第三个问题,Git本来就是为代码的版本控制而生的。但问题来了:那些动辄数百兆的训练好的模型权重,Git 能行吗?

有点悬。

Git的设计初衷是高效管理文本文件,而不是频繁变动的大型二进制文件。Git会永久保存所有历史版本,即使你删除了某个大文件,它仍然存在于历史提交中,一直占用存储空间,而且Clone的时候会进行完整拉取。如果使用只Git来解决上述所有问题,还是有些不太够用的。

那有没有办法能弥补Git的这个短板呢?

有的兄弟,有的。那就是Git LFS。

Git LFS是 Git 官方生态中的扩展工具,专门用于管理大体积二进制文件。它会将大文件存储在Git仓库之外的一个专门的LFS存储区,而在Git仓库中只保存一个轻量级的指针文件。git clonegit pull 时就不会被庞大的模型文件拖慢速度;我们还能通过简单配置,按需拉取模型文件,让Git仓库始终保持轻盈的状态。

当然,Github官方也提供了开箱即用的Git LFS服务。但是考虑到它在国内糟糕的访问速度,以及它的免费配额只有10GB,我还是建议自建这项服务,Gitea就完全可以胜任。

Gitea是一个用Go编写的轻量级、自托管Git服务,部署简单,资源占用低。同时它支持Git LFS,非常适合我们的应用场景。

部署Gitea服务器

我会以Debian12为例,演示安装过程。其他系统可以参考,替换部分软件包安装的命令即可。

准备工作

安装Git和Git LFS,并在系统中添加Git用户,并为Gitea新建工作文件夹:

sudo apt install git git-lfs
sudo useradd git --system --shell /bin/bash --comment 'Git Version Control' --create-home --home /home/git

cd /home/git
mkdir gitea
chown -R git:git gitea

下载并配置Gitea

下载对应版本的 Gitea 二进制文件

wget https://dl.gitea.io/gitea/1.25.1/gitea-1.25.1-linux-amd64
chmod +x gitea-1.25.1-linux-amd64

chown git:git gitea-1.25.1-linux-amd64

下载Gitea的Systemd配置文件,编辑Systemd相关配置,根据实际情况进行修改。

systemctl daemon-reload
systemctl start gitea

编辑Systemd文件,根据实际情况进行修改。

wget https://raw.githubusercontent.com/go-gitea/gitea/master/contrib/systemd/gitea.service -P /etc/systemd/system/
vim /etc/systemd/system/gitea.service

[Service]
User=git
Group=git
WorkingDirectory=/home/git/gitea #gitea工作目录
ExecStart=/home/git/gitea-1.25.1-linux-amd64 web --config /home/git/gitea/custom/conf/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/home/git/gitea

启动 Gitea 并设置开机自启

编辑完之后,尝试运行一下Gitea,此时会在工作目录中生成Gitea的配置文件,我们还需要进行修改来开启Gitea的LFS支持。

systemctl daemon-reload
systemctl start gitea
systemctl status gitea   # 查看运行状态(显示active则成功)
systemctl enable gitea 

启用 Gitea 的 Git LFS 支持

编辑Gitea配置文件,启用LFS。

vim /home/git/gitea/custom/conf/app.ini

[server]
LFS_START_SERVER = true

[lfs]
PATH = /data/gitea/data/lfs

完成后,记得重启Gitea,使配置文件生效。

systemctl restart gitea

完成安装

此时,浏览器打开 `http://[你的服务器IP]:3000/` 就能看到一个可视化的安装Web界面了。

按照实际情况填写,如果你的服务器上已经运行了MySQL,则可以选择;否则选择SQLite3即可。

看到这个界面,代表你已经完成了Gitea服务器的安装,可以进入下面的使用环节了。

Gitea

使用Git LFS

Gitea的使用方法几乎Github一样,新建项目,将本地Git仓库的远程地址设为Gitea服务器的IP地址即可,不过不要忘了端口号3000。

先明确我们的核心目标:

本地开发PC上只保存最新的Python源码,Gitea服务器上保存既要保存各个模型训练阶段修改的源码,又要保存模型。训练服务器上则保存着源码和训练好的模型。

当然,如果训练服务器存储空间不够的话,模型可以删,前提是它们已经被保存在Gitea服务器上了。

本地开发PC配置

本地开发的PC只有一个地方需要特别配置,其他与正常使用Git一样。

我们不希望LFS将训练好的模型下载到我们本地,只需要执行下面的命令:

git lfs install
git config lfs.skipSmudge true
git config lfs.fetchinclude ""
git config lfs.fetchexclude "*"

注意,上面的命令在每一个Git项目根目录下都要执行。

这样,只会下载到类似于指针的占位符:

version https://git-lfs.github.com/spec/v1
oid sha256:xxxxxxxxxxxxxxxxxxxx
size 324875392

如果需要某个模型文件,先撤销之前的命令,再手动下载,或者在Gitea Web网页上下载。不过记得完成后再执行一下上面两行命令:

git config --unset lfs.fetchinclude
git config --unset lfs.fetchexclude

# 拉取对应的文件,可以使用通配符
git lfs pull --include "models/best_model.pt"

git config lfs.fetchinclude ""
git config lfs.fetchexclude "*"

训练服务器配置

训练完成后,我们打算将训练好的模型备份到Gitea。如果模型放在项目根目录的models文件夹下,可以在项目的根目录执行下面的命令,让data文件夹下的文件都受LFS管理。

跟踪模型文件

git lfs track "models/**"
# 关键步骤:提交.gitattributes文件
git add .gitattributes

可选:排除无需备份的文件

如果数据集无需上传,则可以新建.gitignore文件添加排除规则:

# .gitignore文件内容
data/  # 数据集目录
*.log  # 日志文件

提交并推送代码和模型

git add *
git status

如果结果类似于下面这样,模型有LFS:

LFS

那么就成功啦!

现在就可以commit一次,然后push到Gitea服务器上了。

你会发现上传速度相较于只是用Git快了很多,这就是LFS的功劳。

结尾

这套方案的优势在于简单轻量且灵活,单台服务器就能支撑个人或小团队使用;本地按需拉取模型不占空间,也无惧训练服务器的数据丢失。当然如果你有更好的解决方案,也欢迎在评论区提出~

[EOF]

本文永久链接:https://blog.xmgspace.me/archives/gitea-lfs-for-deep-learning-sync-and-backup.html
本文文章标题:Gitea+Git LFS:深度学习代码+模型备份同步的优雅解法
如无特殊说明,只要您标明转载自Xiaomage's Blog,就可转载本文。若无法复制请联系站长获取文章副本。
授权协议:署名-非商业性使用-相同方式共享 4.0(CC BY-NC-SA 4.0)
暂无评论

发送评论 编辑评论


				
若您不希望公开IP属地,请点击此处,在评论末尾添加:no-location:标记。IP属地仅供参考。隐私政策
上一篇
下一篇