第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 |
四 · Spark / Flink¶
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)
4.2 Flink¶
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 | 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 平台。