MLOps: Quản lý dữ liệu, mô hình và thực nghiệm
Liên kết data version, code, config, run, artifact và release để mô hình có thể truy nguyên và vận hành.
MLOps tổ chức vòng đời của hệ thống học máy, từ dữ liệu đến vận hành và cải tiến. Một dashboard điểm số không đủ nếu không biết model nào, dùng dữ liệu nào và được tạo bằng quy trình nào.
Mục tiêu học tập
- Phân biệt dataset version, run và model artifact.
- Thiết kế metadata đủ tái hiện một lần train.
- Tách monitoring, quyết định retraining và release approval.
Một chuỗi truy nguyên có thể kiểm tra
Nếu model hôm nay cho đầu ra khác hôm qua, cần biết cái gì đã đổi: dữ liệu, code hay cấu hình. Ghi “model_final_v2” trong tên file không đủ phân biệt các lần train với nhau.
Dataset manifest chỉ rõ mẫu và split; code commit định danh logic; config ghi hyperparameters; run ID liên kết metrics, logs và artifacts. Registry lưu phiên bản model cùng metadata phù hợp quy trình của nhóm.
MLflow Tracking là ví dụ công cụ ghi runs, parameters, metrics và artifacts. DVC hỗ trợ versioning và pipeline liên quan dữ liệu; chọn công cụ sau khi đã định nghĩa metadata cần giữ.
Dùng content hash giúp nhận ra artifact thay đổi, nhưng hash không chứa dữ liệu và không thay thế lưu trữ có kiểm soát. Cache hit cũng chỉ đúng nếu dependency graph khai báo đủ inputs và environment ảnh hưởng kết quả.
Versioned pointer trỏ đến dữ liệu bị ghi đè không phải snapshot tái hiện được. Với dữ liệu không được phép chia sẻ, lưu quy trình truy cập và hạn chế một cách minh bạch thay vì hứa người khác sẽ chạy lại được.
Tự động hóa kèm quality gates
Một workflow có thể tự chạy kiểm tra khi code thay đổi, nhưng “chạy xong” không có nghĩa “đủ tốt để phát hành”. Cần tiêu chí về dữ liệu, chất lượng và vận hành trước khi đổi model đang phục vụ.
Tách data validation, training, evaluation, packaging và release. Các gate có thể kiểm tra schema, split separation, metric regression và compatibility. Store artifact bất biến rồi chuyển pointer release theo quyết định đã xác định.
Pipeline retries phải tránh tạo nhiều release ngoài ý muốn. Tách quyền chạy experiment khỏi quyền thay đổi model đang phục vụ; không để một script train tự trở thành quy trình production deployment.
Model, feature pipeline và downstream consumers tạo dependencies ngoài source code truyền thống. Kiểm tra lineage khi đổi taxonomy hoặc xóa feature; một input có thể được consumer chưa được ghi nhận sử dụng.
Theo dõi data drift như một tín hiệu cần điều tra. Nếu label đến muộn, proxy metrics không tự đo được correctness; một quy trình retraining cần đánh giá và gate riêng trước release.
Ví dụ metadata tối thiểu
Mã tạo một bản ghi cấu hình giả định và hash của nó. Nếu đổi seed hoặc learning rate thì fingerprint đổi. Đây là cách thấy metadata có thể được kiểm tra thay vì ghi nhớ bằng tên file.
Một run thực còn cần data version, split manifest, environment, code revision, artifacts và metric definitions. Không nhúng secret hoặc dữ liệu cá nhân vào log để tiện debug. Canonical JSON giúp cùng cấu hình không đổi hash chỉ vì thứ tự key.
Fingerprint cấu hình không chứng minh hai run có cùng outputs: nondeterministic kernels, phần mềm và dữ liệu khác vẫn có thể ảnh hưởng. Lưu provenance theo tầng, kiểm tra restore và diễn tập rollback thay vì chỉ xác nhận hệ thống có nút rollback.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Quản lý nhiều experiment và model revisions trong nhóm.
- Truy nguyên lỗi sau khi thay dữ liệu hoặc feature pipeline.
Điểm mạnh
Tạo liên kết rõ giữa quyết định, dữ liệu và artifacts để kiểm tra và khôi phục.
Giới hạn cần nhớ
Công cụ tracking không tự bảo đảm chất lượng dữ liệu, tái lập số học hay quyết định release đúng.
Thử trong một project nhỏ
Viết manifest cho một lần train gồm data, split, code, config, environment và artifact. Nêu thông tin còn thiếu để khôi phục chính xác model đã phục vụ hôm qua.
import hashlib, json
config = {"seed": 7, "learning_rate": 0.01, "dataset_version": "toy-v1"}
def fingerprint(value):
encoded = json.dumps(value, sort_keys=True, separators=(",", ":")).encode()
return hashlib.sha256(encoded).hexdigest()
assert fingerprint(config) == fingerprint(dict(reversed(list(config.items()))))
assert fingerprint(config) != fingerprint({**config, "seed": 8})
print(fingerprint(config))Fingerprint metadata tự tạo bằng Python chuẩn; không ghi metrics, tạo registry production hoặc gửi dữ liệu tới dịch vụ.
