Post

Data Version Control · DVC

Giới thiệu về DVC trong quản lý dữ liệu và ML pipelines.

Data Version Control · DVC

Giới thiệu DVC và lợi ích trong Machine Learning

DVC (Data Version Control) là một công cụ mã nguồn mở miễn phí giúp quản lý phiên bản dữ liệu, mô hình học máy và pipeline một cách hiệu quả. Nói cách khác, DVC cho phép bạn quản lý dữ liệu tương tự như cách Git quản lý code – có thể hiểu là “Git cho dữ liệu”. Giống như Git, DVC sử dụng cơ chế version control để lưu trữ và theo dõi các phiên bản của dữ liệu, mô hình, cũng như các file liên quan trong dự án ML. Nhờ đó, mọi thay đổi ở dữ liệu và mô hình đều được track (theo dõi) đầy đủ, giúp dễ dàng tái tạo kết quả thí nghiệm và đảm bảo tính reproducible cho dự án ML. DVC đặc biệt hữu ích khi dự án yêu cầu thử nghiệm nhiều mô hình với các bộ dữ liệu và quy trình xử lý khác nhau – nó giúp gắn kết phiên bản dữ liệu với phiên bản code, hỗ trợ cộng tác nhóm tốt hơn và tránh được hạn chế của Git khi lưu trữ file lớn (Git thường không xử lý tốt các file dữ liệu hàng GB).

Logo DVC

Bắt đầu với DVC

Cài đặt DVC để thực hành với lệnh

1
pip install dvc

Ta cần cone một repo git về máy local -> vào thư mục repo git đó -> khởi tạo repo git thành repo DVC bằng lệnh sau : ( nếu không clone thì git init để tạo mới cũng được nhé)

1
dvc init

Lệnh này sẽ tạo ra một số file và thư mục cần thiết cho DVC (ví dụ .dvc/, .dvcignore, file config) trong dự án. Có thể kiểm tra thay đổi bằng git status Sau đó, ta sẽ thực hiện lệnh commit việc khởi tạo DVC

1
git commit -m "initialize DVC"

Thao tác này ghi nhận việc khởi tạo DVC vào lịch sử Git. Từ đây, DVC đã sẵn sàng để bạn bắt đầu quản lý dữ liệu.

Theo dõi dữ liệu, mô hình với DVC (dvc add)

Khi đã thiết lập xong, bước quan trọng tiếp theo là theo dõi (track) dữ liệu và mô hình bằng DVC. Tương tự như Git dùng git add để quản lý file code, DVC dùng lệnh dvc add để quản lý file dữ liệu hoặc mô hình (các file lớn). Giả sử bạn có một tập dữ liệu đầu vào cho dự án (ví dụ: file CSV, hình ảnh, âm thanh, v.v.). Hãy đặt dữ liệu đó vào thư mục của dự án (VD: tạo thư mục data/ và bỏ file vào đó). Sau đó, dùng lệnh dvc add để đưa file/dataset này dưới sự quản lý của DVC. Ví dụ với file data.csv trong thư mục data/:

Ví dụ mình tạo dữ liệu mẫu với 5 dòng nhé ::

1
2
3
4
5
6
7
8
9
mkdir -p data
cat <<EOF > data/data.csv
id,name,age
1,Alice,23
2,Bob,30
3,Charlie,28
4,David,35
5,Eva,27
EOF

Sau đó mình chạy

1
dvc add data/data.csv

Sau khi chạy lệnh trên, DVC sẽ:

  • Di chuyển file thực vào cache của DVC (thư mục ẩn .dvc/cache) và tạo một file metadata với đuôi .dvc đóng vai trò placeholder (đại diện) cho dữ liệu thực.
  • Thêm đường dẫn data/data.csv vào file .gitignore tự động, để tránh Git track file dữ liệu thô (vì ta muốn Git chỉ quản lý file .dvc, còn dữ liệu thực do DVC quản lý).

Kết quả, dữ liệu đã được “phiên bản hóa”: file .dvc nằm trong Git sẽ ghi nhận phiên bản của data.csv. Mỗi khi dữ liệu đổi khác và bạn dvc add lại, nội dung file .dvc thay đổi (cập nhật hash mới), giúp bạn theo dõi sự thay đổi qua Git.

