【云驻共创】推荐一些机器学习系统MLSys中的值得研究的方向
MLsys不能算是一种方向,而是一种思路。比如对于system研究者来说,可以把ML作为我们开发的系统要适配的一种benchmark,就像transaction对于数据库、某种文件场景对于File System的意义一样。这样一想可做的空间就宽广多了。
下面简单推荐一些坑比较少得方向,希望大家可以适应这个潮流。
1. 分布式机器学习(Distributed DNN Training)
这个又可以分为两个方面:from ML / system perspective。
ML
从ML的角度做,主要是发明或改进分布式训练算法,保证在分布式加速的同时,仍然能达到原来的学习效果(loss/accuracy)。因此很多工作也被投在像ICML、NIPS这种专业ML会议上。主要用到的方法包括优化(optimization)和统计学习理论(statistical learning theory)。
还有一类工作涉及到如何把单机算法改造成分布式[ch9],比如同步/异步SGD等。这里主要涉及到的问题是如何降低分布式环境下的通信开销,提高加速比。
System
还有一个就是从System的角度做。从分布式计算的角度来看,可以把相关工作分为以下几类:
- 对于计算量太大的场景(计算并行),可以多线程/多节点并行计算,多节点共享公共的存储空间。常用的一个算法就是同步随机梯度下降(synchronous stochastic gradient descent),含义大致相当于K个(K是节点数)mini-batch SGD
- 对于训练数据太多,单机放不下的场景(数据并行,也是最主要的场景),需要将数据划分到多个节点上训练。每个节点先用本地的数据先训练出一个子模型,同时和其他节点保持通信(比如更新参数)以保证最终可以有效整合来自各个节点的训练结果,并得到全局的ML模型。
- 对于模型太大的场景,需要把模型(例如NN中的不同层)划分到不同节点上进行训练。此时不同节点之间可能需要频繁的sync。这个叫做模型并行。
- Pipeline Parallelism:这是去年(SOSP19 PipeDream)才出现的概念。Pipeline Parallelism相当于把数据并行和模型并行结合起来,把数据划分成多个chunk,也把训练模型的过程分成了Forward Pass和Backward Pass两个stage。然后用流水线的思想进行计算。
大致涉及以下几个点:
- 分布式ML系统设计
- Edge Computing
- 大量计算资源的Scheduling / device placement
- communication相关
2. 深度学习模型压缩/加速
对DL model进行压缩主要考虑两个角度:减少计算量(例如conv层的计算量) / 内存占用(NN的参数数量)。不仅要考虑ML上的metric,也要考虑system层面的performance(例如latency / throughput / 功耗。有时候这些比ML模型的accuracy还重要)。
2.1 通过Quantized(量化)降低计算精度要求
量化的含义是将卷积层(the weights and / or activations of a CNN)通常要用到的32位浮点数用更低位的数来表示,如int32, int16, int8等等,来降低资源占用(float32无论是计算还是存储都是很吃资源的..)。量化之后无疑会损失一部分精度,但神经网络对噪声并不是特别敏感,因此控制好量化的程度之后对ML任务的影响可以很小。
2.2 新硬件 / DL Acclerator
在纯硬件方面针对DL workload的工作也有很多,这里来看几个parallel相关的技术。最近Data-Level Parallelism不仅在深度学习中,在其他一些领域(比如数据库)也有了越来越多的应用。
CPU、SIMD、VLIW、GPU、系统结构、专用硬件等。
2.3 矩阵算子优化
神经网络中的很多运算本质上就是对矩阵运算,因此可以用一些矩阵乘法优化方案来加速。
3. 深度学习框架/系统设计
和Distributed Training的区别是这里更关注一些工程上的东西(框架设计、API设计等等)
几个关键要素:
- 支持各种算子(op) 和 tensor (data)
- 计算图的定义方式(动态 v.s. 静态)
- Auto Diff
- Optimizer(例如Adam)
- 各种加速和优化的库:cudnn, openblas,mkl等
4. 用ML优化传统的system问题
用ML去优化一个传统system问题中,一些需要人工经验调整、或者说可以从历史情况learn到一些东西的模块。比如数据库参数、操作系统页表、数据库索引等等。一个模块可以被ML化的前提是它必须是empirical的,参考它在页表(OS的工作集原理)、数据库(DBA是个很吃经验的活...)中的应用。
基本就这4个方向,如果想做这些东西,需要掌握一定基础知识点才能更好的入门及应用。
- 工程基础:C/C++、OO programming。阅读源码是个很好的学习方式
- OS
- 分布式系统
- 编译原理。特别是编译器优化技术、LLVM、memory optimization。Parser之类不喜欢也可以不看
- Computer Architecture。另外还需要了解:1.GPU架构,例如显存分配机制、CPU与GPU交互。 2.CPU、存储系统相关的新技术。 3.有条件可以了解下深度学习专用硬件。
- 常见的并行计算框架,例如MPI/OpenMP/CUDA
- 机器学习基础
- 常见的分布式机器学习算法、DL模型压缩、模型加速方法(根据具体方向而定)
这里需要注意的是,如果想研究的比较有深度,有时间多阅读一下别人的源码,比较有利于个人能力的提升,多动手记的比较牢靠一点。
机器学习是个很大的领域,也是个很成功的领域:从纯学术角度来说,这个领域“坑”大,维度很广,不管是算法、理论,还是模型、系统,有非常多值得探索和研究的问题;从工业应用来说,这个领域相比其他某些领域与工业和实际应用贴的更近,所以这个领域的成果相比其他一些领域也更容易被部署到开发过程和产品中。
机器学习是一个多维度(multi-dimensional)的研究领域,也是一个跨领域(cross-domain)的研究领域,上到理论证明,算法设计,下到模型设计、应用、系统设计和研究。
这种学习如果想出成果,还是离不开老师和同事们的协助,有那种氛围比较容易解决问题,不用自己一个人钻牛角尖,这里有一些名校及比较好的老师推荐一下:
牛X的名校
北美:业界当然是Google Brain和MSR最有影响力。CMU的Catalyst,除了大家比较熟悉的陈天奇(TVM,XGBoost,MXNet),Zhihao Jia的研究也很promising(TASO),另外两位senior的老师都已经很有名了。
1.UTK,Jack Dongarra的ICL。代表作大家耳熟能详,起草了BLAS,LAPACK,open MPI。包括大家今天以dag为基础的tensorflow,其实icl早就有相应的包给大规模hpc系统了(PARSEC,类似还有斯坦福的legion)。这个实验室,发paper一般,学校一般,但是做东西极其底层和硬核,一直是我非常尊敬的实验室之一。
2.Berkeley James Demmel和他在新加坡国大的学生You Yang。James做的比较偏算法一些,最近几年跟尤洋弄大batch分布式机器学习挺火热的。
找到有相近价值观的人共同推动这个领域的发展,因为现在机器学习已经不单单是个算法问题,很多创新横跨算法系统乃至结合硬件设计,那么有不少好工作很容易在各自领域遭遇敌意。比如系统领域喜欢改变领域mindset的相对通用的topic,对于前沿算法带来的新系统设计带着偏见;
查看活动详情:https://bbs.huaweicloud.com/blogs/325315
相关任务详情:任务38推荐机器学习系统MLSys中的研究方向,并说明理由
- 点赞
- 收藏
- 关注作者
评论(0)