Bộ công cụ OSS thay thế dịch vụ trả tiền: MLflow, DVC, MinIO
Bài trước bạn đã có bản đồ chi phí MLOps: compute, storage và lớp dịch vụ quản lý. Bài này trả lời câu hỏi tiếp theo: lớp dịch vụ quản lý đó, thứ thường ngốn tiền nhất khi đi theo hướng SaaS, có thể thay bằng phần mềm mã nguồn mở tự host hay không, và thay bằng gì.
Sau 30 phút này, bạn sẽ:
- Nêu được ba mảnh ghép tối thiểu của một stack OSS: MLflow, DVC, MinIO.
- Biết mỗi công cụ giải quyết đúng loại chi phí nào (compute, storage, hay dịch vụ quản lý).
- Hiểu cách ba công cụ nối với nhau trong một pipeline.
- Ước lượng được chi phí thật của stack này trên một VPS rẻ.
Ba mảnh ghép thay cho ba nhóm dịch vụ trả tiền
| Nhu cầu | Dịch vụ trả tiền thường dùng | Thay bằng OSS |
|---|---|---|
| Theo dõi thí nghiệm, đăng ký model | Experiment tracking + model registry hosted | MLflow (tự host) |
| Version hóa dữ liệu và model lớn | Data versioning SaaS | DVC + remote storage |
| Lưu artifact, dataset, checkpoint | Object storage managed | MinIO (tự host) |
Nguyên tắc chọn: chỉ trả tiền cho thứ bạn không muốn tự vận hành, còn lại tự host. Với một pipeline học tập và cả production nhỏ, ba công cụ trên là đủ.
MLflow: trục theo dõi thí nghiệm và đăng ký model
MLflow gồm bốn thành phần, nhưng bạn chỉ cần hai thành phần đầu ở giai đoạn này:
- Tracking: mỗi lần chạy (
run) lưu lại params, metrics và artifacts. Đây là nơi bạn trả lời "lần train nào tốt nhất, vì sao". - Model Registry: đặt tên, đánh phiên bản và gắn trạng thái cho model (staging, production) để serving biết lấy bản nào.
- Projects và Recipes: đóng gói môi trường chạy, dùng sau nếu cần.
Khi chạy thật, đừng dùng mặc định. Mặc định của mlflow server là SQLite và thư mục local, ổn cho máy cá nhân nhưng sẽ vỡ khi nhiều người ghi đồng thời hoặc khi bạn xóa VPS:
mlflow server \
--backend-store-uri postgresql://mlflow:pass@localhost/mlflow \
--default-artifact-root s3://mlflow-artifacts/ \
--host 0.0.0.0 --port 5000
Sign in to view the full content of this lesson. Sign in
Trỏ artifact root vào bucket MinIO (qua biến môi trường MLFLOW_S3_ENDPOINT_URL) để artifact sống độc lập với VPS.
Bài tập nhỏ: Bạn muốn so sánh 3 cấu hình siêu tham số cho capstone và giữ lại model tốt nhất. Cần log những gì?
Gợi ý đáp án
Log params (learning rate, số epoch, kích thước batch), metrics (loss, F1), và artifact (file model, confusion matrix). Sau đó gọi mlflow.register_model để đưa bản tốt nhất vào Registry, gắn nhãn staging. Không log cả dataset vào MLflow, dữ liệu đó thuộc về DVC.
DVC: version hóa dữ liệu mà không làm phình Git
Git giỏi text, tệ với file lớn: một dataset vài trăm MB đủ làm repo phình, clone chậm và không thể rollback sạch. DVC đảo cách làm: dữ liệu thật nằm ngoài Git, Git chỉ giữ con trỏ.
Luồng tối thiểu:
dvc init
dvc add data/raw.csv # sinh ra data/raw.csv.dvc (hash + size)
git add data/raw.csv.dvc .gitignore
dvc remote add -d storage s3://dvc-remote
dvc push # đẩy blob từ cache lên MinIO
Vài điểm cần nhớ:
dvc addtạo metafile.dvc; nội dung file thật vào.dvc/cache.dvc push/dvc pullđồng bộ cache với remote, đây là lý do MinIO xuất hiện trong stack.dvc.yamlmô tả pipeline (stage, phụ thuộc, output),dvc reprochạy lại phần đã đổi.dvc.lockghi lại hash để đảm bảo tái lập.
Bài tập nhỏ: Vì sao nên đặt remote của DVC trên MinIO thay vì ổ đĩa của chính VPS đang train?
Gợi ý đáp án
Vì ổ đĩa gắn với compute: xóa hoặc thay VPS là mất dữ liệu, và mỗi lần dựng máy mới phải copy tay. Object storage tách khỏi compute, rẻ, bền hơn, có thể bật versioning, và nhiều máy (máy dev, runner CI) cùng dvc pull được.
MinIO: object storage tự host, tương thích S3
MinIO là một binary duy nhất, chạy được trên VPS 2 GB RAM, cung cấp API tương thích S3. Đây là điểm mấu chốt về chi phí: vì tương thích S3, MLflow và DVC dùng nó không cần sửa code, sau này chuyển sang S3 thật cũng chỉ đổi endpoint.
minio server /mnt/data --console-address ":9001"
# API S3: cổng 9000, console quản trị: cổng 9001
Trong console, tạo bucket riêng cho từng mục đích: mlflow-artifacts, dvc-remote, models. Đừng dùng một bucket chung cho tất cả, vì sau này bạn không tách được vòng đời dữ liệu (xóa dataset cũ mà không đụng model production).
Bài tập nhỏ: Với capstone, bạn cần 3 bucket. Đặt tên và mô tả vòng đời từng bucket.
Gợi ý đáp án
dvc-remote: dữ liệu thô và processed, giữ lâu, bật versioning. mlflow-artifacts: metric phụ, biểu đồ, file model tạm, có thể dọn theo quý. models: chỉ chứa model đã promote lên production, giữ lâu, backup định kỳ. Ba vòng đời khác nhau nên phải ba bucket.
Ghép ba công cụ thành một luồng
flowchart TD
Code["💻<br/>Code + dvc.yaml"] --> Git["🌿<br/>Git"]
Raw["📁<br/>Dữ liệu thô"] --> DVC["📦<br/>DVC"]
Git --> DVC
DVC -->|dvc push| MinIO["🪣<br/>MinIO buckets"]
Train["🏋️<br/>Train"] --> MLF["📊<br/>MLflow Tracking"]
Git --> Train
MLF -->|artifacts| MinIO
MLF --> Registry["🗂️<br/>Model Registry"]
Registry --> Serve["🚀<br/>Serving"]
Đọc sơ đồ theo chiều: Git giữ code và metafile, DVC giữ dữ liệu, MLflow giữ kết quả thí nghiệm, MinIO là nơi lưu mọi blob. Không công cụ nào ôm việc của công cụ khác, đó là lý do stack này rẻ và dễ thay thế từng phần.
Kiểm tra nhanh: _____ giữ params, metrics, artifacts. DVC giữ dữ liệu lớn dưới dạng _____ nhỏ. MinIO cung cấp API tương thích _____, với cổng API mặc định là _____.
Chi phí thực tế của stack này
| Khoản | Ước tính (giá công khai, tự kiểm tra lại) |
|---|---|
| VPS 2 vCPU / 4 GB RAM | khoảng 5 đến 12 USD/tháng |
| Block storage 50 GB | khoảng 0,25 đến 0,5 USD/tháng |
| MLflow, DVC, MinIO | 0 USD bản quyền |
| Công sức vận hành | 2 đến 4 giờ/tháng (backup, nâng cấp, sửa lỗi) |
So với một dịch vụ tracking hosted cho 3 người, thường vài chục USD mỗi tháng, bạn tiết kiệm tiền máy rất nhanh. Nhưng chi phí ẩn lớn nhất không phải tiền: đó là thời gian bạn thành admin của chính mình.
Bài tập nhỏ: Bạn lưu 50 GB dataset và 20 model, mỗi model 200 MB. Tính dung lượng tổng và cho biết storage có phải vấn đề chi phí không.
Gợi ý đáp án
50 + (20 × 0,2) = 54 GB. Với block storage khoảng 0,005 USD/GB-tháng, tức chưa tới 0,3 USD/tháng (managed object storage standard đắt hơn khoảng 4 đến 5 lần, vẫn dưới 1,5 USD). Kết luận: storage gần như miễn phí ở quy mô này, tiền thật nằm ở compute chạy liên tục và thời gian người vận hành.
Kinh nghiệm chọn stack: bốn cạm bẫy hay gặp
- Để MLflow chạy SQLite trên VPS production. Một lần VPS chết là mất toàn bộ lịch sử thí nghiệm. Dùng Postgres và backup định kỳ, hoặc chấp nhận mất dữ liệu một cách có ý thức.
- Commit dữ liệu lớn vào Git "cho nhanh". Repo phình, clone chậm, và bạn sẽ mất nhiều thời gian hơn để dọn so với việc học DVC ngay từ đầu.
- Dùng một bucket MinIO cho mọi thứ. Không tách được vòng đời, không phân quyền được, và rất khó xóa an toàn.
- Tự host tất cả mọi thứ ngay ngày đầu. Với người mới, chỉ cần MLflow và MinIO ở tuần đầu; thêm DVC khi dataset bắt đầu vượt vài chục MB.
Quy tắc của tôi: mỗi thành phần tự host phải trả lời được "nếu nó chết lúc 2 giờ sáng, tôi mất gì và mất bao lâu để dựng lại". Không trả lời được thì chưa nên tự host.
Chốt lại và bước tiếp theo
- MLflow lo tracking và registry, DVC lo version dữ liệu, MinIO lo lưu trữ blob tương thích S3. Ba công cụ bù trừ nhau, không chồng chéo.
- Cấu hình đúng ngay từ đầu (Postgres cho backend store, artifact root trỏ vào MinIO) rẻ hơn nhiều so với sửa sau.
- Ở quy mô capstone, tiền storage gần như không đáng kể; thời gian vận hành mới là chi phí thật.
Bài tiếp theo chúng ta sẽ rời trang giấy: dựng đúng ba công cụ này trên một VPS rẻ, từ cài đặt, cấu hình cổng, đến kiểm tra lần chạy đầu tiên ghi được artifact vào MinIO.