Cấu hình MLflow Client và Log dữ liệu huấn luyện
Bước đầu tiên là thiết lập môi trường Python để giao tiếp với MLflow Server đã được deploy trên Kubernetes (từ Phần 4). Chúng ta cần chỉ định địa chỉ endpoint của MLflow Server để mọi thông tin huấn luyện được gửi về đúng nơi lưu trữ.
Tại sao: MLflow hoạt động theo kiến trúc Client-Server. Client (code training của bạn) cần biết URI của Server để đẩy các tham số, chỉ số và artifact. Nếu không cấu hình đúng, dữ liệu sẽ không được lưu hoặc bị ghi vào local file thay vì remote storage.
Trước khi chạy code huấn luyện, ta cần cài đặt thư viện client và set biến môi trường.
pip install mlflow dvc
Thư viện được cài đặt thành công. Tiếp theo, ta cần xác định URL của MLflow Server. Giả sử trong Phần 4, bạn đã expose MLflow qua service có địa chỉ IP hoặc domain là mlflow-server trên port 5000.
export MLFLOW_TRACKING_URI=http://mlflow-server:5000
Biến môi trường được đặt. Bây giờ ta sẽ viết script huấn luyện mô hình để log dữ liệu.
Tạo file script huấn luyện với tên train_model.py trong thư mục dự án của bạn. Script này sẽ sử dụng API của MLflow để ghi nhận quá trình training.
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
import numpy as np
# Thiết lập run name để dễ quản lý
mlflow.set_experiment("Iris_Classification_Experiment")
# Khởi tạo dữ liệu mẫu
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)
# Khởi tạo model
model = RandomForestClassifier(n_estimators=100, random_state=42)
# Bắt đầu một MLflow run
with mlflow.start_run(run_name="rf_v1_initial"):
# 1. Log Parameters (Tham số)
# Tại sao: Để theo dõi các siêu tham số (hyperparameters) nào đã tạo ra kết quả này.
mlflow.log_param("n_estimators", 100)
mlflow.log_param("random_state", 42)
# Huấn luyện mô hình
model.fit(X_train, y_train)
# Đánh giá mô hình
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred, average='weighted')
# 2. Log Metrics (Chỉ số)
# Tại sao: Để theo dõi hiệu suất (performance) và so sánh giữa các run.
mlflow.log_metric("accuracy", accuracy)
mlflow.log_metric("f1_score", f1)
# 3. Log Artifact (Tài sản)
# Tại sao: Lưu trữ file mô hình đã train để có thể tải về sau này cho việc deploy.
mlflow.sklearn.log_model(model, "model")
print(f"Run finished. Accuracy: {accuracy}")
Chạy script huấn luyện để gửi dữ liệu về MLflow Server.
python train_model.py
Chờ đến khi thấy dòng "Run finished. Accuracy: ..." xuất hiện. Script đã hoàn thành việc log params, metrics và artifact vào MLflow.
Verify kết quả: Mở trình duyệt và truy cập giao diện web của MLflow Server (ví dụ: http://mlflow-server:5000). Bạn sẽ thấy experiment "Iris_Classification_Experiment" với một run có tên "rf_v1_initial". Click vào run đó, bạn sẽ thấy tab "Params" hiển thị n_estimators, tab "Metrics" hiển thị accuracy và tab "Artifacts" hiển thị file mô hình.
Quản lý phiên bản mô hình với Model Registry
Sau khi huấn luyện xong, mô hình nằm trong trạng thái "Unregistered" (chưa đăng ký). Để đưa mô hình vào vòng đời sản xuất (Production), ta cần đăng ký nó vào Model Registry.
Tại sao: Model Registry giúp quản lý các phiên bản (versioning), trạng thái (staging/production) và gắn nhãn (tagging) cho mô hình. Đây là bước bắt buộc trước khi deploy lên Kubernetes.
Chúng ta sẽ sử dụng API để chuyển đổi một run đã log thành một model đã đăng ký. Ta cần lấy run_id của run vừa tạo ở bước trên.
mlflow run --help
Để lấy run_id một cách nhanh chóng, ta có thể dùng lệnh CLI hoặc đọc từ log. Giả sử run_id là abc123def456 (thay bằng ID thực tế của bạn từ UI hoặc log). Dưới đây là script để đăng ký mô hình.
Tạo file register_model.py.
import mlflow
from mlflow.tracking import MlflowClient
# Cấu hình lại URI nếu cần
mlflow.set_tracking_uri("http://mlflow-server:5000")
client = MlflowClient()
# Thông tin run cần đăng ký
run_id = "abc123def456" # Thay thế bằng run_id thực tế của bạn
model_name = "iris_random_forest"
# Đăng ký mô hình từ run đã có
# Tại sao: Tạo một entry mới trong Registry với tên và version tự động tăng.
registered_model = client.register_model(model_name, run_id)
print(f"Model registered successfully: {registered_model.name}, Version: {registered_model.version}")
Chạy script để đăng ký mô hình.
python register_model.py
Kết quả mong đợi: In ra dòng "Model registered successfully: iris_random_forest, Version: 1".
Verify kết quả: Vào giao diện web MLflow, click vào tab "Models". Bạn sẽ thấy model mới có tên "iris_random_forest". Click vào model đó, bạn sẽ thấy cột "Version" hiện số 1 và trạng thái "Production" (mặc định là Production hoặc None tùy config, thường là None ban đầu).
Gắn nhãn (Tagging) và mô tả cho mô hình
Mô hình đã được đăng ký, nhưng cần thông tin bổ sung để đồng nghiệp hoặc hệ thống tự động hiểu ngữ cảnh của phiên bản này.
Tại sao: Tagging giúp lọc và tìm kiếm mô hình dựa trên các tiêu chí như "release_candidate", "experimental", "team_data_science". Mô tả (description) cung cấp ngữ cảnh về cách huấn luyện.
Chúng ta sẽ cập nhật thông tin cho model version vừa tạo.
Tạo file tag_model.py.
from mlflow.tracking import MlflowClient
client = MlflowClient()
model_name = "iris_random_forest"
version = "1"
# Gắn tags
# Tại sao: Tags là cặp key-value giúp phân loại mô hình.
client.set_model_version_tag(model_name, version, "author", "data_engineer_01")
client.set_model_version_tag(model_name, version, "environment", "k8s_dev")
client.set_model_version_tag(model_name, version, "type", "production_candidate")
# Cập nhật mô tả (description)
# Tại sao: Mô tả dài hơn, chứa chi tiết về dữ liệu và phương pháp.
client.update_model_version(model_name, version, description="Random Forest model trained on Iris dataset with 100 estimators. Accuracy 96% on test set.")
print("Tags and description updated successfully.")
Chạy script để cập nhật thông tin.
python tag_model.py
Kết quả mong đợi: Dòng "Tags and description updated successfully." được in ra.
Verify kết quả: Quay lại giao diện web MLflow, vào trang chi tiết của Model "iris_random_forest", chọn Version 1. Bạn sẽ thấy phần "Tags" hiển thị 3 cặp key-value vừa tạo và phần "Description" hiển thị đoạn văn bản mô tả. Các tag này có thể dùng để filter ở danh sách mô hình.
So sánh hiệu suất giữa các phiên bản mô hình
Khi bạn huấn luyện nhiều lần với các tham số khác nhau (ví dụ: thay đổi số lượng cây trong Random Forest), bạn sẽ có nhiều run và nhiều version mô hình. Việc so sánh trực quan là cần thiết để chọn model tốt nhất.
Tại sao: Giúp team Data Science đưa ra quyết định dựa trên dữ liệu thực tế (data-driven decision) thay vì cảm tính.
Đầu tiên, ta cần chạy thêm một phiên bản huấn luyện mới với tham số khác để có dữ liệu so sánh.
Chạy lại script train_model.py nhưng sửa tham số n_estimators thành 200 trong code hoặc truyền vào qua biến môi trường để tạo một run mới.
sed -i 's/n_estimators=100/n_estimators=200/' train_model.py && python train_model.py
Lệnh trên thay đổi tham số trong file và chạy lại script. Một run mới (ví dụ: "rf_v2_200_trees") sẽ được tạo.
Đợi run hoàn thành, sau đó đăng ký nó vào Model Registry với tên tương tự để tạo Version 2.
# Lấy run_id mới từ log hoặc UI, giả sử là xyz789
sed -i 's/abc123def456/xyz789/' register_model.py
python register_model.py
Bây giờ ta có Version 1 và Version 2 của cùng một model "iris_random_forest".
Để so sánh, ta sẽ dùng tính năng built-in của MLflow UI hoặc dùng Python Client để trích xuất metrics.
Tạo file compare_models.py để so sánh bằng code.
from mlflow.tracking import MlflowClient
client = MlflowClient()
model_name = "iris_random_forest"
# Lấy thông tin các version
versions = client.search_model_versions(f"name='{model_name}'")
print(f"{'Version':
Chạy script so sánh.
python compare_models.py
Kết quả mong đợi: Bảng hiển thị 2 dòng tương ứng với Version 1 và Version 2, kèm theo accuracy và f1 score của mỗi version. Bạn có thể thấy sự khác biệt về hiệu suất.
Verify kết quả trên UI: Vào trang "Models", click vào "iris_random_forest". MLflow tự động hiển thị biểu đồ (chart) so sánh các metrics (accuracy, f1_score) theo trục Version hoặc theo trục Run. Bạn cũng có thể chọn nhiều run từ tab "Runs" và dùng tính năng "Compare" để xem bảng so sánh chi tiết các tham số và metrics bên cạnh nhau.
Đ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 4: Cài đặt và cấu hình MLflow trên Kubernetes
Phần 5: Quản lý vòng đời mô hình với MLflow »