Khóa học
Metaflow là một framework mạnh mẽ để xây dựng và quản lý workflow dữ liệu. Trong hướng dẫn này, bạn sẽ học cách bắt đầu. Cụ thể, chúng ta sẽ đề cập:
- Quy trình cài đặt
- Xây dựng một workflow cơ bản
- Các khái niệm cốt lõi
- Thực tiễn tốt nhất
Kết thúc bài viết, bạn sẽ có kỹ năng cần thiết để tinh gọn và mở rộng workflow của mình một cách hiệu quả!
Metaflow là gì?

Nguồn: Vì sao Metaflow?
Metaflow là một framework Python được thiết kế để hỗ trợ quản lý dự án khoa học dữ liệu. Netflix ban đầu phát triển công cụ này để giúp nhà khoa học dữ liệu và kỹ sư học máy làm việc hiệu quả hơn. Nó đạt được mục tiêu này bằng cách đơn giản hóa các tác vụ phức tạp, như điều phối workflow, đảm bảo quy trình vận hành trơn tru từ đầu đến cuối.
Các tính năng chính của Metaflow gồm tự động quản lý phiên bản dữ liệu, giúp theo dõi thay đổi của workflow, và hỗ trợ workflow có thể mở rộng, cho phép xử lý tập dữ liệu lớn hơn và các tác vụ phức tạp hơn.
Một ưu điểm khác của Metaflow là tích hợp dễ dàng với AWS. Điều này có nghĩa người dùng có thể tận dụng tài nguyên đám mây cho lưu trữ và sức mạnh tính toán. Ngoài ra, API Python thân thiện giúp cả người mới bắt đầu lẫn người dùng giàu kinh nghiệm đều dễ tiếp cận.
Hãy bắt đầu thiết lập nào.
Thiết lập Metaflow
Metaflow khuyến nghị người dùng cài đặt Python 3 thay vì Python 2.7 cho các dự án mới. Tài liệu nêu rằng “Python 3 ít lỗi hơn và được hỗ trợ tốt hơn so với Python 2.7 đã ngừng hỗ trợ.”
Bước tiếp theo là tạo môi trường ảo để quản lý phụ thuộc của dự án. Chạy lệnh sau để thực hiện:
python -m venv venv
source venv/bin/activate
Lệnh này sẽ tạo và kích hoạt môi trường ảo. Sau khi kích hoạt, bạn đã sẵn sàng cài đặt Metaflow.
Metaflow có sẵn dưới dạng gói Python cho MacOS và Linux. Phiên bản mới nhất có thể cài đặt từ kho Metaflow trên Github hoặc PyPi bằng cách chạy lệnh sau:
pip install metaflow
Đáng tiếc là tại thời điểm viết bài, Metaflow chưa hỗ trợ gốc cho người dùng Windows. Tuy nhiên, người dùng Windows 10 có thể sử dụng WSL (Windows Subsystem for Linux) để cài đặt Metaflow, cho phép chạy môi trường Linux ngay trong hệ điều hành Windows. Hay xem tài liệu để có hướng dẫn từng bước cài đặt Metaflow trên Windows 10.
Tích hợp AWS (Tùy chọn)
Metaflow cung cấp tích hợp liền mạch với AWS, cho phép người dùng mở rộng workflow bằng hạ tầng đám mây. Để tích hợp AWS, bạn cần thiết lập thông tin xác thực AWS của mình.
Lưu ý: Các bước này giả định bạn đã có tài khoản AWS và đã cài AWS CLI. Để biết chi tiết, hãy làm theo hướng dẫn trong tài liệu AWS.
- Đầu tiên, cài AWS CLI bằng cách chạy:
pip install awscli
- Cấu hình AWS bằng cách chạy
aws configure
Sau đó, bạn sẽ được nhắc nhập AWS Access Key ID và Secret Access Key — đây là thông tin xác thực mà AWS CLI dùng để xác thực yêu cầu của bạn tới AWS. Lưu ý rằng bạn cũng có thể được yêu cầu nhập vùng (region) và định dạng đầu ra.
Khi đã nhập các thông tin này, xong rồi! Metaflow sẽ tự động sử dụng thông tin xác thực AWS của bạn để chạy workflow.
Xây dựng Workflow đầu tiên với Metaflow
Giờ Metaflow đã được thiết lập, đã đến lúc xây dựng workflow đầu tiên. Trong phần này, tôi sẽ hướng dẫn bạn những điều cơ bản để tạo một flow, chạy nó và hiểu cách nhiệm vụ và bước được tổ chức trong Metaflow.
Kết thúc phần này, bạn sẽ có một workflow xử lý dữ liệu và thực hiện các thao tác đơn giản. Bắt đầu thôi!
Tổng quan về một flow trong Metaflow
Metaflow sử dụng mô hình lập trình dataflow, đại diện chương trình như một đồ thị có hướng của các phép toán. Cách tiếp cận này lý tưởng để xây dựng pipeline xử lý dữ liệu, đặc biệt trong machine learning.
Trong Metaflow, đồ thị các phép toán được gọi là flow. Một flow gồm loạt tác vụ được chia thành các bước. Lưu ý mỗi bước có thể xem là một phép toán được biểu diễn như một nút, với các chuyển tiếp giữa các bước đóng vai trò là các cạnh của đồ thị.

