Hướng dẫn sử dụng git-annex: Quản lý và đồng bộ file dữ liệu lớn phân tán thay thế Git LFS

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Cơn ác mộng file dữ liệu lớn trong Git

Chắc hẳn ai làm dự án AI, xử lý video hay quản trị database cũng từng gặp cảnh này. Bạn vô tình commit một file checkpoint model 8GB hoặc file nén zip 15GB vào repo. Chỉ sau vài commit, thư mục .git phình to lên cả trăm GB. Hậu quả là mỗi lần đồng đội chạy git clone, kết nối timeout liên tục và máy chủ Git báo lỗi quá tải.

Git được thiết kế để theo dõi source code dạng text. Khi bạn tống file binary nặng vào commit history, Git sẽ nén và lưu toàn bộ phiên bản mới mỗi lần file thay đổi. Dung lượng repo tăng vọt theo cấp số cộng của kích thước file.

Thông thường, Git LFS (Large File Storage) là giải pháp được nghĩ tới đầu tiên. Thế nhưng LFS hoạt động theo mô hình tập trung (centralized) phụ thuộc chặt vào Git server. Lấy ví dụ với GitHub: tài khoản miễn phí chỉ cấp vỏn vẹn 1GB storage và 1GB băng thông tải về mỗi tháng. Vượt hạn mức, bạn phải trả $5/tháng cho mỗi gói data pack (50GB). Với team xử lý dataset vài terabyte, con số này đội chi phí hàng tháng lên rất nhanh.

Hơn nữa, nếu công ty bạn đã có sẵn ổ cứng NAS 40TB ở văn phòng, hoặc bucket MinIO riêng, Git LFS rất khó tận dụng linh hoạt các nguồn này. Đó là lý do nhiều kỹ sư chuyển sang git-annex.

git-annex hoạt động như thế nào?

Điểm khác biệt cốt lõi nằm ở kiến trúc phân tán (peer-to-peer).

Thay vì ép buộc mọi file lớn phải gửi lên một server trung tâm, git-annex coi mỗi máy tính, server hay ổ cứng cắm ngoài là một node độc lập. Khi bạn thêm một file vào git-annex:

  • Nội dung thật của file được chuyển vào kho lưu trữ nội bộ tại .git/annex/objects/ và khóa quyền ghi (read-only) để tránh sửa nhầm.
  • Tại thư mục làm việc, git-annex tạo một symlink hoặc pointer file trỏ tới object đó. Git thông thường chỉ commit file con trỏ này, kích thước vỏn vẹn vài chục byte.
  • git-annex theo dõi vị trí thực tế của từng file qua một nhánh ngầm tên là git-annex. Nhánh này ghi nhận metadata: file hash X hiện có mặt ở laptop dev, server GPU hay NAS văn phòng.

Bảng so sánh nhanh git-annex và Git LFS

Tiêu chí Git LFS git-annex
Mô hình Client – Server tập trung Phân tán ngang hàng (Peer-to-Peer)
Hạ tầng lưu trữ Gắn chặt với Git forge (GitHub, GitLab) Rsync, SSH, S3, MinIO, NAS, ổ cứng di động…
Quyền sở hữu dữ liệu Server giữ bản gốc tập trung Tùy chọn node nào giữ file nào
Chi phí vận hành Tốn tiền storage và egress băng thông Gần như 0 đồng nếu tận dụng hạ tầng có sẵn

Thực hành: Cài đặt và sử dụng git-annex

1. Cài đặt công cụ

Trên Ubuntu hoặc Debian:

sudo apt update
sudo apt install -y git-annex

Trên macOS thông qua Homebrew:

brew install git-annex

2. Khởi tạo repository và đưa file lớn vào quản lý

Giả sử bạn cần quản lý bộ weights cho model AI:

mkdir ai-project && cd ai-project
git init
git annex init "workstation-laptop"

# Tạo thử một file nhị phân 500MB để test
fallocate -l 500M model_weights_v1.bin

# Thêm file vào quản lý của git-annex thay vì git add thông thường
git annex add model_weights_v1.bin

# Commit metadata vào Git
git commit -m "feat: track model_weights_v1.bin via git-annex"

Chạy lệnh ls -l, bạn sẽ thấy model_weights_v1.bin trỏ tới một symlink trong .git/annex/objects/. Git chỉ theo dõi symlink đó. Repo Git của bạn vẫn siêu nhẹ.

3. Cấu hình Special Remote qua SSH/rsync

Sức mạnh thực sự của git-annex nằm ở special remotes. Bạn có thể biến con NAS Synology hoặc một server backup nội bộ thành kho chứa:

# Khởi tạo một rsync remote trỏ đến server nội bộ
git annex initremote office-nas type=rsync \
    [email protected]:/volume1/annex-data \
    encryption=none

4. Đồng bộ và thu hồi dung lượng ổ cứng

Khi hoàn thành việc huấn luyện model, bạn đẩy dữ liệu lên NAS:

# Đẩy nội dung file sang máy chủ NAS
git annex copy model_weights_v1.bin --to=office-nas

# Kiểm tra vị trí hiện tại của file
git annex whereis model_weights_v1.bin

Màn hình sẽ hiển thị file đang hiện diện trên cả workstation-laptop và office-nas.

Ổ cứng SSD của laptop sắp cạn dung lượng? Bạn giải phóng không gian cực kỳ đơn giản:

git annex drop model_weights_v1.bin

git-annex có cơ chế bảo vệ an toàn tích hợp sẵn. Nếu file chưa được sao lưu an toàn ở ít nhất một remote khác (theo thông số numcopies, mặc định là 1), lệnh drop sẽ lập tức từ chối xóa. Bạn không bao giờ sợ mất file do bấm nhầm.

Khi đồng đội clone repo về và muốn lấy đúng file đó để chạy thử:

git annex get model_weights_v1.bin

5. Chỉnh sửa nội dung file

Mặc định file trong git-annex ở chế độ read-only nhằm tránh sai lệch mã hash sha256. Để sửa file, bạn mở khóa trước:

# Mở khóa quyền ghi cho file
git annex unlock model_weights_v1.bin

# Tiến hành ghi đè hoặc chỉnh sửa dữ liệu
echo "new checkpoint data" >> model_weights_v1.bin

# Đóng gói và lưu phiên bản mới
git annex add model_weights_v1.bin
git commit -m "fix: update model weights checkpoint"

Lời kết

git-annex phá bỏ giới hạn lưu trữ của Git truyền thống mà không buộc bạn trả tiền đắt đỏ cho các gói Git LFS. Bằng cách phân phối linh hoạt giữa máy cá nhân, server SSH và cloud bucket, bạn nắm toàn quyền kiểm soát dữ liệu. Hãy áp dụng thử cho dự án data science tiếp theo của bạn để thấy sự khác biệt.

Share: