0 并行计算是什么?并行计算框架又是什么
并行计算是一种同时使用多个计算资源(如处理器、计算节点)来执行计算任务的方法。通过将计算任务分解为多个子任务,这些子任务可以同时在不同的计算资源上执行,从而实现加速计算过程并提高计算效率。
并行计算框架是一种软件工具或平台,用于管理和协调并行计算中的任务分发、数据传输、同步与通信等操作。它提供了一套编程模型和接口,以便开发者可以方便地利用并行计算资源来编写并行化的代码。常见的并行计算框架包括MPI(Message Passing Interface)、OpenMP(Open Multi-Processing)、CUDA(Compute Unified Device Architecture)等
1 为什么并行计算框架MPI无法在大数据中入流?
MPI和当时很火的MapReduce是并行计算框架的两个极端,MPI允许进程在任意一个时刻通信,非常灵活,而MapReduce在任何时候都不许通信,mapper worker或者reduce worker是无法通过写程序的方式与其他的同伙worker来通信,所有的数据交换都只是发生在mapper phase和reduce phase之间的shuffle phase的,完全由mapreduce的runtime来操作,对于用户是完全封闭的。
2 算法使用MPI和MapReduce框架来进行并行的区别是什么?
几乎任何算法都可以使用MPI框架来并行,而绝大部分复杂的算法是无法套进MapReduce当中的,这是因为复杂算法要求频繁的数据交换、数据合并、不同性质的计算任务的协调运行,所以对进程通信要求高。
3 一个大的计算任务,大概是启动多少个进程?
1万到10万个进程
4 如果一个计算任务失败了,需要重做哪些操作?
所有的I/O操作、所有的通信操作(与这个进程通信的所有进程都要kill掉,然后重启,由于数据依赖,就会导致所有的进程都要kill再重启)。
5 1万个进程只要运行五分钟,基本上就会有至少一个进程挂掉,为什么会出现挂掉的情况呢?
因为优先级高的进程会直接抢占掉优先级低的进程,把资源给优先级高的先用。个人理解,如果系统资源越丰富,就越不需要这种pre-exmption,挂掉的概率就会降低。并不是因为硬件或者软件的故障造成的,是这种进程管理策略导致的必然结果。
注:一般论文中的所使用的集群都是专门针对那个特定任务的,其中所提出的优化通信的方法:平衡CPU和GPU、平衡内存和CPU、平衡网卡和磁盘等在实际情况中都是不适用的,这是因为在实际的云计算平台中,可能提供给你的机器资源是假的,也就是可能是一些docker container或者virtual machine,因而根本无法控制或者甚至无法得知对应的网卡的状态。
进而,所有基于这些假设的论文都是无法在工业上发挥实际价值的。
6 Scalable的机器学习系统更重要的是数据模型,还是工程技法?
是后者。Good System = Good algorithm + Good Architecture (王益认为这占据了接近90%的重要性)
7 长尾数据在计算机工业上为什么比一般的数据更重要?
长尾数据是指那些在统计分布中位于尾部、出现频率较低的数据。
在计算机工业中,长尾数据比一般的数据更重要的原因有以下几个:
潜在商机: 长尾数据可能包含一些独特的、非传统的需求和市场机会。通过挖掘长尾数据,企业可以发现新的产品、服务和市场细分,从而提供更有针对性的解决方案。
个性化和定制化产品: 长尾数据的出现频率较低意味着个体间存在差异性。通过深入了解长尾数据,企业可以更好地理解不同用户的需求和偏好,从而提供个性化和定制化的产品和服务。
创新和发展: 长尾数据可能包含独特的洞察和研究价值,涉及新的技术、概念或想法。通过研究和分析长尾数据,企业可以获得新的思路和灵感,从而推动创新和发展。
8 分布式操作系统和分布式计算框架有什么区别和联系?有哪些分布式操作系统?有哪些分布式计算框架?
区别:分布式操作系统:主要关注整个分布式系统的资源管理、进程调度和通信等方面,提供了一个统一的操作系 统接口;分布式计算框架则:更注重于分布式计算的任务调度、数据分发和结果整合等方面;
依赖关系:分布式计算框架需要基于分布式操作系统来提供底层的资源管理和调度功能。
操作系统有:
Google的Google File System(GFS)和Google的Bigtable:这两个系统构成了Google的分布式基础架构。
Apache Hadoop和Apache Mesos:这些系统提供了分布式文件系统、资源管理和任务调度等功能。
计算框架有:
Apache Spark:一个快速的通用分布式计算系统,支持内存计算和大规模数据处理。
Apache Hadoop MapReduce:一个基于分布式文件系统的计算模型,适合大规模数据处理。
Apache Flink:一个分布式流处理和批处理计算框架,支持容错和低延迟处理。
9 构建大规模机器学习系统中遇到的Pitfall有哪些?
1)一般所认为的数据噪音就包含了长尾数据,但是长尾数据其实是有很多价值的,去掉之后数据其实失去了完整性和实际性
2)论文中的数据模型基本上是建立在这样的一个数据分布假设上**(指数族分布):高斯钟形分布 和 拉普拉斯分布(双指数分布)**,而没有考虑长尾数据
例子1:SBD(Singular Bounded Decomposition)是一种矩阵分解算法,看上去不涉及概率问题,但是其其实是要求输入数据要满足高斯分布,不然分解结果中的component就是无用且混乱的principal component;
例子2:广告系统的广告点击率模型最常见的是Logistic Regression, 其目标函数是:
将预测出来的概率值和对应的label(0或者1)求距离,距离之和最小为优化的目标;此时频率出现高的数据对该目标优化的方向有着更大的影响,长尾数据对参数的优化影响较小,所以模型没法针对长尾数据进行相应的调整
4)现在很多的并行计算框架比如Spark希望能够保证两边的好处,既能支持各种复杂的算法,也能支持fault recovery,但是其实也同时获得了MPI和MapReduce两边的坏处。
Pregel是一种图计算框架,用于并行处理大规模图数据,它是由Google提出的,用于分布式计算的系统。它处理fault recovery的方法是:每隔一段时间出现一个server process stack,所有进程把这段时间接收到的信息都在磁盘上checkpoint一个版本,这样的话虽然依旧需要重启所有的进程,但是只需要把它们拉回到最近一次的checkpoint就可以了,不用从头完全重启。这是一个很直观的很通用的彻底的方法,但是容易出现out of memory。为什么呢?如果process stack的通信量不是很大,可以把process缓冲到memory里,到时候再check in到磁盘上;但是如果通信量很大,那么这个缓冲区buffer就都会overflow了,也就是out of memory了。所以像pagerank这样通信量小的算法可以用pregel来进行并行,而像RDA这样通信量大的算法就不可以
尽量不要把分布式操作系统和集群管理系统混合在一起,就像hadoop 1.0做的那样。为什么呢?
因为混合使用可能导致功能重叠和管理冲突,进而影响系统的效率和可靠性
谷歌很多的大规模机器学习系统都专门写了一个对应的并行计算框架
8)语言的问题:Java or Python or C++的代码会很长,而分布式系统的bug本身就很难定位,非go写的程序代码更加不好定位错误了
下面这段Go代码的逻辑是:如果有100个机器,可能有5台罢工,剩下的95台机器中任何一个有结果都应该立即返回,确保用户能第一时间收到。
对应的javascript版本的代码是(JS不是一个低端语言,是一个有着c/c++外皮的lisp的实现,lisp是人类历史上描述能力最强的编程语言,是所有语言之母,但是它没有那么强的宏的功能):timeout和rpcResp都是callback,return这个全局变量保证了只有第一个Call的机器才能执行clearTimeout和use这两个操作;setTimeout(timeout, 1)表示在1s后才会执行timeout这个回调函数
10 如何平衡零碎的业务和技术上的大杀器?
软件服务在单机上很好卖,但是在分布式系统上不好卖,因为你需要去部署它,甚至有时候需要针对集群的特点去调试它。
框架很难适应所有的业务场景。
ML as a Platform 自动化平台,不受用户欢迎;ML as service,
11 总结:full stack knowledge