Cấu hình và ghi log trong quy trình huấn luyện
Bước đầu tiên là tích hợp MLflow vào script huấn luyện để ghi lại tham số (params), chỉ số (metrics) và artifact (tệp mô hình, file dữ liệu). Việc này giúp bạn truy vết lại chính xác điều kiện nào tạo ra kết quả nào.
Tạo file huấn luyện train.py tại thư mục làm việc của bạn với nội dung sau. Script này giả lập việc huấn luyện mô hình hồi quy tuyến tính, ghi log các tham số như learning rate, số epoch, và lưu file mô hình dưới dạng artifact.
import mlflow
import mlflow.sklearn
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error
import numpy as np
# Khởi tạo một run mới hoặc dùng run hiện tại
with mlflow.start_run(run_name="linear-regression-v1") as run:
# 1. Chuẩn bị dữ liệu giả lập
X, y = make_regression(n_samples=100, n_features=1, noise=10)
# 2. Khởi tạo mô hình
model = LinearRegression()
# 3. Ghi log tham số (Params)
# Tại sao: Để biết chính xác các hyperparameter dùng để train
mlflow.log_param("algorithm", "LinearRegression")
mlflow.log_param("n_samples", 100)
# Huấn luyện mô hình
model.fit(X, y)
# Dự đoán và tính metric
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
# 4. Ghi log chỉ số (Metrics)
# Tại sao: Để đánh giá hiệu suất và so sánh giữa các run
mlflow.log_metric("mse", mse)
mlflow.log_metric("rmse", mse ** 0.5)
# 5. Ghi log Artifact (Mô hình)
# Tại sao: Để lưu trữ đối tượng mô hình đã train vào kho chứa
# Lưu cả file mô hình và artifact khác (nếu có)
mlflow.sklearn.log_model(model, "model")
# In thông tin run để verify
print(f"Run ID: {run.info.run_id}")
print(f"Run URL: {mlflow.get_tracking_uri()}/#/runs/{run.info.run_id}")
Kết quả mong đợi: Sau khi chạy script, bạn sẽ thấy thông báo "Run ID" và "Run URL" được in ra console. Dữ liệu sẽ được lưu vào backend (file hoặc database) đã cấu hình trong Phần 4.
Verify kết quả
Chạy script huấn luyện bằng lệnh sau:
python train.py
Truy cập giao diện web MLflow (thường ở port 5000) và kiểm tra tab "Runs". Bạn sẽ thấy một run mới tên "linear-regression-v1". Click vào run đó, kiểm tra tab "Parameters" có "algorithm" và "n_samples", tab "Metrics" có "mse" và "rmse", và tab "Artifacts" chứa thư mục "model".
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 ở trạng thái "Unregistered". Để đưa mô hình vào quy trình sản xuất, bạn cần đăng ký nó vào Model Registry để quản lý vòng đời (Stage: Staging, Production).
Tạo file register_model.py để tự động đăng ký mô hình từ một run cụ thể vào Registry. Script này sử dụng Run ID từ quá trình huấn luyện để tìm artifact và tạo phiên bản mới.
import mlflow
from mlflow.tracking import MlflowClient
# Thay thế bằng Run ID thực tế từ bước train.py, hoặc lấy run mới nhất
# Giả sử chúng ta lấy run mới nhất của experiment "linear-regression-v1"
client = MlflowClient()
# Lấy thông tin run mới nhất
runs = client.search_runs(experiment_id="0", order_by=["start_time DESC"], max_results=1)
if not runs:
raise Exception("Không tìm thấy run nào để đăng ký.")
run_id = runs[0].info.run_id
print(f"Đang đăng ký mô hình từ Run ID: {run_id}")
# Đăng ký mô hình vào Registry
# Source: đường dẫn đến artifact trong run (runs://model)
# name: tên mô hình trong registry (ví dụ: "my-regression-model")
model_name = "my-regression-model"
model_uri = f"runs:/{run_id}/model"
registered_model = client.create_registered_model(model_name)
model_version = client.create_model_version(
name=model_name,
source=model_uri,
run_id=run_id,
tags={"training_date": "2023-10-27", "author": "sysadmin"}
)
print(f"Đã tạo phiên bản mô hình: {model_version.version}")
print(f"Trạng thái ban đầu: {model_version.stage}")
Kết quả mong đợi: Script chạy thành công, in ra thông báo "Đã tạo phiên bản mô hình: 1" và trạng thái mặc định là "None" hoặc "Staging" tùy cấu hình, nhưng quan trọng là mô hình đã xuất hiện trong danh sách Model Registry.
Verify kết quả
Chạy lệnh đăng ký:
python register_model.py
Trên giao diện web MLflow, chuyển sang tab "Models". Bạn sẽ thấy mô hình "my-regression-model" xuất hiện. Click vào mô hình, bạn sẽ thấy danh sách các phiên bản (Version 1). Kiểm tra phần "Tags" để xác nhận các tag đã được gán.
Đổi trạng thái và gắn nhãn mô hình
Khi mô hình đã qua kiểm thử (testing) và sẵn sàng để deploy, bạn cần chuyển trạng thái (Stage) của nó từ "None" sang "Production" hoặc "Staging". Ngoài ra, việc gắn nhãn (tagging) giúp lọc và quản lý mô hình theo ngữ cảnh (ví dụ: version, environment).
Tạo file transition_stage.py để thực hiện việc nâng cấp phiên bản mô hình lên Production. Script này sẽ tìm phiên bản mới nhất của mô hình và cập nhật trạng thái.
import mlflow
from mlflow.tracking import MlflowClient
client = MlflowClient()
model_name = "my-regression-model"
# Lấy phiên bản mới nhất của mô hình
model_version = client.get_latest_versions(model_name)[0]
version_number = model_version.version
print(f"Đang nâng cấp phiên bản: {version_number} lên Production")
# Chuyển đổi trạng thái sang Production
# Tại sao: Để đánh dấu mô hình này là an toàn để deploy lên Kubernetes
client.transition_model_version_stage(
name=model_name,
version=version_number,
stage="Production"
)
# Gắn thêm tag mô tả
client.set_model_version_tag(
name=model_name,
version=version_number,
key="deployment_target",
value="k8s-inference-service"
)
print(f"Trạng thái mới: {client.get_model_version(model_name, version_number).stage}")
Kết quả mong đợi: Script in ra thông báo trạng thái mới là "Production". Khi xem trên giao diện web, biểu tượng của phiên bản đó sẽ đổi màu hoặc có nhãn "Production".
Verify kết quả
Chạy lệnh chuyển đổi:
python transition_stage.py
Trên giao diện MLflow, vào chi tiết mô hình "my-regression-model". Bạn sẽ thấy Version 1 hiện đang ở cột "Production". Tag "deployment_target" với giá trị "k8s-inference-service" sẽ xuất hiện trong danh sách tags.
So sánh hiệu suất giữa các phiên bản mô hình
Khi bạn có nhiều phiên bản mô hình (ví dụ: V1 dùng Linear Regression, V2 dùng Random Forest), việc so sánh trực quan các chỉ số (metrics) là bắt buộc để quyết định phiên bản nào đưa lên Production.
Tạo file compare_models.py để so sánh metrics giữa hai run khác nhau. Script này sẽ lấy dữ liệu từ hai run ID và in ra bảng so sánh, đồng thời tạo một biểu đồ so sánh (nếu chạy trong môi trường có GUI, nhưng ở đây chúng ta in bảng dữ liệu).
import mlflow
from mlflow.tracking import MlflowClient
import pandas as pd
client = MlflowClient()
# Giả sử chúng ta có 2 run ID (cần thay thế bằng ID thực tế từ phần 1)
# Nếu chưa có run thứ 2, hãy chạy train.py thêm một lần với tham số khác để tạo run mới
run_id_1 = "run-id-cua-linear-regression" # Thay bằng ID thực
run_id_2 = "run-id-cua-random-forest" # Thay bằng ID thực
# Lấy metrics của các run
def get_metrics(run_id):
run = client.get_run(run_id)
return run.data.metrics
# Lấy dữ liệu
metrics_1 = get_metrics(run_id_1)
metrics_2 = get_metrics(run_id_2)
# Tạo DataFrame để so sánh
df = pd.DataFrame({
"Run 1 (Linear)": metrics_1,
"Run 2 (Random Forest)": metrics_2
})
print("Bảng so sánh hiệu suất mô hình:")
print(df)
# Phân tích nhanh
mse_1 = metrics_1.get("mse", float('inf'))
mse_2 = metrics_2.get("mse", float('inf'))
if mse_1 < mse_2:
print(f"\n=> Kết luận: Run 1 ({run_id_1[:8]}) có MSE thấp hơn, hiệu suất tốt hơn.")
else:
print(f"\n=> Kết luận: Run 2 ({run_id_2[:8]}) có MSE thấp hơn, hiệu suất tốt hơn.")
Kết quả mong đợi: Script in ra bảng dữ liệu so sánh các metric (mse, rmse) giữa hai run. Dòng kết luận sẽ chỉ rõ run nào có chỉ số MSE thấp hơn (tốt hơn cho hồi quy).
Verify kết quả
Để chạy được script so sánh, bạn cần tạo thêm một run mới. Chạy lại train.py nhưng sửa tham số (ví dụ đổi tên run thành "random-forest-v1") để tạo ra Run ID thứ 2.
# Chạy lần 2 để tạo thêm 1 run
python train.py
Sau đó, mở file compare_models.py, điền đúng hai Run ID vào biến run_id_1 và run_id_2, rồi chạy lệnh:
python compare_models.py
Kết quả in ra màn hình sẽ là bảng so sánh. Ngoài ra, trên giao diện web MLflow, vào tab "Experiments", chọn experiment chứa các run này, sau đó chọn nhiều run và click nút "Compare" để xem biểu đồ so sánh trực quan.
Đ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 5: Quản lý vòng đời mô hình với MLflow
Phần 6: Triển khai mô hình AI lên Kubernetes »