1. Viết Script Python để Load Dữ liệu từ DVC
Cài đặt môi trường và thư viện cần thiết
Trước khi viết script, cần đảm bảo môi trường Python đã cài đặt các thư viện `dvc`, `pandas`, và `scikit-learn` để có thể tương tác với DVC API và xử lý dữ liệu.
Chạy lệnh sau trong thư mục dự án của bạn:
pip install dvc pandas scikit-learn
Kết quả mong đợi: Không báo lỗi, các thư viện được cài đặt thành công.
Viết Script huấn luyện tích hợp DVC
Chúng ta sẽ tạo một file Python `train.py` sử dụng `dvc.api` để đọc dữ liệu trực tiếp từ version mà DVC quản lý. Điều này đảm bảo script luôn chạy trên đúng phiên bản dữ liệu được khai báo trong `dvc.lock`.
Tạo file train.py với nội dung hoàn chỉnh sau:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import dvc.api
import os
# Lấy đường dẫn file dữ liệu từ DVC
# DVC sẽ tự động checkout file tương ứng với version trong dvc.lock
data_path = dvc.api.read("data/processed/train.csv")
# Đọc dữ liệu
df = pd.read_csv(data_path)
# Tách dữ liệu huấn luyện và kiểm tra
X = df.drop("target", axis=1)
y = df["target"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Khởi tạo và huấn luyện mô hình
model = LogisticRegression()
model.fit(X_train, y_train)
# Đánh giá mô hình
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# In ra kết quả
print(f"Model Accuracy: {accuracy}")
# Lưu kết quả vào file logs để DVC track
os.makedirs("logs", exist_ok=True)
with open("logs/training_result.txt", "w") as f:
f.write(f"Accuracy: {accuracy}")
print("Training completed. Results saved to logs/training_result.txt")
Kết quả mong đợi: Script chạy thành công, in ra độ chính xác của mô hình và tạo file kết quả trong thư mục `logs`.
Verify kết quả
Chạy script để kiểm tra xem DVC có đọc đúng dữ liệu không:
python train.py
Kiểm tra file kết quả:
cat logs/training_result.txt
Nếu thấy độ chính xác và không có lỗi về đường dẫn file, bước này đã thành công.
2. Cấu hình DVC để Tự động Cập nhật sau khi Huấn luyện
Khai báo tham số trong params.yaml
DVC cần biết các tham số huấn luyện để theo dõi sự thay đổi. Chúng ta sẽ tạo file `params.yaml` để lưu các biến như `learning_rate` hoặc `epochs`.
Tạo file params.yaml với nội dung:
learning_rate: 0.01
epochs: 100
batch_size: 32
Kết quả mong đợi: File được tạo và chứa các tham số mặc định.
Chạy huấn luyện và commit kết quả vào DVC
Sau khi chạy script, DVC cần được thông báo để lưu lại trạng thái của các artifact (dữ liệu đầu vào) và metrics (kết quả đầu ra). Chúng ta sẽ sử dụng lệnh `dvc run` để tạo một pipeline stage đơn giản.
Trước tiên, đảm bảo đã có file `train.py` và `params.yaml`. Chạy lệnh sau để tạo stage huấn luyện:
dvc run -n train -d params.yaml -d data/processed/train.csv -o logs/training_result.txt -M logs/training_result.txt python train.py
Giải thích các flag:
- -n train: Đặt tên cho stage này là "train".
- -d: Declare dependencies (phụ thuộc). DVC sẽ theo dõi `params.yaml` và file dữ liệu.
- -o: Declare output. DVC sẽ lưu file kết quả vào remote storage.
- -M: Declare metric. DVC sẽ trích xuất số liệu từ file này để hiển thị trên dashboard.
Kết quả mong đợi: DVC tạo file `dvc.lock` cập nhật hash của đầu vào/đầu ra và tạo file `.dvc` tương ứng cho output.
Verify kết quả
Kiểm tra file lock đã được tạo:
cat dvc.lock
Chạy lệnh xem kết quả metrics mà DVC đã lưu:
dvc metrics show
Bạn sẽ thấy bảng hiển thị `logs/training_result.txt` với giá trị `Accuracy`.
3. Sử dụng DVC Pipeline để Tự động hóa Tiền xử lý Dữ liệu
Tạo Script tiền xử lý (Preprocessing)
Chúng ta cần tách biệt bước làm sạch dữ liệu ra khỏi bước huấn luyện để tạo pipeline. Tạo file preprocess.py:
import pandas as pd
import os
import dvc.api
# Đọc dữ liệu thô từ DVC
raw_data_path = dvc.api.read("data/raw/train.csv")
# Đọc và xử lý
df = pd.read_csv(raw_data_path)
# Giả sử xóa các cột không cần thiết và lưu vào processed
df_clean = df.drop(columns=["unnamed_col1", "unnamed_col2"])
# Đảm bảo thư mục output tồn tại
os.makedirs("data/processed", exist_ok=True)
# Lưu dữ liệu đã xử lý
output_path = "data/processed/train.csv"
df_clean.to_csv(output_path, index=False)
print(f"Preprocessing done. Saved to {output_path}")
Kết quả mong đợi: Script có khả năng đọc file raw và tạo file processed.
Xây dựng Pipeline hoàn chỉnh
Bây giờ chúng ta sẽ nối hai bước: Preprocessing -> Training. DVC sẽ tự động chạy preprocessing trước khi training nếu dữ liệu raw thay đổi.
Xóa các file lock/output cũ (nếu có) để bắt đầu lại pipeline sạch sẽ, sau đó chạy lệnh tạo pipeline:
dvc pipeline run -f
Hoặc nếu muốn tạo pipeline mới từ đầu với các tham số rõ ràng, dùng lệnh:
dvc run -n preprocess -d data/raw/train.csv -o data/processed/train.csv python preprocess.py && dvc run -n train -d params.yaml -d data/processed/train.csv -o logs/training_result.txt -M logs/training_result.txt python train.py
Lệnh trên tạo hai stage: `preprocess` và `train`, trong đó `train` phụ thuộc vào output của `preprocess`.
Kết quả mong đợi: DVC tạo file `dvc.lock` mới mô tả cả hai stage và các mối liên kết giữa chúng.
Verify kết quả
Hiển thị cấu trúc pipeline dưới dạng biểu đồ văn bản:
dvc dag
Nếu có lỗi hiển thị, hãy thử:
dvc pipeline show
Bạn sẽ thấy mũi tên chỉ từ `preprocess` sang `train`.
4. Chạy Thử nghiệm End-to-End từ Dữ liệu đến Mô hình
Chạy toàn bộ Pipeline
Bây giờ, hãy giả lập việc cập nhật dữ liệu hoặc tham số để xem DVC tự động chạy lại các bước cần thiết.
Thay đổi một giá trị trong `params.yaml`:
sed -i 's/epochs: 100/epochs: 200/' params.yaml
Sau đó chạy lệnh để kích hoạt pipeline:
dvc pipeline run
Kết quả mong đợi: DVC sẽ nhận ra `params.yaml` đã thay đổi, chỉ chạy lại stage `train` (vì `preprocess` không bị ảnh hưởng), và cập nhật lại file `logs/training_result.txt`.
Kiểm tra sự thay đổi trong Metrics
So sánh kết quả trước và sau khi thay đổi tham số:
dvc metrics diff
Kết quả mong đợi: DVC hiển thị sự khác biệt về giá trị `Accuracy` giữa commit hiện tại và commit trước đó.
Commit toàn bộ thay đổi vào Git
Sau khi pipeline chạy thành công, cần commit các file cấu hình DVC (`dvc.lock`, `.dvc`) vào Git để lưu lại trạng thái của phiên huấn luyện này.
git add dvc.lock params.yaml logs/training_result.txt.dvc && git commit -m "Update training pipeline with new epochs"
Kết quả mong đợi: Commit thành công, lịch sử Git lưu lại sự thay đổi của quy trình huấn luyện.
Verify kết quả cuối cùng
Xác nhận toàn bộ luồng dữ liệu đã được ghi lại đúng cách:
dvc exp show
Nếu bạn đang ở môi trường phát triển, lệnh này sẽ hiển thị các experiment đã chạy. Nếu chỉ là pipeline đơn giản, hãy kiểm tra file lock:
cat dvc.lock
Xác nhận hash của `data/processed/train.csv` trong stage `train` khớp với hash output của stage `preprocess`.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng DataOps với DVC, MLflow và Kubernetes cho vòng đời AI
« Phần 2: Quản lý dữ liệu phiên bản với DVC
Phần 3: Tích hợp DVC vào quy trình huấn luyện ML »