中国移动研究院常耀斌:主流人工智能技术栈的深度探讨和实践总结
副标题[/!--empirenews.page--]
导语:这几年人工智能技术之所以能够获得快速发展,主要是有三个元素的融合:神经元网络、芯片以及大数据。人工智能是让机器像人一样思考甚至超越人类,而机器学习是实现人工智能的一种方法,它最基本的做法是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。深度学习又是机器学习的一种实现方式,它是模拟人神经网络的方式,用更多的层数和神经元,给系统输入海量的数据来训练网络。下面我以人工智能在医疗领域的平台架构为例,进行五层模型技术栈的讲解,分别是基础数据层,计算引擎层,分析引擎层,应用引擎层和典型应用层,重点讲解计算和分析引擎。 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. 双级调度系统分析: 调度系统主要由DAGScheduler和TaskScheduler组成,它们都内置在SparkContext中。DAGScheduler负责创建Job、将DAG中的RDD划分到不同的Stage、给Stage创建对应的Task、批量提交Task等功能。TaskScheduler负责按照FIFO或者FAIR等调度算法对批量Task进行调度;为Task分配资源;将Task发送到集群管理器的当前应用的Executor上,由Executor负责执行等工作。即使现在Spark增加了SparkSession和DataFrame等新的API,但这些新API的底层实际依然依赖于SparkContext。 5. 多维计算引擎分析: 计算引擎由内存管理器(MemoryManager)、Tungsten、任务内存管理器(TaskMemory-Manager)、Task、外部排序器(ExternalSorter)、Shuffle管理器(ShuffleManager)等组成。MemoryManager除了对存储体系中的存储内存提供支持和管理外,还为计算引擎中的执行内存提供支持和管理。Tungsten除用于存储外,也可以用于计算或执行。TaskMemoryManager对分配给单个Task的内存资源进行更细粒度的管理和控制。ExternalSorter用于在map端或reduce端对ShuffleMapTask计算得到的中间结果进行排序、聚合等操作。ShuffleManager用于将各个分区对应的ShuffleMapTask产生的中间结果持久化到磁盘,并在reduce端按照分区远程拉取ShuffleMapTask产生的中间结果。 6. 强大的SparkMLlib机器学习库: (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |