前言
这篇博客整理了机器学习系统相关的博客,一方面是为了方便自己和读者查阅文章,另一方面这个手动整理的目录是一个学习路线。如果您对机器学习系统感兴趣,那么希望我的这个导航可以给到您启发。
机器学习系统的上层是应用,贴近用户,直接创造了业务价值。本人大五、大六的方向是自然语言处理,比较遗憾的是没有科研经历,因此在大七即将面临毕业时,希望可以在毕业论文中做一点研究,最终选择的方向是机器翻译。
下层是硬件,贴近开发者。机器学习系统是跟“计算”紧密相关的,需要借助体系结构的知识,达到高性能的计算。上层应用的模型发展和创新,对下层硬件的浮点计算速度、内存带宽产生了越来越高的需求。CPU 的速度已然跟不上,通过 GPU、TPU 等加速硬件可以大规模并行计算加速训练和推理。
大量加速硬件的出现对编译器产生了需求。如果有 N 个应用,M 个硬件,每个应用去对接硬件,那么这将是一个 \(N \times M\) 的问题。借助编译器,可以将这个问题转化为一个 \(N + M\) 的问题。从应用层的表示转换到硬件层的可执行对象,在这中间可以加一层中间表示,将 \(N \times M\) 变成 \(N + M\)。
在上层应用和下层硬件的中间是机器学习系统。一般来说,上层应用提供的表示可以转化为计算图,中间经过“编译”生成一个运行期的计划,这个计划可以在 Runtime 中调度和执行,调度需要考虑为数据分配内存和调用算子。通过优化计算图、Runtime、算子,可以提高整体性能。
此外还要分成训练和推理两个方向来讨论。以神经网络为核心的系统,训练时要同时考虑前向传播和后向传播,而推理时只需要考虑前向传播即可。
神经网络训练,需要理解 BP 算法和自动微分。大模型的出现导致了训练的时长大大增加,也可能一张卡的显存放不下一个模型,单机单卡已经没法满足需求。一般需要考虑如下几个问题:如何利用多机多卡进行分布式训练,数据传输通信的时间开销应该怎么建模,能否自动并行、自动切分模型进行训练?
模型训练后,需要部署上线,提供推理服务。模型训练的框架和部署推理用的框架不一样,需要将训练的模型结构转为推理用的模型结构,可以借助 ONNX 这个中间表示,来将模型进行倒腾转换。在推理框架拿到模型表示之后,推理框架自己想怎么搞就怎么搞。另一方面,推理要考虑到模型的大小,模型训练之前的设计阶段,需要考虑模型的量化怎么做,是在训练中量化还是在训练后量化呢?还可以借助知识蒸馏等技术,大模型训练小模型来进行压缩。拥有了模型推理能力,需要对外提供服务,Triton 在模型服务化方面做了不少工作,前身是 TensorRT 的服务器,可以帮助模型服务化,提供 HTTP/RPC 等服务。Triton 提供了给 kubernetes 使用的一组 API,提供稳定可靠的线上服务,自动拉起服务并监控服务。
应用
语言学知识
(有待补充)
机器翻译 基础
(有待补充)
机器翻译 学术前沿
(有待补充)
机器学习系统
计算图及其优化
(有待补充)
Runtime 的调度和执行
(有待补充)
算子实现和优化
(有待补充)
训练
原理
(有待补充)
分布式训练
(有待补充)
参考资料
机器学习系统的实现和设计:https://openmlsys.github.io/#
推理
模型转换
(有待补充)
模型压缩
(有待补充)
服务端部署
(有待补充)
编译器
TVM
(有待补充)
MLIR
(有待补充)
参考资料
硬件
体系结构基础知识
(有待补充)
CUDA 编程
(有待补充)
CPU 编程优化
(有待补充)
语言
C++
(有待补充)
Python
(有待补充)
CMake
(有待补充)
Shell
(有待补充)
软件工程
设计模式
(有待补充)
标签:训练,补充,导航,模型,博客,硬件,推理,有待 From: https://www.cnblogs.com/zzk0/p/16787330.html