ML System 设计全景:推理、训练、数据与部署
最近在看斯坦福的 CS 329S:Machine Learning Systems Design,这门课专门讲 ML 系统的整体设计,涉及面比较广。记录一下课程里让我觉得值得关注的内容。
课程里出现了不少值得关注的关键词:DevOps、CI/CD、A/B test、Flink(流计算)、Microservices(微服务)与 REST APIs、Kubernetes、tinyML(一本基于 TensorFlow Lite 的新书)。整体感觉这门课在工业落地层面覆盖得比较全面。
推理、计算与学习方式
课程前几个 slides 系统梳理了不同的推理、计算和学习方式。
推理方式方面,并非非黑即白,多种方式可以混合使用:
计算方式方面:
学习方式方面:
这里有一点值得单独说:在有多个优化目标的时候,课程建议把它们拆成多个模型,每个模型专注于一个指标,这样训练和调参都会更容易。
数据存储与特征管理
这部分讲了两种主要的数据存储方式。
基于行的存储,类似于 numpy 的组织方式,适合频繁 INSERT 的场景:
基于列的存储,类似于 pandas,适合频繁 SELECT 的场景:
两种存储之间可以通过 ELT 进行转换:
此外,课程还提到可以将静态数据与动态数据结合起来做推理:
第三个 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 工业实践,感觉看下去意义不大,以后有空再看。