Một chuyển tiếp tuyến tính cơ bản trong Metaflow | Nguồn: Tài liệu Metaflow
Có một vài quy tắc cấu trúc cho flow trong Metaflow. Ví dụ, mọi flow phải có bước start và bước end. Khi một flow được thực thi, gọi là một run, nó bắt đầu ở bước start và được coi là thành công nếu đến được bước end mà không gặp lỗi.
Những gì diễn ra giữa các bước start và end là do bạn quyết định – như bạn sẽ thấy ở phần tiếp theo.
Viết flow đầu tiên của bạn
Dưới đây là một flow đơn giản để bắt đầu. Lưu ý: Có thể chạy mã trong DataLab.
from metaflow import FlowSpec, step
class MyFirstFlow(FlowSpec):
@step
def start(self):
print("Starting the flow!")
self.data = [1, 2, 3, 4, 5] # Example dataset
self.next(self.process_data)
@step
def process_data(self):
self.processed_data = [x * 2 for x in self.data] # Simple data processing
print("Processed data:", self.processed_data)
self.next(self.end)
@step
def end(self):
print("Flow is complete!")
if __name__ == '__main__':
MyFirstFlow()
Trong flow này:
- Bước
start()khởi tạo workflow và định nghĩa một tập dữ liệu. - Bước
process_data()xử lý dữ liệu bằng cách nhân đôi mỗi phần tử. - Bước
end()hoàn tất flow.
Mỗi bước sử dụng decorator @step, và bạn định nghĩa chuỗi flow bằng self.next() để nối các bước.
Chạy flow của bạn
Sau khi viết flow, lưu lại dưới tên my_first_flow.py. Chạy từ dòng lệnh bằng:
py -m my_first_flow.py run
Một tính năng mới được thêm vào Metaflow 2.12 cho phép phát triển và thực thi flow trong notebook.
Để thực thi một flow trong một ô xác định, bạn chỉ cần thêm một dòng NBRunner ở dòng cuối cùng của cùng ô đó. Ví dụ:
from metaflow import FlowSpec, step, NBRunner
class MyFirstFlow(FlowSpec):
@step
def start(self):
print("Starting the flow!")
self.data = [1, 2, 3, 4, 5] # Example dataset
self.next(self.process_data)
@step
def process_data(self):
self.processed_data = [x * 2 for x in self.data] # Simple data processing
print("Processed data:", self.processed_data)
self.next(self.end)
@step
def end(self):
print("Flow is complete!")
run = NBRunner(MyFirstFlow).nbrun()
Nếu bạn gặp lỗi sau:
“Metaflow could not determine your user name based on environment variables ($USERNAME etc.)”
Hãy thêm đoạn sau vào mã trước khi thực thi Metaflow:
import os
if os.environ.get("USERNAME") is None:
os.environ["USERNAME"] = "googlecolab"
Trong cả hai trường hợp, Metaflow sẽ thực thi flow từng bước. Cụ thể, nó sẽ hiển thị đầu ra của mỗi bước trong terminal như sau:

