中国移动研究院常耀斌:主流人工智能技术栈的深度探讨和实践总结
作者:网友投稿 时间:2019-04-25 01:16
导语:这几年人工智能技术之所以能够获得快速发展,主要是有三个元素的融合:神经元网络、芯片以及大数据。人工智能是让机器像人一样思考甚至超越人类,而机器学习是实现人工智能的一种方法,它最基本的做法是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。深度学习又是机器学习的一种实现方式,它是模拟人神经网络的方式,用更多的层数和神经元,给系统输入海量的数据来训练网络。下面我以人工智能在医疗领域的平台架构为例,进行五层模型技术栈的讲解,分别是基础数据层,计算引擎层,分析引擎层,应用引擎层和典型应用层,重点讲解计算和分析引擎。

01
首先,探讨一下人工智能平台的计算引擎,目前最主流的五个大数据分布式计算框架包括Hadoop,Spark,Flink,Storm,Samaza。下面分别探讨其优势和应用场景。
1. Hadoop是首个被商用的框架,在工业和产品界被广泛认可。如果数据可以批量处理,可以被分割成小的处理任务,分发到计算集群,然后综合计算结果,并且整个过程都是逻辑清晰,那么这个场景下很适合用Hadoop处理。
2. Spark是采用更先进的架构,其灵活性、易用性、性能等方面都比Hadoop更有优势,有取代Hadoop的趋势,但其稳定性需要大幅提高。
3. Flink既是批处理又是实时处理框架,但流处理还是放在第一位的,Flink提供了一系列API,包括针对Java和Scala的流API,针对Java,Scala,Python的静态数据API,以及在Java和Scala中嵌入SQL查询的代码。它也自带机器学习和图像处理包。
4. Storm是占领一定市场份额的分布式计算框架,其应用被设计成有向无环图。被设计成容易处理无限流,并且可用于任何编程语言。每个节点每秒处理上百万个元组,高度可伸缩,提供任务处理保证。用Clojure写的。可用于实时分析,分布式机器学习,以及大量别的情形,特别是数据流大的。Storm可以运行在YARN上,集成到Hadoop生态系统中。
5. Samza是由LinkedIn开源的一个分布式流处理框架,它是基于Kafka消息队列来实现类实时的流式数据处理的,非常像Twitter的流处理系统Storm。不同的是Samza基于Hadoop,而且使用了LinkedIn的Kafka分布式消息系统,并使用资源管理器Apache Hadoop YARN实现容错处理、处理器隔离、安全性和资源管理。
02
Spark是专为大规模数据处理而设计的快速通用的计算引擎,目前已经发行了2.4版本。Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,几乎拥有Hadoop MapReduce所具有的优点,借助内存分布数据集,除了能够提供交互式查询外,还可以优化迭代工作负载。Spark今年发布的2.4,除了持续提升Spark的稳定性、易用性和性能之外,还扩展了Spark的生态圈,引入了Spark on K8s, 让用户多了一种部署Spark的方式,还引入了Pandas UDF,可以让用户在Spark上直接运行Pandas函数。我们分析其内核运行架构如下:
1. SparkContext引擎构建分析:
通常而言,用户开发的Spark应用程序的提交与执行都离不开SparkContex的支持。在正式提交应用程序之前,首先需要初始化SparkContext。SparkContext隐藏了网络通信、分布式部署、消息通信、存储体系、计算引擎、度量系统、文件服务、Web UI等内容,应用程序开发者只需要使用SparkContext提供的API完成功能开发。
2. SparkEnv环境构建分析:
Spark执行环境SparkEnv是Spark中的Task运行所必需的组件。SparkEnv内部封装了RPC环境(RpcEnv)、序列化管理器、广播管理器(BroadcastManager)、map任务输出跟踪器(MapOutputTracker)、存储体系、度量系统(MetricsSystem)、输出提交协调器(OutputCommitCoordinator)等Task运行所需的各种组件。
3. 可交换的存储体系分析:
Spark优先考虑使用各节点的内存作为存储,当内存不足时才会考虑使用磁盘,这极大地减少了磁盘I/O,提升了任务执行的效率,使得Spark适用于实时计算、迭代计算、流式计算等场景。在实际场景中,有些Task是存储密集型的,有些则是计算密集型的,所以有时候会造成存储空间很空闲,而计算空间的资源又很紧张。Spark的内存存储空间与执行存储空间之间的边界可以是“软”边界,因此资源紧张的一方可以借用另一方的空间,这既可以有效利用资源,又可以提高Task的执行效率。此外,Spark的内存空间还提供了Tungsten的实现,直接操作操作系统的内存。由于Tungsten省去了在堆内分配Java对象,因此能更加有效地利用系统的内存资源,并且因为直接操作系统内存,空间的分配和释放也更迅速。
4. 双级调度系统分析:



