ML System 设计全景:推理、训练、数据与部署
最近在看斯坦福的 CS 329S:Machine Learning Systems Design,这门课专门讲 ML 系统的整体设计,涉及面比较广。记录一下课程里让我觉得值得关注的内容。

课程里出现了不少值得关注的关键词:DevOps、CI/CD、A/B test、Flink(流计算)、Microservices(微服务)与 REST APIs、Kubernetes、tinyML(一本基于 TensorFlow Lite 的新书)。整体感觉这门课在工业落地层面覆盖得比较全面。
推理、计算与学习方式
课程前几个 slides 系统梳理了不同的推理、计算和学习方式。
推理方式方面,并非非黑即白,多种方式可以混合使用:


计算方式方面:
| Cloud computing | Edge computing | |
|---|---|---|
| Computations | 在云端(服务器)完成 | 在边缘设备(浏览器、手机、平板、笔记本、智能手表、可穿戴设备、汽车等)上完成 |
| Requirements | 网络连接:数据传输的可用性与速度 | 硬件:内存、算力、做计算所需的能量 |
| Examples | 对 Alexa / Siri / Google Assistant 的大部分查询;稀有语种对的 Google 翻译(如英语-意第绪语) | Alexa / Siri / Google Assistant 的唤醒词;常见语种对的 Google 翻译(如英语-西班牙语);输入法预测;指纹、人脸解锁 |

学习方式方面:
| Offline learning | Online learning | |
|---|---|---|
| Iteration cycle | 周期性(数月) | 持续(数分钟)——注意 ≠ 连续(continuous) |
| Batch size | batch(数千 → 数百万样本);GPT-3 125M 参数:batch size 0.5M;GPT-3 175B 参数:batch size 3.2M | microbatch(数百样本) |
| Data usage | 每个样本被看到多次(epochs) | 每个样本至多被看到一次 |
| Evaluation | 主要离线评估 | 离线评估作 sanity check;主要依赖在线评估(A/B testing) |
| Examples | 大多数应用 | TikTok 推荐系统、Twitter 话题趋势 |
这里有一点值得单独说:在有多个优化目标的时候,课程建议把它们拆成多个模型,每个模型专注于一个指标,这样训练和调参都会更容易。

数据存储与特征管理
这部分讲了两种主要的数据存储方式。
基于行的存储,类似于 numpy 的组织方式,适合频繁 INSERT 的场景:

基于列的存储,类似于 pandas,适合频繁 SELECT 的场景:

两种存储之间可以通过 ELT 进行转换:

此外,课程还提到可以将静态数据与动态数据结合起来做推理:
| Static data | Streaming data |
|---|---|
| CSV、PARQUET 等 | Kafka、Kinesis 等 |
| 有界(bounded):知道一个作业何时结束 | 无界(unbounded):永不结束 |
| 静态特征:年龄、性别、职业、城市、收入;账号创建时间;评分 | 动态特征:最近 10 分钟的位置;近期活动 |
| 可批处理(如 SQL、MapReduce) | 随事件到达逐条处理(如 Apache Flink、Samza) |

第三个 slides 后面还有一些迁移学习相关的内容,暂时跳过了。
采样与类别不平衡处理
第四个 slides 主要讲采样和类别不平衡,讲者看起来是做传统 ML 理论的。解决类别不平衡主要有三种方式:重采样(Resampling)、权重平衡(Weight Balancing)、集成学习(Ensembles)。
重采样分两种:下采样与过采样。

下采样可以使用 Tomek Links 方法(参考:https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets):

过采样可以使用 SMOTE:

权重平衡方面,比较经典的是 Focal Loss:
集成方法是训练多个分类器,再把所有结果做 ensemble:


数据增强方面,2019 年有一篇综述可以参考:https://journalofbigdata.springeropen.com/articles/10.1186/s40537-019-0197-0
slides4 后面的内容主要是特征工程、数据泄露和模型选择,仍然偏传统 ML 风格。slides5 全是 PyTorch,没什么特别的。
并行训练与系统测试
slides6 讲了并行,包括数据并行和模型并行,但不够细节。另外 slides6 和 slides7 的前半部分都花了不少篇幅讲 ML 系统的测试,尤其是数据测试:


实验管理工具
slides7 后半部分重点介绍了两个工具。
第一个是 Weights & Biases(wandb),提供丰富的可视化功能,有点像 NNI。
第二个是 DVC,用起来有点像 git,用 git 的方式来管理训练数据:

DVC 除了管理数据,还可以用来管理实验,类似于 NNI,方便对比不同实验结果;最后它还支持 CI/CD 流程。
模型部署
slides8 主要讲部署,前面涉及模型压缩和 TensorRT 等内容,后面介绍了两种部署方式。
方式一:直接部署在云平台,可以用 GCP(类似于阿里云):

方式二:基于 Docker 容器部署,同样可以放在 GCP,此外还有基于虚拟机和 Kubernetes 的方式。目前用 Docker 容器和用虚拟机的差别其实不太大:

tinyML 之后的 slides 基本都是比较空泛的 ML 工业实践,感觉看下去意义不大,以后有空再看。