🧰 Bộ công cụ OSS thay thế dịch vụ trả tiền: MLflow, DVC, MinIO

By Ngọc Vương Trương

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 add tạ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.yaml mô tả pipeline (stage, phụ thuộc, output), dvc repro chạy lại phần đã đổi. dvc.lock ghi 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.