Bạn có thể kiểm tra: sau dvc add, chạy git status sẽ thấy một file .dvc mới và thay đổi trong .gitignore`. Hãy commit những thay đổi này:

1
2
git add data/data.csv.dvc data/.gitignore
git commit -m "Add raw dataset"

Sử dụng remote storage để lưu trữ dữ liệu lớn

DVC tách dữ liệu/mô hình ra khỏi Git bằng cách lưu chúng vào remote storage (bộ nhớ từ xa hoặc nội bộ tùy chọn). Remote storage có thể là nhiều loại: local folder, server SSH, cloud (AWS S3, Google Drive, Azure Blob, v.v.). Mục tiêu là khi bạn dvc add dữ liệu, dữ liệu đó nằm ở cache cục bộ của bạn; sau đó bạn đẩy cache này lên remote để lưu trữ và chia sẻ, thay vì push lên Git

Thêm remote local: Ví dụ, tạo một thư mục local làm remote: mkdir /tmp/dvcstore

1
dvc remote add -d myremote /tmp/dvcstore

DVC lưu thông tin remote này trong file config (.dvc/config) của dự án.

Nếu muốn remote là Amazon S3, ta chạy câu lệnh sau:

1
dvc remote add -d myremote  s3://mybucket/dvcstore

Nếu muốn remote với Google Drive, có thể sử dụng

1
dvc remote add -d myremote gdrive://<folder-id>

(Lưu ý: với một số remote đặc thù, bạn cần cài thêm gói hỗ trợ, ví dụ pip install “dvc[gdrive]” để dùng Google Drive).

Sau khi thêm remote, bạn có thể kiểm tra bằng dvc remote list để xem danh sách remote. Nếu muốn đổi remote mặc định, dùng dvc remote default <name>.

Đẩy dữ liệu lên remote

Khi remote đã sẵn sàng và bạn đã dvc add một số dữ liệu/mô hình, bước tiếp theo là đẩy dữ liệu lên remote. Lệnh thực hiện việc này là

1
2
dvc push
git commit data/data.xml.dvc -m "Dataset updates"

Lệnh dvc push sẽ upload tất cả các file dữ liệu/mô hình trong cache (những file đã được dvc add và chưa có trên remote) lên remote storage mặc định. Sau khi chạy, bạn sẽ thấy trong thư mục remote xuất hiện các file được tổ chức theo hash (DVC lưu trong dvcstore theo cấu trúc hash để tránh trùng lặp).

Tải dữ liệu từ remote

Ngược lại với push, lệnh dvc pull dùng để tải dữ liệu từ remote về máy local (vào cache DVC), khôi phục các file dữ liệu vào đúng vị trí làm việc. Tình huống hay dùng dvc pull là khi bạn hoặc đồng đội clone một dự án có dùng DVC – sau khi git clone về có code và file .dvc, bạn cần kéo dữ liệu thực về. Chỉ cần chạy:

1
dvc pull

DVC sẽ đọc các file .dvcdvc.lock hiện có, xác định những dữ liệu nào cần cho workspace hiện tại, sau đó tải chúng từ remote về cache và link ra thư mục làm việc. Sau lệnh này, bạn sẽ có đầy đủ dữ liệu giống như máy của người đẩy dữ liệu.

Thay đổi data

Nếu như data thay đổi thì ta sẽ thực hiện cập nhật như nào. Giả sử, sau khi thay đổi nội dung trong file data.csv, ví dụ mình thêm 1 dòng dữ liệu vào file:

1
echo "6,Frank,29" >> data/data.csv

ta sẽ cập nhật sự thay đổi như sau:

1
dvc add data/data.csv

Sau đó, ta thực hiện dvc push để cập nhật sự thay đổi trên remote storage.

1
2
3
dvc push
git commit data/data.csv.dvc -m "Dataset updates"
git push

Quay lại version trước của data

Để xem các version trước bằng cách

1
2
3
4
git log --oneline -- data/data.csv.dvc

# Lấy hash cũ (ví dụ abc123), rồi:
git checkout abc123 -- data/data.csv.dvc

Ví dụ để quay trở lại version trước gần nhất của data.

1
2
3
git checkout HEAD~1 data/data.csv.dvc # Lùi file .dvc về phiên bản trước (HEAD~1)
dvc checkout
git commit data/data.csv.dvc -m "Revert dataset updates"

Ngoài việc quản lý dữ liệu, DVC còn hỗ trợ tự động hóa toàn bộ quy trình xử lý dữ liệu và huấn luyện mô hình thông qua pipelines. Một pipeline trong DVC được tạo thành từ nhiều stage, mỗi stage đại diện cho một bước trong quy trình Machine Learning, chẳng hạn như tiền xử lý dữ liệu, trích xuất đặc trưng hay huấn luyện mô hình. Bạn có thể tìm hiểu chi tiết hơn tại: DVC Data Pipelines, hoặc chờ mình chia sẻ trong bài viết sắp tới nhé.

This post is licensed under CC BY 4.0 by the author.