跳转至

第18章 §03 · 大规模基础设施 · 讲解稿

承接: Ch18 §02 云 → §03 基础设施 篇幅: ~4000 字


一 · 一句话总览

基础设施 = Kubernetes + Ray + Spark + 特征库。从单机训练到千卡 GPU 集群, 从离线数据到在线特征, 是 ML 系统工程师的"必修课"。


二 · Kubernetes

2.1 核心概念

  • Pod: 1+ 容器, 共享网络 + 存储
  • Deployment: Pod 的声明式管理
  • Service: 负载均衡 + 服务发现
  • StatefulSet: 有状态应用
  • ConfigMap / Secret: 配置 / 密钥

2.2 K8s 用于 ML

  • 训练 Job: kubectl create job
  • 推理 Deployment: HPA 自动扩缩
  • GPU 调度: nvidia.com/gpu 资源
  • 节点池: GPU / CPU 混合
  • Operator: Kubeflow / Volcano / Ray

2.3 Kubeflow

Kubeflow = K8s 上的 ML 平台: - Pipelines: 工作流 (DAG) - Training Operator: TF / PyTorch / XGBoost - KServe: 模型服务 - Notebooks: Jupyter - AutoML: Katib


三 · Ray

3.1 Ray 是什么

Ray = 分布式 Python 框架 (UC Berkeley 2017): - Task: 无状态函数 - Actor: 有状态对象 - Object: 不可变数据

3.2 Ray 生态

  • Ray Train: 分布式训练 (PyTorch / TF / HuggingFace)
  • Ray Serve: 在线服务
  • Ray Data: 数据处理
  • Ray Tune: 超参搜索
  • Ray RLlib: 强化学习

3.3 Ray 示例

import ray
import ray.train as train

@ray.remote(num_gpus=1)
class Trainer:
    def __init__(self):
        self.model = create_model()

    def train_step(self, batch):
        loss = self.model(batch)
        loss.backward()
        return loss.item()

# 启动 8 个 trainer
trainers = [Trainer.remote() for _ in range(8)]
losses = ray.get([t.train_step.remote(batch) for t in trainers])

3.4 Ray vs K8s

维度 Ray K8s
抽象 Python 函数 容器
粒度 任务 Pod
调度 Ray Scheduler K8s Scheduler
适用 AI / ML 通用
集成 Ray on K8s K8s + Ray

4.1 Spark

Spark = 大数据处理 (UC Berkeley 2014): - RDD / DataFrame / Dataset - Spark MLlib: ML 算法 - Structured Streaming: 流处理 - Spark on K8s: Operator

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("ML").getOrCreate()

# 读取 S3 数据
df = spark.read.parquet("s3://bucket/data/")
# 特征工程
df = df.withColumn("log_amount", log(df.amount))
# Spark MLlib
from pyspark.ml.classification import LogisticRegression
model = LogisticRegression().fit(df)

Flink = 真正的流处理: - 低延迟 (毫秒) - Exactly-once 语义 - 状态管理

Flink 用于 ML: - 实时特征工程 - 在线学习 (Online Learning) - 异常检测


五 · 特征库 (Feature Store)

5.1 为什么需要特征库

  • 离线-在线一致性: 训练用历史快照, 推理用实时特征 → 不一致
  • 特征复用: 团队共享
  • 版本管理: 特征变化可追溯
  • 监控: 特征分布漂移

5.2 主流特征库

工具 厂商 特点
Feast Linux Foundation 开源 + 云中立
Tecton Tecton 商业 + 企业级
Hopsworks Hopsworks 开源 + 完整
Databricks Feature Store Databricks 与 Delta Lake 集成
Amazon SageMaker Feature Store AWS 与 SageMaker 集成

5.3 Feast 示例

from feast import FeatureStore

fs = FeatureStore(repo_path=".")

# 训练: 离线特征
training_df = fs.get_historical_features(
    entity_df=entity_df,
    features=["driver_stats:conv_rate", "driver_stats:acc_rate"],
).to_df()

# 推理: 在线特征
features = fs.get_online_features(
    features=["driver_stats:conv_rate", "driver_stats:acc_rate"],
    entity_rows=[{"driver_id": 1234}],
).to_dict()

六 · 数据湖 / Lakehouse

6.1 数据湖 vs 数据仓库

维度 数据湖 数据仓库
存储 原始 (任何格式) 结构化
Schema 读时模式 写时模式
成本 低 (S3) 高 (专用)
适用 ML / 探索 BI / 报表

6.2 Lakehouse

Lakehouse = 数据湖 + 数据仓库: - Delta Lake (Databricks) - Apache Iceberg - Apache Hudi

特性: 事务 + Schema 演进 + Time Travel + 开放格式


七 · 工作流编排

7.1 主流工具

工具 厂商 特色
Airflow Apache Pythonic DAG, 老牌
Prefect Prefect 现代 Python
Dagster Dagster 资产为中心
Metaflow Netflix ML 友好
Kubeflow Pipelines Google K8s 原生
Flyte Lyft 类型安全

7.2 Airflow 示例

from airflow import DAG
from airflow.operators.python import PythonOperator

def extract():
    # 拉数据
    pass

def transform():
    # 处理
    pass

def train():
    # 训练
    pass

with DAG("ml_pipeline", schedule="@daily") as dag:
    t1 = PythonOperator(task_id="extract", python_callable=extract)
    t2 = PythonOperator(task_id="transform", python_callable=transform)
    t3 = PythonOperator(task_id="train", python_callable=train)
    t1 >> t2 >> t3

八 · 一句话总结

大规模基础设施 = K8s 编排 + Ray 分布式 + Spark 数据 + Feast 特征。5 大组件覆盖 ML 全生命周期。Lakehouse + Feature Store + K8s Operator = 现代 ML 平台。