Giới thiệu
Trong các dự án trí tuệ nhân tạo, mô hình học máy (model) thường có kích thước từ vài hundred megabyte đến vài gigabyte. Việc quản lý các file nhị phân lớn trong hệ thống kiểm soát phiên bản truyền thống (Git) gặp nhiều khó khăn: tăng thời gian clone, làm bẫy lịch sử commit và tiêu tốn dung lượng lưu trữ trên server. Git LFS (Large File Storage) và Git Flow là hai công cụ có thể kết hợp để giải quyết vấn đề này, đồng thời duy trì quy trình phát triển phần mềm chuẩn DevOps.
1. Nguyên lý hoạt động của Git LFS
Git LFS thay thế nội dung thực của file lớn bằng một pointer (đại diện) trong repository Git, trong khi nội dung thực tế được lưu trữ trên một server LFS riêng. Khi checkout, Git LFS tự động tải file thực về workspace.
1.1 Cài đặt Git LFS
git lfs install
Lệnh trên tạo ra các hook cần thiết (pre-push, post-checkout) để đồng bộ file LFS.
1.2 Định nghĩa các file cần quản lý bằng LFS
Thêm các pattern vào file .gitattributes:
*.pt filter=lfs diff=lfs merge=lfs -text *.h5 filter=lfs diff=lfs merge=lfs -text *.ckpt filter=lfs diff=lfs merge=lfs -text
Ở đây, *.pt là định dạng mô hình PyTorch, *.h5 cho Keras, và *.ckpt cho TensorFlow.
2. Kết hợp Git Flow với Git LFS
Git Flow cung cấp một quy trình branching rõ ràng: master, develop, feature/*, release/*, hotfix/*. Khi làm việc với mô hình AI, chúng ta cần xác định vị trí nào phù hợp để lưu trữ các file model:
- feature/*: chứa các thí nghiệm, model chưa ổn định.
- develop: lưu trữ model đã được kiểm thử trên môi trường staging.
- release/*: model chuẩn bị đưa vào production, thường được gắn tag phiên bản.
- hotfix/*: sửa lỗi nhanh, có thể bao gồm việc cập nhật model khẩn cấp.
Việc sử dụng Git LFS trên các nhánh này không khác gì trên nhánh thông thường, nhưng cần chú ý một số điểm:
- Tránh commit model lớn trực tiếp trên
masternếu không cần thiết. - Luôn chạy
git lfs pullsau khi checkout một nhánh mới để đảm bảo các file LFS được tải về. - Sử dụng
git lfs trackđể thêm pattern mới, tránh việc commit file nhị phân mà không qua LFS.
2.1 Quy trình tạo feature branch cho mô hình mới
git checkout develop git pull origin develop git checkout -b feature/model-bert-finetune
Sau khi thực hiện fine‑tune và lưu model thành file bert_finetuned.pt, thêm vào LFS và commit:
git lfs track "bert_finetuned.pt" git add .gitattributes bert_finetuned.pt git commit -m "Add fine‑tuned BERT model (LFS)" git push origin feature/model-bert-finetune
2.2 Khi hợp nhất vào develop
Trước khi mở Pull Request, chạy một script kiểm tra kích thước tổng của các file LFS để tránh vượt quá quota:
#!/usr/bin/env node
const { execSync } = require('child_process');
const output = execSync('git lfs ls-files').toString();
let total = 0;
output.split('\n').forEach(line => {
const match = line.match(/\((\d+\.\d+ [KMG]B)\)/);
if (match) {
const sizeStr = match[1];
const unit = sizeStr.slice(-2);
let size = parseFloat(sizeStr);
if (unit === 'KB') size *= 1024;
else if (unit === 'MB') size *= 1024 * 1024;
else if (unit === 'GB') size *= 1024 * 1024 * 1024;
total += size;
}
});
console.log('Total LFS size:', (total / (1024*1024)).toFixed(2), 'MB');
if (total > 500 * 1024 * 1024) {
console.error('LFS size exceeds 500 MB limit!');
process.exit(1);
}
Nếu script trả về lỗi, developer cần giảm kích thước model (ví dụ: dùng quantization) trước khi merge.
3. Tích hợp Git LFS vào pipeline CI/CD
Trong môi trường CI (GitHub Actions, GitLab CI, Jenkins), mặc định Git không tải về các file LFS. Cần cấu hình để:
- cài đặt Git LFS,
- đăng nhập vào server LFS (nếu sử dụng private LFS),
- tải về các file cần thiết cho quá trình training hoặc inference.
3.1 Ví dụ GitHub Actions cho mô hình PyTorch
name: CI - Model Validation
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
lfs: true # <-- bật hỗ trợ LFS
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install torch torchvision
- name: Verify model file size
run: |
ls -lh models/bert_finetuned.pt
- name: Run inference test
run: |
python - <<'PY'
import torch
model = torch.load('models/bert_finetuned.pt')
model.eval()
# dummy input
x = torch.randn(1, 3, 224, 224)
with torch.no_grad():
out = model(x)
print('Inference OK, output shape:', out.shape)
PY
Tham số lfs: true trong actions/checkout tự động chạy git lfs pull sau khi clone.
3.2 Quản lý quota LFS trên CI
Nhiều dịch vụ CI có giới hạn bandwidth và storage cho LFS. Để tránh vượt quota, có thể:
- Cache các file LFS trong
actions/cacheđể tái sử dụng trong các run tiếp theo. - Chỉ tải những file cần thiết (sử dụng
git lfs fetch --include "models/*.pt").
4. Các vấn đề thường gặp và cách khắc phục
4.1 LFS pointer được commit thay vì file thực
Nếu quên chạy git lfs track trước khi git add, Git sẽ lưu lại nội dung nhị phân dưới dạng blob thông thường, làm tăng kích thước repository. Kiểm tra bằng:
git check-attr --all -- path/to/file.pt
Kết quả filter: lfs xác nhận file đã được LFS quản lý.
4.2 Xung đột merge với file LFS
Khi hai nhánh thay đổi cùng một file model, Git sẽ báo xung đột. Giải pháp:
- Tránh commit trực tiếp trên
master. - Sử dụng
git lfs merge-driver(được cài sẵn) để tự động giữ phiên bản mới nhất. - Nếu cần, tạo một release mới và lưu model mới dưới tên phiên bản (ví dụ:
model_v1.2.pt) để tránh xung đột.
4.3 Quá trình clone chậm do LFS
Đối với các repository có nhiều file model, clone có thể mất thời gian. Các biện pháp tối ưu:
- Sử dụng shallow clone:
git clone --depth 1 --filter=blob:none --no-checkout REPO_URL, sau đógit lfs pull --include "models/*.pt". - Đặt
lfs.concurrenttransfersđể tăng số luồng tải:git config lfs.concurrenttransfers 8. - Đối với môi trường CI, bật cache như đã đề cập ở mục 3.2.
5. Best practices cho việc versioning mô hình AI
- Tag phiên bản model: Khi một model được chấp nhận, tạo tag Git (ví dụ
v1.0-model) và đồng thời tạo release trên GitHub/GitLab để lưu trữ artifact. - Ghi chú metadata: Đặt file
model.yamlchứa thông tin nhưarchitecture,training_data_version,hyperparameters. Đảm bảo file này không được đưa vào LFS. - Không commit dữ liệu raw: Dữ liệu huấn luyện thường lớn hơn model; nên dùng DVC hoặc các storage bucket (S3, GCS) để quản lý.
- Kiểm tra reproducibility: Mỗi commit chứa model phải có script
train.pycó thể tái tạo model (có thể dùng seed cố định). - Quản lý quyền truy cập LFS: Nếu model chứa thông tin nhạy cảm, cấu hình server LFS riêng tư và giới hạn token truy cập.
Kết luận
Việc kết hợp Git LFS với quy trình Git Flow cho phép các team AI duy trì lịch sử sạch, giảm tải cho repository và vẫn tuân thủ các nguyên tắc DevOps. Khi áp dụng đúng cách, bạn sẽ giảm thiểu rủi ro khi triển khai model vào production, đồng thời tạo môi trường làm việc nhất quán cho cả developer và data scientist.
Để nâng cao kỹ năng và áp dụng các chiến lược trên một cách bài bản, Tham khảo khóa học "Khóa học Git & Git Flow thực chiến" tại đây.






