🗺️ MLOps là gì và bản đồ chi phí hạ tầng

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

Bài 1.1 nằm ở đâu trong hành trình của bạn

Đây là bài đầu tiên của khóa, nên chúng ta chưa đụng vào lệnh cài đặt nào. Việc của 25 phút này là nhìn rõ bức tranh: một pipeline MLOps gồm những tầng nào, và tầng nào thực sự rút tiền khỏi tài khoản của bạn. Kinh nghiệm của tôi sau nhiều lần làm tràn ngân sách: người mới thường đau đầu vì công cụ, còn tiền thì mất ở những chỗ không ai ngờ.

Sau bài này, bạn cần làm được:

  • Phát biểu MLOps là gì bằng một câu của riêng bạn, và chỉ ra chỗ khác biệt so với DevOps thường.
  • Kể tên 6 tầng của một pipeline MLOps thực tế.
  • Chỉ ra khoản chi nào lớn nhất, khoản nào gần như bằng 0, và ba khoản chi ẩn.
  • Ước lượng chi phí tháng cho project capstone bằng giấy bút, trước khi tạo bất kỳ tài nguyên nào.

MLOps là vòng lặp có chi phí, không phải một bộ công cụ

MLOps là tập hợp thực hành, công cụ và quy trình để đưa model từ notebook ra môi trường thật, rồi giữ cho nó còn đúng trong nhiều tháng sau đó. Chữ "giữ cho nó còn đúng" là phần khó và cũng là phần tốn tiền.

So với DevOps thường, MLOps thêm hai thứ:

  1. Dữ liệu và model là artifact có version. Code thì Git lo, nhưng dataset 20 GB và file model thì Git không lo nổi. Bạn cần một nơi lưu riêng (bài sau sẽ là DVC + MinIO).
  2. Chất lượng model giảm dần theo thời gian. Khi dữ liệu thực tế lệch khỏi dữ liệu train (drift), model vẫn trả kết quả nhưng sai dần. Pipeline phải chạy lại, nghĩa là chi phí train không phải trả một lần mà trả lặp lại.
flowchart TD
    Data["📦<br/>Dữ liệu thô"] --> Prep["🧹<br/>Đặc trưng"]
    Prep --> Train["🏋️<br/>Train"]
    Train --> Reg["🗂️<br/>Registry"]
    Reg --> Serve["🚀<br/>Serving"]
    Serve --> Mon["📊<br/>Monitoring"]
    Mon -->|drift| Data

Sáu tầng trên là xương sống của capstone xuyên suốt khóa. Ví dụ ta dùng từ đầu đến cuối: một model dự đoán giá thuê nhà từ dữ liệu dạng bảng. Bài toán nhỏ, train nhanh, phù hợp với hạ tầng rẻ.

Bài tập 1. Với project dự đoán giá thuê nhà, viết ra 6 tầng của pipeline. Đánh dấu tầng nào phải chạy liên tục, tầng nào chỉ chạy theo đợt.

Gợi ý đáp án

Dữ liệu (cập nhật định kỳ), đặc trưng (chạy lại mỗi lần có dữ liệu mới), train (theo đợt, vài giờ mỗi tháng), registry (chạy thường trực nhưng tải rất nhẹ), serving (chạy 24/7, đây là tầng duy nhất bắt buộc luôn bật), monitoring (chạy thường trực, tải nhẹ). Chỉ serving và monitoring là không tắt được.

Bản đồ chi phí: tầng nào ngốn tiền, tầng nào gần như miễn phí

Mỗi tầng tiêu tiền theo một đơn vị khác nhau. Nắm được đơn vị tính là nắm được cách kiểm soát.

Tầng Đơn vị tính tiền Hành vi chi phí Tắt được không?
Lưu trữ dữ liệu, artifact GB-tháng Tăng đơn điệu, không bao giờ tự giảm Xoá được bản cũ
Train, thí nghiệm Giờ CPU/GPU Bùng nổ theo đợt, vài giờ mỗi lần Tắt ngay khi xong
Tracking, registry GB-tháng + RAM Rất nhỏ, chạy chung VPS được Chạy chung, không tắt
Serving, suy luận Giờ máy chạy 24/7 Đều đặn, lớn nhất Không, nếu có người dùng
Monitoring, log GB log-tháng Tăng theo lưu lượng và thời gian lưu Giảm thời gian lưu
Egress, băng thông ra GB truyền ra ngoài Ẩn, dễ tăng vọt Hạn chế đường truyền

Ba quy tắc rút ra từ bảng này:

  • Bạn trả tiền cho thời gian máy chạy, không phải cho số model. Một VPS 4 USD/tháng chạy 30 ngày đắt hơn một GPU thuê 3 giờ, dù GPU có vẻ "xa xỉ" hơn.
  • Train là chi phí một lần, serving là chi phí mỗi giờ. Mọi tối ưu chi phí nghiêm túc đều bắt đầu từ serving.
  • Storage không bao giờ tự giảm. Mỗi lần train lại mà không dọn artifact cũ là một lần cộng thêm vào hoá đơn tháng sau.