Đầu ra từ đoạn mã trên | Nguồn: Hình ảnh của tác giả
Các khái niệm cốt lõi trong Metaflow
Hiểu các khái niệm cốt lõi của Metaflow là điều thiết yếu để xây dựng workflow dữ liệu hiệu quả và có thể mở rộng. Trong phần này, tôi sẽ đề cập ba khái niệm nền tảng:
- Các bước và phân nhánh
- Artifact dữ liệu
- Quản lý phiên bản
Các yếu tố này là xương sống của cấu trúc và việc thực thi workflow trong Metaflow, giúp bạn quản lý quy trình phức tạp một cách dễ dàng.
Các bước và phân nhánh
Chúng ta đã đề cập ngắn gọn về các bước ở phần trước, nhưng để rõ ràng, ta sẽ nhắc lại. Điều quan trọng nhất cần hiểu về workflow Metaflow là chúng được xây dựng xoay quanh các bước.
Mỗi bước đại diện cho một tác vụ riêng lẻ trong workflow. Nói cách khác, mỗi bước thực hiện một thao tác cụ thể (ví dụ: tải dữ liệu, xử lý, mô hình hóa, v.v.).
Ví dụ chúng ta tạo ở phần “Viết flow đầu tiên” là một phép biến đổi tuyến tính. Bên cạnh các bước tuần tự, Metaflow cũng cho phép phân nhánh workflow. Phân nhánh cho phép bạn chạy nhiều tác vụ song song bằng cách tạo các nhánh thực thi riêng biệt.

