跳转到内容

Metaflow — Netflix 给数据科学家的 Python 流水线

待复核

Metaflow 是 Netflix 2019 开源的一套让数据科学家用纯 Python 写 ML 流水线的框架。日常类比:像把”做菜的步骤”写成可执行的菜谱——每一步用一个 @step 装饰器贴个标签,本地厨房先试做一遍,验证味道对了,加一行配置就能把同一份菜谱送到大厨房(GPU 集群)按工业量重做一遍。

由 Netflix ML infra 团队孵化,给内部数千个推荐/内容理解/CDN 优化模型撑底盘,2019 年 12 月开源,Apache 2.0 协议。主语言 Python,靠装饰器把 DAG、资源声明、重试、依赖管理全压在代码里,不需要单独 YAML / JSON 调度文件。

它的差异点:别的工具让你写两份代码——本地一份、云上一份;Metaflow 是同一份代码加参数python flow.py run 本地跑,python flow.py run --with kubernetes 推到 k8s,剩下的事框架都包了:序列化、传 artifact、起 pod、收日志、写元数据。

数据科学家最痛的不是写模型,是”模型写完了怎么上 GPU 集群跑”。一般路径有三条:

  • 学 Airflow → 但 Airflow 是给 data engineer 设计的,不管 artifact 版本,ML 迭代不方便
  • 学 Kubeflow → 要先懂 k8s / Argo / 容器镜像构建,门槛极高
  • 让 ML 工程师代写一份”上线版本” → 本地代码和上线代码两套,很快漂移

Metaflow 的赌注:让数据科学家自己拥有从原型到生产的全流程,但只学 Python 装饰器

它不发明 scheduler,production 部署时翻译成 Argo Workflows 或 AWS Step Functions——借用别人成熟的调度引擎,自己只做”开发体验层”。这个分层选择是 Metaflow 设计哲学的核心。

from metaflow import FlowSpec, step
class MyFlow(FlowSpec):
@step
def start(self):
self.data = [1, 2, 3]
self.next(self.process, foreach="data")
@step
def process(self):
self.result = self.input * 2
self.next(self.join)
@step
def join(self, inputs):
self.results = [i.result for i in inputs]
self.next(self.end)
@step
def end(self):
print(self.results)

特殊节点:每个 flow 必须有 startendself.next(...) 声明下一步,框架自动建 DAG。

self.x = ... 这一行不只是赋值——框架会把 x pickle 后存进 datastore(默认 S3),下一个 step 想要就自动反序列化拿。每次 run 都有 run_id,所有 artifact 永久可追溯。踩坑提醒:x 必须 picklable,存数据库连接 / lock / socket 会炸。

@kubernetes(cpu=4, memory=16000, gpu=1)
@retry(times=3)
@timeout(hours=2)
@conda(libraries={"torch": "2.1.0"})
@step
def train(self):
...

一个 step 可以叠多层装饰器:跑哪、要多少资源、错了怎么办、依赖什么环境。关键观感:infra 配置不离开 Python 文件,IDE 直接补全。

Terminal window
python flow.py run # 本地
python flow.py run --with batch # AWS Batch
python flow.py run --with kubernetes # k8s 集群
python flow.py argo-workflows create # 翻译成 Argo workflow YAML 上线
python flow.py step-functions create # 翻译成 AWS Step Functions 上线

代码不改,只换调用参数。

self.next(self.process, foreach="data")data 列表里每个元素并行起一个 process step。下游用 def join(self, inputs) 收集所有分支结果。这是批量推理的标配——百万样本切 1000 份并行打分。

Terminal window
python flow.py resume --origin-run-id 1234

任何 step 跑挂,artifact 都还在 datastore 里。resume 从挂掉那一步直接接着跑,不用从头重来。

class TrainFlow(FlowSpec):
@step
def start(self):
self.data = load_data()
self.next(self.train)
@kubernetes(gpu=1)
@step
def train(self):
self.model = fit(self.data)
self.next(self.end)
@step
def end(self):
print(f"acc={self.model.score}")

逐部分start 把数据挂到 self(自动进 datastore);train@kubernetes(gpu=1) 声明要 GPU;end 读回 self.model。本地 python train_flow.py run;上云只改调用:python train_flow.py run --with kubernetes

from metaflow import Flow
run = Flow("TrainFlow").latest_successful_run
print(run.data.model.score)

逐部分Flow("TrainFlow") 按名字打开流水线;latest_successful_run 取最近成功 run;run.data.model 反序列化当时存下的 artifact。可在任意脚本里做模型对比或报告,不必重跑。

Terminal window
python train_flow.py resume --origin-run-id 1234

逐部分:① 原 run 1234 的已完成 step 产物仍在 datastore;② resume 从失败 step 接着跑,跳过已成功节点;③ 新 run 仍有自己的 run_id,可追溯。适合训练中途 OOM / 节点被杀后接着干。

定位对比(一句话):相对 Airflow / Kubeflow,Metaflow 是 ML 开发体验层——artifact 自动版本、本地到云同一份代码;production scheduler 仍借 Argo / Step Functions。

  1. AWS 历史包袱:早期文档默认 S3 + Batch,k8s 后加且文档一度滞后
  2. artifact 必须 picklable:自定义类 __reduce__ 不当会爆;大模型权重易撑爆 datastore
  3. production scheduler 是借的:Argo / Step Functions 各有 quirks,复杂触发要看底层
  4. 多 flow 弱治理:A→B 没有原生 asset graph,大型团队不如 Dagster 清晰
  5. @conda 启动慢:每 step 冷启可达分钟级;用 docker 镜像缓存缓解

适用:主力是数据科学家;原型→训练→批量推理要同一份代码;已有 AWS/k8s,想加一层友好抽象;foreach 扇出批量任务。

不适用:纯 ETL(Airflow / Dagster);复杂事件触发 / SLA(Airflow 更全);极小脚本(裸 .py 够了);要一站式 serving(Kubeflow / SageMaker)。

  • 2017:Netflix 内部启动 Metaflow
  • 2019.12:开源 + Tech Blog,明确 human-centric ML 定位
  • 2021@kubernetes 加入,脱离 AWS-only
  • 2022:Outerbounds 成立(Ville Tuulos 等),做托管与企业支持
  • 2023+@parallel 成熟;与 Dagster / Prefect 同属 data-scientist-friendly 阵营
  1. 装饰器是好抽象:infra 与业务同文件,比 YAML 体验好
  2. 不重复造 scheduler:生产调度让给 Argo / SFN,自己专注开发体验
  3. artifact 自动持久化是 resume / debug / 回看的基石
  4. 本地到云零迁移靠同一份代码 + 不同 backend
  • airflow —— 不直接竞争;借 Argo 变体做 production scheduler
  • clearml —— ClearML 偏 tracking,Metaflow 偏 orchestration
  • dagster —— 都强调开发体验;Dagster 偏数据工程,Metaflow 偏 ML
  • pytorch —— 训练 step 最常托管的框架
  • kubernetes —— @kubernetes / Argo 落地的宿主

(暂无反向链接)