Note: Đừng học thuộc bảng giá của nhà cung cấp nào. Hãy học cách đọc bảng giá: tìm đơn vị tính, tìm điều kiện tắt, tìm phí egress. Ba thông tin đó quyết định 90% hoá đơn.

  • Khoản chi thường lớn nhất trong một pipeline chạy thật là _____.
  • Train có đặc điểm _____ nên có thể tắt ngay sau khi xong.
  • Chi phí truyền dữ liệu ra khỏi nhà cung cấp gọi là _____.
  • Dữ liệu và artifact được tính theo đơn vị _____.
  • Máy bật nhưng không phục vụ request nào gọi là _____.

Bài tập 2. Ước lượng chi phí tháng cho capstone với giả định: VPS serving 4 USD/tháng, train 10 giờ spot giá 0,02 USD/giờ, lưu trữ 30 GB giá 0,015 USD/GB-tháng, egress 20 GB giá 0,09 USD/GB. Khoản nào lớn nhất?

Gợi ý đáp án

Serving 4 USD, train 0,2 USD, lưu trữ 0,45 USD, egress 1,8 USD. Tổng khoảng 6,45 USD. Serving chiếm hơn 60%, egress đứng thứ hai dù gần như không ai để ý. Nếu thay serving bằng endpoint managed tính theo giờ, cùng tải đó thường gấp 5 đến 10 lần.

Ba khoản chi ẩn làm vỡ ngân sách

Egress. Kéo dataset 20 GB ra khỏi object storage mỗi lần train, ba lần một tháng, là 60 GB lặng lẽ. Cách chữa: để compute nằm cùng vùng với dữ liệu, và cache dataset ngay trên máy train.

Idle instance. Máy bật, không ai gọi, vẫn bị tính tiền. Một GPU để quên qua đêm có thể bằng cả tháng VPS. Cách chữa: tắt theo lịch, hoặc chỉ bật serving khi có traffic.

Log và artifact giữ vô hạn. Log là thứ dễ bật nhất và khó tắt nhất. Đặt chính sách lưu 7 đến 14 ngày cho log, và giữ tối đa 3 phiên bản model gần nhất trên đường dẫn nóng.

Khoản thứ tư, không hẳn là ẩn nhưng hay bị bỏ qua: premium của dịch vụ managed. Bạn trả thêm tiền để không phải vận hành. Ở khóa này ta chọn ngược lại, tự host bộ công cụ mã nguồn mở, vì quy mô project nhỏ thì phần vận hành rẻ hơn nhiều so với phần premium.

Bài tập 3. Liệt kê mọi tài nguyên bạn định tạo cho capstone và ghi bên cạnh: đơn vị tính tiền, có tắt được không, ai chịu trách nhiệm tắt.

Gợi ý đáp án

Ví dụ tối thiểu: 1 VPS (giờ chạy, không tắt, bật cùng serving), 1 bucket MinIO (GB-tháng, dọn theo quý), 1 container MLflow (chạy chung VPS, không phát sinh), 1 cronjob train (giờ máy, tự tắt sau khi chạy). Nếu một dòng không trả lời được "ai tắt", đó chính là chỗ sẽ phát sinh hoá đơn bất ngờ.

Trước khi mở ví: bốn câu hỏi và ba cạm bẫy

Trước khi bật bất kỳ dịch vụ nào, hỏi bốn câu: Nó tính tiền theo cái gì? Tắt bằng cách nào? Có bản OSS tự host tương đương không? Nếu traffic gấp 10 lần thì hoá đơn thành bao nhiêu?

Ba cạm bẫy tôi đã gặp thật:

  • Bật GPU "để tiện thử" rồi quên tắt. Luôn đặt lịch tắt hoặc dùng script tự huỷ sau N giờ.
  • Chọn managed tracking vì tiện, rồi nhận ra mình trả tiền cho mỗi lần log metric. Với vài chục nghìn lần log mỗi tháng, con số không nhỏ.
  • Để serving luôn bật trong giai đoạn thử nghiệm, khi chưa có người dùng nào. Giai đoạn thử thì chạy batch hoặc bật theo giờ là đủ.

Một mẹo nhỏ nhưng hiệu quả: ghi chi phí ước tính vào README của repo ngay từ ngày đầu, cập nhật mỗi tuần. Khi con số tăng bất thường, bạn thấy ngay thay vì đợi sao kê cuối tháng.

Chốt lại và mở sang bộ công cụ tự host

  • MLOps là vòng lặp có chi phí: dữ liệu, đặc trưng, train, registry, serving, monitoring, rồi quay lại khi có drift.
  • Serving chạy 24/7 là khoản chi phối; train chỉ là chi phí theo đợt.
  • Ba khoản ẩn cần canh: egress, idle instance, log và artifact giữ vô hạn.
  • Mọi quyết định công cụ nên quy về một câu: dịch vụ này tính tiền theo gì và tắt thế nào.

Bài tiếp theo đi thẳng vào phần thay thế: MLflow, DVC và MinIO, bộ công cụ mã nguồn mở sẽ trám đúng những tầng trong bảng chi phí vừa rồi, và ta sẽ xem cái giá thật của việc tự host là gì.