Ví dụ về phân nhánh | Nguồn: Tài liệu Metaflow
Lợi ích lớn nhất của phân nhánh là hiệu năng. Phân nhánh cho phép Metaflow thực thi nhiều bước trên nhiều lõi CPU hoặc các instance trên đám mây.
Một phân nhánh trông như sau trong mã:
from metaflow import FlowSpec, step, NBRunner
class BranchFlow(FlowSpec):
@step
def start(self):
print("Starting the flow!")
self.data = [1, 2, 3, 4, 5] # Example dataset
self.next(self.split)
@step
def split(self):
self.next(self.branch1, self.branch2)
@step
def branch1(self):
# Code for branch 1
print("This is branch 1")
self.next(self.join)
@step
def branch2(self):
# Code for branch 2
print("This is branch 2")
self.next(self.join)
@step
def join(self, inputs):
# Merging branches back
print("Branches joined.")
self.next(self.end)
@step
def end(self):
print("Flow is complete!")
run = NBRunner(BranchFlow).nbrun()
|
💡Tóm tắt nhanh: Phân nhánh cho phép người dùng thiết kế workflow phức tạp có thể xử lý đồng thời nhiều tác vụ. |
Artifact dữ liệu
Các artifact dữ liệu là các biến cho phép bạn lưu trữ và truyền dữ liệu giữa các bước trong workflow. Các artifact này duy trì đầu ra của một bước để dùng cho bước tiếp theo — đây là cách dữ liệu được cung cấp cho các bước sau.
Về cơ bản, khi bạn gán dữ liệu vào self trong một bước của lớp Metaflow, bạn đang lưu nó như một artifact, và artifact này có thể được truy cập bởi bất kỳ bước nào khác trong flow (xem chú thích trong mã).
class ArtifactFlow(FlowSpec):
@step
def start(self):
# Step 1: Initializing data
print("Starting the flow!")
self.data = [1, 2, 3, 4, 5] # Example dataset saved as an artifact
self.next(self.process_data)
@step
def process_data(self):
# Step 2: Processing the data from the 'start' step
self.processed_data = [x * 2 for x in self.data] # Processing artifact data
print("Processed data:", self.processed_data)
self.next(self.save_results)
@step
def save_results(self):
# Step 3: Saving the processed data artifact
self.results = sum(self.processed_data) # Saving final result as an artifact
print("Sum of processed data:", self.results)
self.next(self.end)
@step
def end(self):
# Final step
print("Flow is complete!")
print(f"Final result: {self.results}") # Accessing artifact in final step
Vì sao artifact là khái niệm cốt lõi của Metaflow? Bởi chúng có nhiều công dụng:
- Tự động hóa quản lý luồng dữ liệu, loại bỏ nhu cầu tải và lưu dữ liệu thủ công.
- Cho phép tính bền vững (sẽ nói ngay sau), tức cho phép phân tích sau này với Client API, trực quan hóa bằng Cards và tái sử dụng giữa các flow.
- Tính nhất quán giữa môi trường cục bộ và đám mây. Điều này loại bỏ nhu cầu truyền dữ liệu tường minh.
- Cho phép người dùng kiểm tra dữ liệu trước khi có lỗi và tiếp tục thực thi sau khi sửa lỗi.
Quản lý phiên bản và lưu trữ
Metaflow tự động xử lý quản lý phiên bản cho workflow của bạn. Nghĩa là mỗi lần flow được thực thi, nó được theo dõi như một lần chạy (run) riêng biệt. Nói cách khác, mỗi run có phiên bản của riêng nó, cho phép bạn dễ dàng xem lại và tái hiện các lần chạy trước.
Metaflow làm điều này bằng cách gán các định danh duy nhất cho mỗi run và lưu giữ dữ liệu cùng artifact từ lần thực thi đó. Cơ chế lưu trữ này đảm bảo không mất dữ liệu giữa các lần chạy. Workflow trước đây có thể được truy cập và kiểm tra dễ dàng, và các bước cụ thể có thể được chạy lại nếu cần. Nhờ đó, gỡ lỗi và phát triển lặp trở nên hiệu quả hơn nhiều, đồng thời việc duy trì khả năng tái lập được đơn giản hóa.
Ví dụ thực tiễn: Huấn luyện một mô hình Machine Learning
Trong phần này, tôi sẽ hướng dẫn bạn sử dụng Metaflow để huấn luyện một mô hình machine learning. Bạn sẽ học cách:
- Định nghĩa một workflow để tải dữ liệu
- Huấn luyện một mô hình machine learning
- Theo dõi kết quả
Kết thúc phần này, bạn sẽ hiểu rõ hơn cách dùng Metaflow để cấu trúc và chạy workflow machine learning một cách hiệu quả. Bắt đầu thôi!
Để bắt đầu, chúng ta sẽ tạo một flow cơ bản tải một tập dữ liệu, tiến hành huấn luyện và xuất ra kết quả của mô hình.
Lưu ý: Mã có thể được chạy trong DataLab.
from metaflow import FlowSpec, step, Parameter, NBRunner
class TrainModelFlow(FlowSpec):
@step
def start(self):
# Load and split the dataset
print("Loading data...")
self.data = [1, 2, 3, 4, 5] # Replace with actual data loading logic
self.labels = [0, 1, 0, 1, 0] # Replace with labels
self.next(self.train_model)
@step
def train_model(self):
# Training a simple model (e.g., linear regression)
print("Training the model...")
self.model = sum(self.data) / len(self.data) # Replace with actual model training
print(f"Model output: {self.model}")
self.next(self.end)
@step
def end(self):
# Final step
print("Training complete. Model ready for deployment!")f
Trong đoạn mã này, chúng ta định nghĩa ba bước:
start(): Tải và chia tập dữ liệu. Trong thực tế, bạn sẽ tải dữ liệu từ nguồn thực (ví dụ: tệp hoặc cơ sở dữ liệu).train_model(): Mô phỏng việc huấn luyện mô hình. Ở đây sử dụng phép tính trung bình thay cho thuật toán machine learning thực sự, nhưng bạn có thể thay bằng bất kỳ mã huấn luyện nào bạn cần.end(): Đánh dấu kết thúc flow và cho biết mô hình đã sẵn sàng triển khai.
Sau khi bạn định nghĩa flow, có thể chạy bằng lệnh sau:
run = NBRunner(TrainModelFlow)
run.nbrun()
Lưu ý rằng đoạn mã này chỉ hoạt động trong notebook (toàn bộ mã phải nằm trong một ô).
Nếu bạn muốn chạy mã này như một script, hãy bỏ các lệnh NBRunner và thêm phần sau vào cuối script của bạn, rồi lưu lại (ví dụ: “metaflow_ml_model.py”):
if __name__ == "__main__":
TrainModelFlow()
Sau đó, để chạy script, hãy chuyển đến dòng lệnh và chạy lệnh sau:
py -m metaflow_ml_model.py
Metaflow tự động theo dõi mỗi lần chạy và cho phép bạn trực quan hóa kết quả thông qua Metaflow UI.
Thực tiễn tốt nhất khi sử dụng Metaflow
Vậy làm thế nào để tận dụng tối đa các tính năng của Metaflow? Dưới đây là một vài thực tiễn tốt nhất giúp bạn đạt được điều đó đồng thời tối ưu workflow của mình:
Bắt đầu với các flow nhỏ
Nếu bạn mới dùng Metaflow, hãy bắt đầu với các workflow đơn giản để làm quen với API của nó. Khởi đầu nhỏ sẽ giúp bạn hiểu framework hoạt động ra sao và xây dựng sự tự tin trước khi chuyển sang các dự án phức tạp hơn. Cách tiếp cận này giúp giảm đường cong học tập và đảm bảo nền tảng vững chắc.
Tận dụng UI của Metaflow để gỡ lỗi
Metaflow bao gồm một giao diện người dùng mạnh mẽ (user interface) có thể cực kỳ hữu ích để gỡ lỗi và theo dõi workflow của bạn. Hãy dùng UI để giám sát các lần chạy, kiểm tra đầu ra của từng bước và xác định các vấn đề có thể phát sinh. Việc trực quan hóa dữ liệu và log giúp bạn dễ dàng phát hiện và khắc phục sự cố trong quá trình thực thi flow.
Tận dụng AWS để mở rộng
Khi bạn mới cài đặt Metaflow, nó hoạt động ở chế độ cục bộ. Ở chế độ này, artifact và metadata được lưu trong thư mục cục bộ, và việc tính toán được chạy bằng các tiến trình cục bộ. Thiết lập này phù hợp cho nhu cầu cá nhân, nhưng nếu dự án của bạn có yếu tố cộng tác hoặc dữ liệu lớn, nên cấu hình Metaflow để sử dụng AWS nhằm có khả năng mở rộng tốt hơn. Tin tốt là Metaflow cung cấp tích hợp tuyệt vời với AWS.
Kết luận
Trong hướng dẫn này, chúng ta đã khám phá cách bắt đầu với Metaflow, từ cài đặt đến xây dựng workflow khoa học dữ liệu đầu tiên. Chúng ta đã đề cập các khái niệm cốt lõi, như định nghĩa bước, dùng artifact dữ liệu để truyền dữ liệu giữa các bước và quản lý phiên bản để theo dõi và tái hiện các lần chạy. Chúng ta cũng đã đi qua ví dụ thực tiễn về huấn luyện mô hình machine learning, minh họa cách định nghĩa, chạy và giám sát workflow. Cuối cùng, chúng ta đã đề cập một số thực tiễn tốt nhất để giúp bạn tận dụng tối đa Metaflow.
Để tiếp tục học về MLOps, hãy xem các tài nguyên sau:
